/**
 *  wWidgets - Lightweight UI Toolkit.
 *  Copyright (C) 2009-2011 Evgeny Andreeshchev <eugene.andreeshchev@gmail.com>
 *                          Alexander Kotliar <alexander.kotliar@gmail.com>
 * 
 *  This code is distributed under the MIT License:
 *                          http://www.opensource.org/licenses/MIT
 */
#ifndef CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYIARCHIVE_H
#define CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYIARCHIVE_H
#pragma once


#include "Serialization/IArchive.h"

namespace Serialization{
    class CEnumDescription;
    class Object;
}

class PropertyRow;
class PropertyTreeModel;

class PropertyIArchive : public Serialization::IArchive{
public:
    PropertyIArchive(PropertyTreeModel* model, PropertyRow* root);

protected:
    bool operator()(Serialization::IString& value, const char* name, const char* label);
    bool operator()(Serialization::IWString& value, const char* name, const char* label);
    bool operator()(bool& value, const char* name, const char* label);
    bool operator()(char& value, const char* name, const char* label);

	// Signed types
	bool operator()(int8& value, const char* name, const char* label);
	bool operator()(int16& value, const char* name, const char* label);
	bool operator()(int32& value, const char* name, const char* label);
	bool operator()(int64& value, const char* name, const char* label);
    // Unsigned types
	bool operator()(uint8& value, const char* name, const char* label);
	bool operator()(uint16& value, const char* name, const char* label);
	bool operator()(uint32& value, const char* name, const char* label);
	bool operator()(uint64& value, const char* name, const char* label);

    bool operator()(float& value, const char* name, const char* label);
    bool operator()(double& value, const char* name, const char* label);

    bool operator()(const Serialization::SStruct& ser, const char* name, const char* label);
    bool operator()(Serialization::IPointer& ser, const char* name, const char* label);
    bool operator()(Serialization::IContainer& ser, const char* name, const char* label);
    bool operator()(Serialization::Object& obj, const char* name, const char* label);
    bool operator()(Serialization::ICallback& callback, const char* name, const char* label);
    using Serialization::IArchive::operator();

    bool OpenBlock(const char* name, const char* label);
    void CloseBlock();

protected:
    bool needDefaultArchive(const char* baseName) const { return false; }
private:
    bool openRow(const char* name, const char* label, const char* typeName);
    void closeRow(const char* name);

    struct Level {
        int rowIndex;
        Level() : rowIndex(0) {}
    };

    vector<Level> stack_;

    PropertyTreeModel* model_;
    PropertyRow* currentNode_;
    PropertyRow* lastNode_;
    PropertyRow* root_;
};


#endif // CRYINCLUDE_EDITORCOMMON_QPROPERTYTREE_PROPERTYIARCHIVE_H