#ifndef MAINWINDOW_H
#define MAINWINDOW_H

class QgsScaleComboBox;


#include <QMainWindow>
#include <QVBoxLayout>
#include <qgsmapcanvas.h>
#include <map>
#include <qgssymbol.h>
#include <QListWidgetItem>

//QGis Includes
#include <qgsmapcanvas.h>
#include <qgsmaptool.h>


//QT Includes
#include <QtGui>

#include <QAction>


#include "qgspallabeling.h"  // from qgslabelinggui.h
#include "ui_mainwindow.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow  //, private Ui::MainWindow
{
    Q_OBJECT
protected:
    std::map<QString, int> mFieldMap;
    std::map<QString, QgsSymbol*> mEntries;
    QMap<QString, QgsSymbol*> mValues;


    // fill combobox with label field
    void populateFieldNames();

    /**Gets the color value along a specified ramp**/
    QColor getColorFromRamp( QString ramp, int step, int totalSteps );

    /**Calculates quantiles from mVectorLayer.
    @return 0 in case of success*/
    // int quantilesFromVectorLayer( std::list<double>& result, int attributeIndex, int numQuantiles ) const;

    /**A function that calculates the values of the quantiles
    @param result the list where the function inserts the result values
    @param values a _sorted_ vector of variable values
    @param numQuantiles the number of quantiles, e.g. 4 calculates the quantiles for 25%, 50%, 75%, 100%
    @return 0 in case of success*/
    // int calculateQuantiles( std::list<double>& result, const std::vector<double>& values, int numQuantiles ) const;

public:
    QgsVectorLayer *mLayer;
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    //! Map canvas // from qgisapp.h
    //QgsMapCanvas *mMapCanvas;
    //! Widget that will live in the statusbar to display and edit coords
    QLineEdit * mCoordsEdit;

    QgsPalLabeling* mLBL;

    void createCanvasTools();

    void addStatistics(QString NameAttribute);

public slots:

    // Change
    void userScale();
    void showScale();

private slots:

    void zoomFull();
    void zoomInMode();
    void zoomOutMode();
    void panMode();
    void addShapefile();
    void choroplethSettings();
    void choroplethSet_ForEditable();
    void CreateRender();

    void on_cboColumn_currentIndexChanged();
    void on_spinBoxNumberOfClasses_valueChanged(int arg1);
    void on_ApplyPushButton_clicked();
    void on_chkEnableLabeling_clicked();
    void on_cboFieldName_activated(int index);
    void on_comboBoxColor_activated(const QString &arg1);
    void on_checkBoxInverseColor_clicked();
    void on_tableWidgetValues_itemClicked(QTableWidgetItem *item);
    void on_cboMode_activated(int index);

    QPair<QString, QString> getSaveAsImageName( QWidget *theParent, QString theMessage );
    QString createFileFilter_( QString const &longName, QString const &glob );
    void saveMapAsImage();

     void CloseApp();


    void on_tableWidgetValues_itemChanged(QTableWidgetItem *item);

    void on_mActionAbout_triggered();

    void on_actionHelp_triggered();

private:
    Ui::MainWindow *ui;


    QString caption;
    void updateEntryIcon( QgsSymbol * thepSymbol, QTableWidgetItem * thepItem );
    int addNumericFields();


    QString mOldClassificationAttribute;

    QgsMapCanvas * mMapCanvas;
    QVBoxLayout  * mLayout;
    QToolBar * mMapToolBar;
    QToolBar * mScaleToolBar;
    QgsMapTool * mPanTool;
    QgsMapTool * mZoomInTool;
    QgsMapTool * mZoomOutTool;
    QgsMapTool * mZoomFullTool;
    QValidator * mScaleEditValidator;
    QComboBox * ScaleComboBox;

    QAction *mActionWindowZoom;

    QLabel * mScaleLabel;
    QgsScaleComboBox * mScaleEdit;
    QString mOldScale;
    double mScale;

    // QgsTileScaleWidget * mpTileScaleWidget;

};

#endif // MAINWINDOW_H
