PolycodeProjectBrowser::PolycodeProjectBrowser(PolycodeProject *project) : UIElement() {

    this->project = project;
    headerBg = new UIRect(10,10);
    addChild(headerBg);
    headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
    headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));

    UILabel *label = new UILabel("PROJECT BROWSER", 18, "section", Label::ANTIALIAS_FULL);
    label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));

    addChild(label);
    label->setPosition(10, 3);


    treeContainer = new UITreeContainer("boxIcon.png", project->getProjectName(), 200, 555);
    treeContainer->getRootNode()->toggleCollapsed();
    treeContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
    treeContainer->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
    treeContainer->setPosition(0, 30);

    BrowserUserData *data = new BrowserUserData();
    data->type = 0;
    data->parentProject = project;
    treeContainer->getRootNode()->setUserData((void*) data)	;

    addChild(treeContainer);
    selectedData = NULL;

    parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder());
}
void PolycodeProjectBrowser::addProject(PolycodeProject *project) {
	UITree *projectTree = treeContainer->getRootNode()->addTreeChild("projectIcon.png", project->getProjectName(), (void*) project);
	projectTree->toggleCollapsed();
	
	BrowserUserData *data = new BrowserUserData();
	data->type = 3;
	data->parentProject = project;
	projectTree->setUserData((void*) data)	;
	
	parseFolderIntoNode(projectTree, project->getRootFolder(), project);	
}
void PolycodeProjectBrowser::refreshProject(PolycodeProject *project) {
	
	UITree *projectTree = treeContainer->getRootNode();
	
	for(int i=0; i < projectTree->getNumTreeChildren(); i++) {
		UITree *projectChild = projectTree->getTreeChild(i);
		BrowserUserData *userData = (BrowserUserData*)projectChild->getUserData();
		if(userData->parentProject == project) {
			parseFolderIntoNode(projectChild, project->getRootFolder(), project);		
			return;
		}
	}	
	
}
void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath, PolycodeProject *parentProject) {
	vector<OSFileEntry> files = OSBasics::parseFolder(spath, false);
	
	// check if files got deleted
	for(int i=0; i < node->getNumTreeChildren(); i++) {
		UITree *projectChild = node->getTreeChild(i);
		if(!listHasFileEntry(files, ((BrowserUserData*)projectChild->getUserData())->fileEntry)) {
			node->removeTreeChild(projectChild);
		}
	}	
	
	for(int i=0; i < files.size(); i++) {
		OSFileEntry entry = files[i];
		if(entry.type == OSFileEntry::TYPE_FOLDER) {
			UITree *existing = nodeHasName(node, entry.name);
			if(!existing) {		
				BrowserUserData *data = new BrowserUserData();
				data->fileEntry = entry;
				UITree *newChild = node->addTreeChild("folder.png", entry.name, (void*) data);
				data->type = 2;	
				data->parentProject = parentProject;
				parseFolderIntoNode(newChild, entry.fullPath, parentProject);				
			} else {
				parseFolderIntoNode(existing, entry.fullPath, parentProject);							
			}
		} else {
			if(!nodeHasName(node, entry.name)) {
				BrowserUserData *data = new BrowserUserData();
				data->fileEntry = entry;
				data->type = 1;
				data->parentProject = parentProject;			
				node->addTreeChild("file.png", entry.name, (void*) data);
			}
		}
	}		
	
}
void PolycodeProjectBrowser::Refresh() {
    parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder());
}