Revision 1 (by moose, 2006/03/06 10:35:57) Initial Import
#ifndef SciQWorkspace_H_GUARD
#define SciQWorkspace_H_GUARD

#include <QDateTime>
#include <QFileInfo>
#include <QString>
#include <QIcon>
#include <QDir>

#include <qextscintilla.h>

class SciQWorkspaceItem;
class SciQWorkspaceDirItem;
class SciQWorkspaceFileItem;
class SciQWorkspace;

/**
Ok, can't do the "No File Item" idea, need to store the items for the scintilla doc struct,
and because you dont want it disappearing/changing automatically when you modify it on disk...

I had thought it'd be cool to base the File items on the contents of a filtered QDir()..

What can be done is auto importing (based on dir's atime/mtime) files found based on the setup filetypes, but if they are deleted or modified
externally to the editor, a dialog should be popped up asking what to do.
*/

// FIXME: Add Rrevision Controll support ie: CVS, SVN, etc.



// TODO: Really Implement SciQDocumentType
class SciQDocumentType { public: QIcon icon() { return QIcon(); } };



typedef class QHash<QString, SciQWorkspaceItem *> SciQWorkspaceItemHash;
typedef class QList<SciQWorkspaceItem *> SciQWorkspaceItemList;

class SciQDocument {
	QextScintilla *sci;
	long scidoc;

	public:
		SciQDocument(QextScintilla *sci = 0);
		~SciQDocument();

		SciQDocument &operator=(SciQDocument &);
		bool operator==(SciQDocument &);
};

class SciQWorkspaceItem {
	friend class SciQWorkspaceModel;
	friend class SciQWorkspaceDirItem;
	friend class SciQWorkspaceFileItem;
	friend class SciQWorkspace;
	protected:
		// New items get marked "not new" on access/load
		// modified files get unmarked on save, folders dont have a "modified" state in the gui.
		enum Flag { Modified = 1, New = 2 };

		QString name;
		QString path;
		QString icon;

		QFileInfo info;
		QDateTime lastmod;

		Q_DECLARE_FLAGS(Flags, Flag)
		Flags flags;

		SciQWorkspaceItem *parent;
		SciQWorkspace *ws;

		enum Type { None, Workspace, Dir, File } type;

		virtual void update() { info.refresh(); QDateTime mtime = info.lastModified(); if(mtime != lastmod) { flags |= Modified; } else { lastmod = mtime; flags &= ~Modified; } }

	public:
		SciQWorkspaceItem(Type t, QString n, SciQWorkspaceItem *p = 0, SciQWorkspace *w = 0);
		virtual ~SciQWorkspaceItem();

		QString getPath();
		QString getName() { /*QFileInfo fi(name); return fi.fileName();*/ return name; }

		SciQWorkspace         *asWorkspace();
		SciQWorkspaceFileItem *asFileItem();
		SciQWorkspaceDirItem  *asDirItem();

		SciQWorkspaceItem *getParent()    { return parent; }
		SciQWorkspace     *getWorkspace() { return ws;     }

		QDateTime getLastMod() { return lastmod; }

		virtual int childCount() { return 0; }
		virtual SciQWorkspaceItem *child(int i) { return 0; }

		virtual SciQWorkspaceItem *addChild(QString /*name*/, QString /*icon*/) { return 0; }
		virtual SciQWorkspaceItemList childList(Flags) { return SciQWorkspaceItemList(); }

		virtual int row();

		virtual QIcon getIcon();

		virtual void activate() { flags &= ~Modified; }

		bool flag(Flags f) { return flags & f; }

		void setModified(bool m) { if(m) flags |= Modified; else flags &= ~Modified; }
		void setNew(bool m) { if(m) flags |= New; else flags &= ~New; }
};

Q_DECLARE_OPERATORS_FOR_FLAGS(SciQWorkspaceItem::Flags)

class SciQWorkspaceDirItem : public SciQWorkspaceItem {
	friend class SciQWorkspaceModel;
	friend class SciQWorkspaceItem;
	protected:
		QDir dir;
		SciQWorkspaceItemList list;

		virtual void update();
		bool populated;
		virtual void populate();

	public:
		SciQWorkspaceDirItem(QString n, SciQWorkspaceItem *p = 0, SciQWorkspace *w = 0);
		~SciQWorkspaceDirItem();

		virtual int childCount();
		virtual SciQWorkspaceItem *child(int i);
		virtual SciQWorkspaceItem *addChild(QString /*name*/, QString /*icon*/);
		virtual SciQWorkspaceItemList childList(Flags);
		virtual QIcon getIcon();
};

class SciQWorkspaceFileItem : public SciQWorkspaceItem {

	protected:
		QextScintillaDocument scidoc;
		SciQDocumentType *docType;

		virtual void update();

	public:
		SciQWorkspaceFileItem(QString n, SciQWorkspaceItem *p = 0, SciQWorkspace *w = 0);
		~SciQWorkspaceFileItem();

		virtual QextScintillaDocument &sciDoc() { return scidoc; }
		virtual void setDoc(QextScintillaDocument s) { scidoc = s; }
		virtual QIcon getIcon();
};

class SciQWorkspace : public SciQWorkspaceDirItem {

	public:
		SciQWorkspace(QString n);
		~SciQWorkspace();

		virtual QIcon getIcon();

};

#endif /* SciQWorkspace_H_GUARD */