Revision 1 (by moose, 2006/03/06 10:35:57) Initial Import
#include "SciQWorkspace.h"
#include <qdebug.h>
#include "SciQApp.h"
#include "SciQUtil.h"

SciQWorkspaceDirItem::SciQWorkspaceDirItem(QString n, SciQWorkspaceItem *p, SciQWorkspace *w) :
SciQWorkspaceItem(SciQWorkspaceItem::Dir, n, p, w), populated(false)
{
	dir = QDir(getPath());
}

SciQWorkspaceDirItem::~SciQWorkspaceDirItem()
{
	for(int i = 0; i < list.count(); ++i)
		delete list[i];
}

// protected:

void SciQWorkspaceDirItem::populate()
{
	if(populated)
		return;

	dir.refresh();

	QFileInfoList fil = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden, QDir::DirsFirst | QDir::Type);
	for(int i = 0; i < fil.count(); ++i) {
		QString cur_name = fil[i].fileName();
		if(cur_name == "." || cur_name == "..")
			continue;

		SciQWorkspaceItem *item = addChild(cur_name, "");
		(void)item;

		//SciQMWBase *mw = (SciQMWBase *)
		//qDebug() << __PRETTY_FUNCTION__ << " :: " << fil[i].absoluteFilePath();
	}

	populated = true;
}

// Update child list if need be.
void SciQWorkspaceDirItem::update()
{
	SciQWorkspaceItem::update();
	if(!(flags & SciQWorkspaceItem::Modified))
		return;

//	if(!populated)
//		populate();

	flags &= ~SciQWorkspaceItem::Modified;

//	qDebug("dir, %s has been modified", qPrintable(name));

	dir.refresh();
	//qDebug() << dir.absolutePath();

	// TODO: reimp? this could possibly be a little slow/inneficient. maybe store a couple lists, one for new items, and one for changed items?
//	QFileInfoList fil = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden);
//	for(int i = 0; i < fil.count(); ++i) {
//		if(fil[i].fileName() == "." || fil[i].fileName() == "..")
//			continue;
//
//		for(int j = 0; j < list.count(); ++j) {
//			QFileInfo fi(list[j]->getName());
//			if(fi.fileName() == fil[i].fileName()) {
//				SciQWorkspaceItem *item = list[j];
////				item->update();
//			}
//		}
//
//		//qDebug() << fil[i].absoluteFilePath();
//	}
}

// public:
int SciQWorkspaceDirItem::childCount()
{
//	update();
	return list.count();
}

SciQWorkspaceItem *SciQWorkspaceDirItem::child(int i)
{
//	update();
	if(i < 0 || i >= list.count())
		return 0;

	//qDebug() << __PRETTY_FUNCTION__ << " " << i << ": " << list.at(i)->getName();

	return list[i];
}

SciQWorkspaceItem *SciQWorkspaceDirItem::addChild(QString cname, QString icon)
{
//	qDebug() << "Append: " << name;
	for(int i = 0; i < list.count(); ++i) {
		if(list[i]->getName() == cname)
			return 0;
	}

	QFileInfo fi(catdir(QStringList() + path + cname));
	//qDebug() << __PRETTY_FUNCTION__ << ": " << fi.absoluteFilePath();
	if(fi.isDir()) {
		SciQWorkspaceDirItem *dir = new SciQWorkspaceDirItem(cname, this, ws);
		dir->flags |= SciQWorkspaceItem::New | SciQWorkspaceItem::Modified;
		list.append(dir);
	//	qDebug() << "Append Dir: " << name;

		//if(!populated)
		//	dir->populate();

		return dir;
	} else
	if(fi.isFile()) {
		SciQWorkspaceFileItem *file = new SciQWorkspaceFileItem(cname, this, ws);
		file->flags |= SciQWorkspaceItem::New | SciQWorkspaceItem::Modified;
		list.append(file);
	//	qDebug() << "Append File: " << cname;
	//	if(parent) qDebug() << "\tTo: " << name;
		return file;
	}

	return 0;
}

SciQWorkspaceItemList SciQWorkspaceDirItem::childList(Flags f)
{
//	update();
	SciQWorkspaceItemList ret;
	for(int i = 0; i < list.count(); ++i) {
		if(list[i]->flag(f)) // will this work? we'll see.
			ret.append(list[i]);
	}

	return ret;
}

QIcon SciQWorkspaceDirItem::getIcon()
{
	return SciQApp::getIcon("folder");
}