/***************************************************************************
 *   Copyright (C) 2003-2005 by David Saxton                               *
 *   david@bluehaze.org                                                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 ***************************************************************************/

#ifndef FLOWCODEDOCUMENT_H
#define FLOWCODEDOCUMENT_H

#include "flowicndocument.h"

#include <QPointer>

class KTechlab;
class FlowCode;
class MicroInfo;
class PicItem;
class FlowPart;
class MicroSettings;
class TextDocument;
class QString;

typedef QList<FlowPart *> FlowPartList;
typedef QMap<QString, int> StringIntMap;

/**
@short View for editing FlowCode
@author David Saxton
*/
class FlowCodeDocument : public FlowICNDocument
{
    Q_OBJECT
public:
    FlowCodeDocument(const QString &caption);
    ~FlowCodeDocument() override;

    View *createView(ViewContainer *viewContainer, uint viewAreaId) override;

    /**
     * Returns a pointer used for the MicroSettings in this FlowCode document
     */
    MicroSettings *microSettings() const
    {
        return m_microSettings;
    }
    /**
     * Sets the type of PIC to be used. FlowCodeDocument se
    virtual void convertToMicrobe();ts the internal MicroInfo pointer to that
     * returned by MicroLibrary for the given id. The pic type must be set before anything useful
     * (such as compilage) can be done.
     */
    void setPicType(const QString &id);

    enum ConvertToTarget { MicrobeOutput, AssemblyOutput, HexOutput, PICOutput };

    // TODO clean up this preprocessor jewel :P
#define protected public
signals:
    void picTypeChanged();
#undef protected

signals:
    void pinMappingsChangedFlowCode();

public slots:
    /**
     * @param target as ConvertToTarget
     */
    void slotConvertTo(QAction *action);
    void convertToMicrobe() override;
    void convertToAssembly() override;
    void convertToHex() override;
    void convertToPIC() override;
    /**
     * Called when a variable name has changed (from an entry box)
     */
    void varNameChanged(const QString &newValue, const QString &oldValue);

protected:
    bool isValidItem(Item *item) override;
    bool isValidItem(const QString &itemId) override;

private slots:
    void setLastTextOutputTarget(TextDocument *target);

private:
    QPointer<TextDocument> m_pLastTextOutputTarget;
    MicroInfo *m_microInfo;         // Stores information about the PIC
    MicroSettings *m_microSettings; // Stores initial settings of the PIC
    PicItem *m_picItem;             // Allows the user to change the PIC settings
    StringIntMap m_varNames;
};

#endif
