/*
    QAD - Qt ADvanced

    Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef QVARIANTEDIT_H
#define QVARIANTEDIT_H

#include "clineedit.h"
#include "colorbutton.h"
#include "ecombobox.h"
#include "evalspinbox.h"
#include "qad_types.h"
#include "qad_widgets_export.h"
#include "qpointedit.h"
#include "qrectedit.h"
#include "qvariantedit_custom.h"

#include <QCheckBox>
#include <QDoubleSpinBox>
#include <QPushButton>


class QAD_WIDGETS_EXPORT StringListEdit: public QWidget {
	Q_OBJECT

public:
	StringListEdit(QWidget * parent = 0);

	QStringList value() const;

private:
	virtual void changeEvent(QEvent * e);

	QBoxLayout * lay;
	EComboBox * combo;
	QPushButton *butt_apply, *butt_add, *butt_del, *butt_clear;

public slots:
	void setValue(const QStringList & v);

private slots:
	void editItem();
	void addItem();
	void delItem();
	void clear();

signals:
	void valueChanged();
};


class QAD_WIDGETS_EXPORT PathEdit: public QWidget {
	Q_OBJECT

public:
	PathEdit(QWidget * parent = 0);
	~PathEdit() {
		delete line;
		delete butt_select;
	}

	QString value() const { return line->text(); }

	bool is_dir, is_abs, is_save;
	QString filter;

private:
	virtual void changeEvent(QEvent * e);
	virtual void resizeEvent(QResizeEvent *);

	QBoxLayout lay;
	CLineEdit * line;
	QPushButton * butt_select;

public slots:
	void setValue(const QString & v);

private slots:
	void select();

signals:
	void valueChanged();
};


class QAD_WIDGETS_EXPORT QVariantEdit: public QWidget {
	Q_OBJECT
	Q_PROPERTY(QVariant value READ value WRITE setValue)

public:
	explicit QVariantEdit(QWidget * parent = 0);
	~QVariantEdit();

	QVariant value() const;
	// QSize sizeHint() const {if (_cur_edit) return _cur_edit->sizeHint(); return QWidget::sizeHint();}
	// QSize minimumSizeHint() const {if (_cur_edit) return _cur_edit->minimumSizeHint(); return QWidget::minimumSizeHint();}

protected:
	virtual void resizeEvent(QResizeEvent *);
	void _recreate(const QVariant & new_value);
	void _delete();
	void _resize();
	void _newPath();
	void _setEnum(const QAD::Enum & v);
	void _setFile(const QAD::File & v);
	void _setDir(const QAD::Dir & v);
	void _setCustom(const QVariant & v);


	QLabel * _empty;
	CLineEdit * _line;
	QCheckBox * _check;
	ColorButton * _color;
	StringListEdit * _list;
	QDateTimeEdit * _date;
	QDoubleSpinBox * _spin;
	EvalSpinBox * _espin;
	QRectEdit * _rect;
	QPointEdit * _point;
	PathEdit * _path;
	EComboBox * _enum;
	QWidget *_custom, *_cur_edit;
	QVariant _value;

private slots:
	void _changed();

public slots:
	void setValue(const QVariant & v);

signals:
	void valueChanged(QVariant);
};

#endif // QVARIANTEDIT_H
