Просмотр исходного кода

Separated project display into separate frames per project, added tab support preliminaries

Ivan Safrin 12 лет назад
Родитель
Сommit
51e208841f

+ 2 - 0
IDE/Contents/Include/PolycodeEditorManager.h

@@ -45,6 +45,8 @@ class PolycodeEditorManager : public EventDispatcher {
 		void setCurrentEditor(PolycodeEditor *editor, bool sendChangeEvent = true);
 		PolycodeEditor *getCurrentEditor() { return currentEditor; }
 		
+		std::vector<PolycodeEditor*> getOpenEditorsForProject(PolycodeProject *project);
+		
 		void saveAll();
 		
 		bool hasUnsavedFiles();

+ 69 - 31
IDE/Contents/Include/PolycodeFrame.h

@@ -142,7 +142,7 @@ class CurveEditor : public UIWindow {
 
 class EditorHolder : public UIElement {
 	public:
-		EditorHolder(PolycodeEditorManager *editorManager, EditorHolder *parentHolder);
+		EditorHolder(PolycodeProject *project, PolycodeEditorManager *editorManager, EditorHolder *parentHolder);
 		~EditorHolder();
 		
 		void handleEvent(Event *event);
@@ -162,6 +162,8 @@ class EditorHolder : public UIElement {
 						
 	protected:
 	
+		PolycodeProject *project;
+	
 		EditorHolder *parentHolder;
 		PolycodeEditorManager *editorManager;
 		
@@ -189,6 +191,49 @@ class EditorHolder : public UIElement {
 		bool isActive;
 };
 
+class PolycodeProjectTab : public UIElement {
+	public:
+		PolycodeProjectTab(PolycodeProject *project, PolycodeEditorManager *editorManager);
+		~PolycodeProjectTab();
+		
+		EditorHolder *getEditorHolder();
+		void Resize(Number width, Number height);
+				
+		void showEditor(PolycodeEditor *editor);		
+		
+		PolycodeProjectBrowser *getProjectBrowser();
+			
+	protected:
+	
+		UIHSizer *mainSizer;	
+		PolycodeProjectBrowser *projectBrowser;
+		EditorHolder *editorHolder;
+		PolycodeEditorManager *editorManager;
+};
+
+class PolycodeProjectFrame : public UIElement {
+	public:
+		PolycodeProjectFrame(PolycodeProject *project, PolycodeEditorManager *editorManager);
+		~PolycodeProjectFrame();
+		
+		PolycodeProject *getProject();
+		
+		PolycodeProjectTab *addNewTab();
+		PolycodeProjectTab *getActiveTab();
+		
+		void Resize(Number width, Number height);
+		
+		EditorHolder *lastActiveEditorHolder;
+		
+	protected:
+	
+		PolycodeProject *project;
+	
+		PolycodeEditorManager *editorManager;
+		PolycodeProjectTab *activeTab;
+		std::vector<PolycodeProjectTab*> tabs;
+};
+
 
 class PolycodeFrame : public UIElement {
 public:
@@ -205,29 +250,32 @@ public:
 	
 	void showFileBrowser(String baseDir, bool foldersOnly, std::vector<String> extensions, bool allowMultiple);
 
-	void handleEvent(Event *event);
+	void handleEvent(Event *event);	
+	void showAssetBrowser(std::vector<String> extensions);
 	
-	void addEditor(PolycodeEditor *editor);
-	void removeEditor(PolycodeEditor *editor);
-		
-	void showEditor(PolycodeEditor *editor);
+	PolycodeProjectBrowser *getCurrentProjectBrowser();
+	PolycodeProjectFrame *getActiveProjectFrame();	
+	PolycodeProjectFrame *getProjectFrame(PolycodeProject *project);
+	
+	void removeProjectFrame(PolycodeProject *project);
 	
-	void showAssetBrowser(std::vector<String> extensions);
 	
 	void toggleConsole();
 	void showConsole();
 	void hideConsole();
 	
-	void showCurveEditor();
+	PolycodeProjectFrame *createProjectFrame(PolycodeProject *project);
+	void switchToProjectFrame(PolycodeProjectFrame *projectFrame);
 	
-	PolycodeProjectBrowser *getProjectBrowser();
+	UIVSizer *getConsoleSizer();
+	
+	void showCurveEditor();
 	
 	NewProjectWindow *newProjectWindow;	
 	ExampleBrowserWindow *exampleBrowserWindow;
 	NewFileWindow *newFileWindow;
 	ExportProjectWindow *exportProjectWindow;
-	SettingsWindow *settingsWindow;
-	
+	SettingsWindow *settingsWindow;	
 	AssetBrowser *assetBrowser;
 	
 	TextInputPopup *textInputPopup;
@@ -235,18 +283,14 @@ public:
 	YesNoCancelPopup *yesNoCancelPopup;
 	
 	Entity *welcomeEntity;	
-	PolycodeProjectBrowser *projectBrowser;
 	PolycodeEditorManager *editorManager;
 		
 	UIImageButton *playButton;
 	UIImageButton *stopButton;
-		
-	UIHSizer *mainSizer;
-	
-	PolycodeConsole *console;
-	
+			
 	PolycodeProjectManager *projectManager;
 		
+	PolycodeConsole *console;	
 	CurveEditor *curveEditor;
 	
 	UIElement *modalRoot;
@@ -257,20 +301,15 @@ public:
 	UIButton *aboutOKButton;
 	
 	void updateFileSelector();
-	void showNextEditor();
-	void showPreviousEditor();
-	
-	EditorHolder *editorHolder;	
 	
 private:
 	
-	int frameSizeX;
-	int frameSizeY;
-	
-	bool willHideModal;
+	Number consoleSize;
+				
+	UIVSizer *consoleSizer;
 	
+	bool willHideModal;	
 	bool showingConsole;
-	Number consoleSize;
 
 	UIRect *fileDialogBlocker;
 
@@ -283,20 +322,19 @@ private:
 	UILabel *dragLabel;
 	bool isDragging;
 	
-	UIComboBox *currentProjectSelector;
-	
+	UIComboBox *currentProjectSelector;	
 	UIImage *welcomeImage;	
-
-	vector<PolycodeEditor*> editors;
 	
 	UIRect *modalBlocker;
 	UIWindow *modalChild;		
 	
-	UIVSizer *consoleSizer;
 	
 	UIButton *newProjectButton;
 	UIButton *examplesButton;
 	
 	bool displayFilePathInSelector;
+	
+	PolycodeProjectFrame* activeProjectFrame;
+	std::vector<PolycodeProjectFrame*> projectFrames;
 
 };

+ 1 - 2
IDE/Contents/Include/PolycodeIDEApp.h

@@ -120,8 +120,7 @@ protected:
 	PolycodeFrame *frame;
 	
 	PolycodeEditorManager *editorManager;
-	PolycodeProjectManager *projectManager;
-	
+	PolycodeProjectManager *projectManager;	
 	PolycodeRemoteDebugger *debugger;
 
 	UIMenuBar *menuBar;

+ 2 - 4
IDE/Contents/Include/PolycodeProjectBrowser.h

@@ -51,17 +51,15 @@ class PolycodeProjectBrowserEvent : public Event {
 
 class PolycodeProjectBrowser : public UIElement {
 public:
-	PolycodeProjectBrowser();
+	PolycodeProjectBrowser(PolycodeProject *project);
 	~PolycodeProjectBrowser();
 	
 	void Resize(Number width, Number height);
-	void addProject(PolycodeProject *project);
-	void removeProject(PolycodeProject *project);
 	
 	UITree *nodeHasName(UITree *node, String name);
 	bool listHasFileEntry(vector<OSFileEntry> files, OSFileEntry fileEntry);
 	
-	void refreshProject(PolycodeProject *project);
+	void Refresh();
 	
 	void handleEvent(Event *event);
 	

+ 1 - 4
IDE/Contents/Include/PolycodeProjectManager.h

@@ -38,7 +38,6 @@ class PolycodeProjectManager : public EventDispatcher {
 	
 	void createNewProject(String templateFolder, String projectName, String projectLocation);
 	PolycodeProject* openProject(String path);
-	void setProjectBrowser(PolycodeProjectBrowser *projectBrowser) { this->projectBrowser = projectBrowser; }
 	
 	PolycodeProject* getActiveProject() { return activeProject; }
 	void setActiveProject(PolycodeProject* project);
@@ -59,9 +58,7 @@ class PolycodeProjectManager : public EventDispatcher {
 protected:
 	
 	
-	PolycodeProject* activeProject;
-	
-	PolycodeProjectBrowser *projectBrowser;
+	PolycodeProject* activeProject;;
 	vector<PolycodeProject*> projects;
 	
 };	

+ 10 - 0
IDE/Contents/Source/PolycodeEditorManager.cpp

@@ -108,6 +108,16 @@ void PolycodeEditorManager::setCurrentEditor(PolycodeEditor *editor, bool sendCh
 	}
 }
 
+std::vector<PolycodeEditor*> PolycodeEditorManager::getOpenEditorsForProject(PolycodeProject *project) {
+	std::vector<PolycodeEditor*> retVector;
+
+	for(int i=0; i < openEditors.size(); i++) {
+		if(openEditors[i]->parentProject == project) {
+			retVector.push_back(openEditors[i]);
+		}
+	}
+	return retVector;
+}
 
 PolycodeEditor *PolycodeEditorManager::getEditorForPath(String path) {
 	for(int i=0; i < openEditors.size();i++) {

+ 168 - 95
IDE/Contents/Source/PolycodeFrame.cpp

@@ -481,9 +481,10 @@ CurveEditor::~CurveEditor() {
 
 }
 
-EditorHolder::EditorHolder(PolycodeEditorManager *editorManager, EditorHolder *parentHolder) : UIElement() {
+EditorHolder::EditorHolder(PolycodeProject *project, PolycodeEditorManager *editorManager, EditorHolder *parentHolder) : UIElement() {
 	this->editorManager = editorManager;
 	this->parentHolder = parentHolder;
+	this->project = project;
 	
 	currentEditor = NULL;
 	
@@ -554,30 +555,32 @@ void EditorHolder::updateFileSelector() {
 	currentFileSelector->removeAllHandlersForListener(this);
 	currentFileSelector->clearItems();
 	
-	for(int i=0; i < editorManager->openEditors.size(); i++) {
-		OSFileEntry entry(editorManager->openEditors[i]->getFilePath(), OSFileEntry::TYPE_FILE);
+	std::vector<PolycodeEditor*> editors = editorManager->getOpenEditorsForProject(project);
+	
+	for(int i=0; i < editors.size(); i++) {
+		OSFileEntry entry(editors[i]->getFilePath(), OSFileEntry::TYPE_FILE);
 		
-		String projName = editorManager->openEditors[i]->parentProject->getProjectName();
-		String rootFolder = editorManager->openEditors[i]->parentProject->getRootFolder();
-		String filePath = editorManager->openEditors[i]->getFilePath();
+		String projName = editors[i]->parentProject->getProjectName();
+		String rootFolder = editors[i]->parentProject->getRootFolder();
+		String filePath = editors[i]->getFilePath();
 		
 		String fullEntry = filePath;
 		if(filePath.find(rootFolder) != -1) {
 			fullEntry = projName + filePath.substr(rootFolder.size(), filePath.size()-1);
 		}
-		if(editorManager->openEditors[i]->hasChanges()) {
+		if(editors[i]->hasChanges()) {
 			if (displayFilePathInSelector)
-				currentFileSelector->addComboItem("* "+fullEntry);
+				currentFileSelector->addComboItem("* "+fullEntry, (void*)editors[i]);
 			else
-				currentFileSelector->addComboItem("* "+entry.name);
+				currentFileSelector->addComboItem("* "+entry.name, (void*)editors[i]);
 		} else {
 			if (displayFilePathInSelector)
-				currentFileSelector->addComboItem(fullEntry);
+				currentFileSelector->addComboItem(fullEntry, (void*)editors[i]);
 			else
-				currentFileSelector->addComboItem(entry.name);
+				currentFileSelector->addComboItem(entry.name, (void*)editors[i]);
 		}
 		
-		if(currentEditor == editorManager->openEditors[i]) {
+		if(currentEditor == editors[i]) {
 			if(!initialUpdate) {
 				currentFileSelector->setSelectedIndex(i);
 			}
@@ -640,13 +643,13 @@ void EditorHolder::handleEvent(Event *event) {
 		
 		vSizer = new UIVSizer(getWidth(), getHeight(), getHeight()/2.0, true);
 		addChild(vSizer);
-		firstChildHolder = new EditorHolder(editorManager, this);
+		firstChildHolder = new EditorHolder(project, editorManager, this);
 		firstChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
 		vSizer->addTopChild(firstChildHolder);		
 		if(isActive) {
 			firstChildHolder->setActive(true);
 		}		
-		secondChildHolder = new EditorHolder(editorManager, this);
+		secondChildHolder = new EditorHolder(project, editorManager, this);
 		secondChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
 		vSizer->addBottomChild(secondChildHolder);
 		
@@ -664,10 +667,10 @@ void EditorHolder::handleEvent(Event *event) {
 		
 		hSizer = new UIHSizer(getWidth(), getHeight(), getWidth()/2.0, true);
 		addChild(hSizer);
-		firstChildHolder = new EditorHolder(editorManager, this);
+		firstChildHolder = new EditorHolder(project, editorManager, this);
 		firstChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);		
 		hSizer->addLeftChild(firstChildHolder);
-		secondChildHolder = new EditorHolder(editorManager, this);
+		secondChildHolder = new EditorHolder(project, editorManager, this);
 		secondChildHolder->addEventListener(this, UIEvent::CLOSE_EVENT);		
 		hSizer->addRightChild(secondChildHolder);
 		if(isActive) {
@@ -683,7 +686,7 @@ void EditorHolder::handleEvent(Event *event) {
 				
 								
 	} else if(event->getDispatcher() == currentFileSelector) {
-		PolycodeEditor *editor = editorManager->openEditors[currentFileSelector->getSelectedIndex()];		
+		PolycodeEditor *editor = (PolycodeEditor*) currentFileSelector->getSelectedItem()->data;
 		if(currentEditor != editor) {
 			setEditor(editor);
 		}
@@ -808,11 +811,86 @@ void EditorHolder::Resize(Number width, Number height) {
 	UIElement::Resize(width, height);
 }
 
+PolycodeProjectTab::PolycodeProjectTab(PolycodeProject *project, PolycodeEditorManager *editorManager) : UIElement() {
+	this->editorManager = editorManager;
+
+	editorHolder = new EditorHolder(project, editorManager, NULL);
+	editorHolder->setActive(true);
+	
+	mainSizer = new UIHSizer(100,100,200,true);
+	addChild(mainSizer);					
+	projectBrowser = new PolycodeProjectBrowser(project);
+	mainSizer->addLeftChild(projectBrowser);
+	mainSizer->addRightChild(editorHolder);
+
+	projectBrowser->treeContainer->getRootNode()->addEventListener(this, UITreeEvent::DRAG_START_EVENT);
+}
+
+void PolycodeProjectTab::Resize(Number width, Number height) {
+	mainSizer->Resize(width, height);
+	UIElement::Resize(width, height);
+}
+
+EditorHolder *PolycodeProjectTab::getEditorHolder() {
+	return editorHolder;
+}
+
+void PolycodeProjectTab::showEditor(PolycodeEditor *editor) {
+	if(activeEditorHolder->getEditor()) {
+		activeEditorHolder->setEditor(NULL);
+	}
+	
+	activeEditorHolder->setEditor(editor);
+	editor->Activate();
+	Resize(getWidth(), getHeight());
+}
+
+PolycodeProjectBrowser *PolycodeProjectTab::getProjectBrowser() {
+	return projectBrowser;
+}
+
+PolycodeProjectTab::~PolycodeProjectTab() {
+
+}
+
+PolycodeProjectFrame::PolycodeProjectFrame(PolycodeProject *project, PolycodeEditorManager *editorManager) {
+	this->editorManager = editorManager;
+	this->project = project;
+	lastActiveEditorHolder = NULL;
+	activeTab = addNewTab();
+}
+
+PolycodeProjectTab *PolycodeProjectFrame::getActiveTab() {
+	return activeTab;
+}
+
+PolycodeProjectTab *PolycodeProjectFrame::addNewTab() {
+	PolycodeProjectTab *newTab = new PolycodeProjectTab(project, editorManager);
+	tabs.push_back(newTab);
+	addChild(newTab);
+	return newTab;
+}
+
+PolycodeProject *PolycodeProjectFrame::getProject() {
+	return project;
+}
+
+void PolycodeProjectFrame::Resize(Number width, Number height) {
+	activeTab->Resize(width, height);
+}
+
+PolycodeProjectFrame::~PolycodeProjectFrame() {
+
+}
+
 
 PolycodeFrame::PolycodeFrame(PolycodeEditorManager *editorManager) : UIElement() {
 
 	this->editorManager = editorManager;
 
+	activeProjectFrame = NULL;
+	consoleSize = 200;
+	
 	globalFrame = this;
 	processInputEvents = true;
 	willHideModal = false;
@@ -837,27 +915,11 @@ PolycodeFrame::PolycodeFrame(PolycodeEditorManager *editorManager) : UIElement()
 	welcomeEntity->addChild(newProjectButton);
 	welcomeEntity->addChild(examplesButton);
 	
-	mainSizer = new UIHSizer(100,100,200,true);
-	mainSizer->setPosition(0, 45);
-	addChild(mainSizer);
-
-	consoleSize = 200;
-
 	consoleSizer = new UIVSizer(100,100,200, false);
-	mainSizer->addRightChild(consoleSizer);	
-				
-	projectBrowser = new PolycodeProjectBrowser();
-	mainSizer->addLeftChild(projectBrowser);
-
-	editorHolder = new EditorHolder(editorManager, NULL);
-	editorHolder->setActive(true);
-	
-	consoleSizer->addTopChild(editorHolder);
-	
 	console = new PolycodeConsole();	
-	consoleSizer->addBottomChild(console);	
-		
-	projectBrowser->treeContainer->getRootNode()->addEventListener(this, UITreeEvent::DRAG_START_EVENT);
+	consoleSizer->addBottomChild(console);
+	addChild(consoleSizer);
+	consoleSizer->setPosition(0.0, 45);
 	
 	topBarBg = new UIRect(2,2);
 	topBarBg->setColorInt(21, 18, 17, 255);
@@ -1014,7 +1076,7 @@ void PolycodeFrame::showModal(UIWindow *modalChild) {
 	modalRoot->addChild(modalChild);
 	modalChild->showWindow();
 	modalChild->addEventListener(this, UIEvent::CLOSE_EVENT);
-	Resize(frameSizeX, frameSizeY);
+	Resize(getWidth(), getHeight());
 	
 	if(modalChild == yesNoPopup) {
 		yesNoPopup->focusChild(yesNoPopup->okButton);
@@ -1022,37 +1084,6 @@ void PolycodeFrame::showModal(UIWindow *modalChild) {
 	CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);	
 }
 
-PolycodeProjectBrowser *PolycodeFrame::getProjectBrowser() {
-	return projectBrowser;
-}
-
-void PolycodeFrame::removeEditor(PolycodeEditor *editor) {
-	for(int i=0; i < editors.size(); i++) {
-		if(editors[i] == editor) {
-			editors.erase(editors.begin()+i);
-			editorHolder->removeChild(editor);
-			if(editor == editorHolder->getEditor()) {
-				editorHolder->setEditor(NULL);
-			}
-			return;
-		}
-	}
-}
-
-void PolycodeFrame::addEditor(PolycodeEditor *editor) {
-	editors.push_back(editor);
-}
-
-void PolycodeFrame::showEditor(PolycodeEditor *editor) {
-	if(activeEditorHolder->getEditor()) {
-		activeEditorHolder->setEditor(NULL);
-	}
-	
-	activeEditorHolder->setEditor(editor);
-	editor->Activate();
-	Resize(frameSizeX, frameSizeY);
-}
-
 void PolycodeFrame::hideModal() {
 	if(modalChild) {
 		modalRoot->removeChild(modalChild);
@@ -1175,19 +1206,20 @@ void PolycodeFrame::handleEvent(Event *event) {
 						updateFileSelector();
 					}
 				} else if (input->getKeyState(KEY_LCTRL) || input->getKeyState(KEY_RCTRL)) {
-					InputEvent *inEv = (InputEvent*)event;
-					if (inEv->getKey() == KEY_TAB) {
-						showNextEditor();
-					} else if (inEv->getKey() == KEY_SLASH) {
-						displayFilePathInSelector = (displayFilePathInSelector ? false : true);
-						updateFileSelector();
-					}
+//					InputEvent *inEv = (InputEvent*)event;
+//					if (inEv->getKey() == KEY_TAB) {
+//						showNextEditor();
+//					} else if (inEv->getKey() == KEY_SLASH) {
+//						displayFilePathInSelector = (displayFilePathInSelector ? false : true);
+//						updateFileSelector();
+//					}
 				}
 			break;
 				
 		}
 	}
 
+/*
 	if(event->getDispatcher() == projectBrowser->treeContainer->getRootNode()) {
 		switch (event->getEventCode()) {
 			case UITreeEvent::DRAG_START_EVENT:
@@ -1203,6 +1235,7 @@ void PolycodeFrame::handleEvent(Event *event) {
 			break;
 		}
 	}
+*/
 
 	if(event->getDispatcher() == modalChild) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLOSE_EVENT) {
@@ -1224,18 +1257,23 @@ void PolycodeFrame::handleEvent(Event *event) {
 	}
 }
 
+PolycodeProjectBrowser *PolycodeFrame::getCurrentProjectBrowser() {
+	if(activeProjectFrame) {
+		return activeProjectFrame->getActiveTab()->getProjectBrowser();
+	} else {
+		return NULL;
+	}
+}
+
 void PolycodeFrame::Resize(int x, int y) {	
-	
-	frameSizeX = x;
-	frameSizeY = y;
-	
+		
 	welcomeEntity->setPosition((x-welcomeImage->getWidth()) / 2,
 		(y-welcomeImage->getHeight()) / 2); 
 	
 	topBarBg->Resize(x, 45);
 	logo->setPosition(x-logo->getWidth()-2, 2);
 	resizer->setPosition(x-resizer->getWidth()-1, y-resizer->getHeight()-1);	
-	mainSizer->Resize(x,y-45);	
+	consoleSizer->Resize(x,y-45);	
 	
 	modalBlocker->Resize(x, y);
 	fileDialogBlocker->Resize(x, y);
@@ -1243,29 +1281,64 @@ void PolycodeFrame::Resize(int x, int y) {
 	if(this->modalChild) {
 		modalChild->setPosition((x-modalChild->getWidth())/2.0f, (y-modalChild->getHeight())/2.0f);
 	}
+	
+	UIElement::Resize(x, y);
+}
+
+void PolycodeFrame::removeProjectFrame(PolycodeProject *project) {
+
+}
+
+PolycodeProjectFrame *PolycodeFrame::getActiveProjectFrame() {
+	return activeProjectFrame;
 }
 
 PolycodeFrame::~PolycodeFrame() {
 	
 }
 
-void PolycodeFrame::showNextEditor() {
-/*
-	if (currentFileSelector->getSelectedIndex() == currentFileSelector->getNumItems()-1)
-		currentFileSelector->setSelectedIndex(0);
-	else
-		currentFileSelector->setSelectedIndex(currentFileSelector->getSelectedIndex()+1);
-		*/
+UIVSizer *PolycodeFrame::getConsoleSizer() {
+	return consoleSizer;
 }
-void PolycodeFrame::showPreviousEditor() {
-/*
-	if (currentFileSelector->getSelectedIndex() == 0)
-		currentFileSelector->setSelectedIndex(currentFileSelector->getNumItems()-1);
-	else
-		currentFileSelector->setSelectedIndex(currentFileSelector->getSelectedIndex()-1);
-		*/
+
+PolycodeProjectFrame *PolycodeFrame::createProjectFrame(PolycodeProject *project) {
+	PolycodeProjectFrame *newProjectFrame = new PolycodeProjectFrame(project, editorManager);
+	projectFrames.push_back(newProjectFrame);	
+	switchToProjectFrame(newProjectFrame);
+	return newProjectFrame;
+}
+
+void PolycodeFrame::switchToProjectFrame(PolycodeProjectFrame *projectFrame) {
+	if(projectFrame == activeProjectFrame) {
+		return;
+	}
+	if(activeProjectFrame) {
+		consoleSizer->removeTopChild();
+		if(editorManager->getCurrentEditor()) {
+			activeProjectFrame->lastActiveEditorHolder = editorManager->getCurrentEditor()->getEditorHolder();
+		}
+	} 
+	activeProjectFrame = projectFrame;
+	consoleSizer->addTopChild(activeProjectFrame);
+	if(activeProjectFrame->lastActiveEditorHolder) {
+		activeProjectFrame->lastActiveEditorHolder->setActive(true);
+	} else {
+		activeProjectFrame->getActiveTab()->getEditorHolder()->setActive(true);
+	}
+	Resize(getWidth(), getHeight());	
+}
+
+PolycodeProjectFrame *PolycodeFrame::getProjectFrame(PolycodeProject *project) {
+	for(int i=0; i < projectFrames.size(); i++) {
+		if(projectFrames[i]->getProject() == project) {
+			return projectFrames[i];
+		}
+	}
+	return NULL;
 }
 
 void PolycodeFrame::updateFileSelector() {
-	editorHolder->updateFileSelector();
+	if(activeProjectFrame)  {
+		activeProjectFrame->getActiveTab()->getEditorHolder()->updateFileSelector();
+	}
 }

+ 62 - 41
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -104,7 +104,6 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 
 	frame->yesNoCancelPopup->addEventListener(this, UIEvent::YES_EVENT);
 	frame->yesNoCancelPopup->addEventListener(this, UIEvent::NO_EVENT);
-
 	
 	frame->newProjectWindow->addEventListener(this, UIEvent::OK_EVENT);
 	frame->exportProjectWindow->addEventListener(this, UIEvent::OK_EVENT);
@@ -116,21 +115,15 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	frame->playButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	frame->stopButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	
-	frame->editorHolder->addEventListener(this, UIEvent::CLOSE_EVENT);
-
+	frame->addEventListener(this, UIEvent::CLOSE_EVENT);
 	screen->addChild(frame);
-
 	
 	projectManager = new PolycodeProjectManager();
-	projectManager->setProjectBrowser(frame->getProjectBrowser());
-	
+		
 	frame->projectManager = projectManager;
-
 	projectManager->addEventListener(frame, Event::CHANGE_EVENT);
-	
-	frame->getProjectBrowser()->addEventListener(this, Event::CHANGE_EVENT);
-	frame->getProjectBrowser()->addEventListener(this, PolycodeProjectBrowserEvent::HANDLE_MENU_COMMAND);
-	
+	projectManager->addEventListener(this, Event::CHANGE_EVENT);
+			
 	frame->Resize(core->getXRes(), core->getYRes());	
 
 	for(int i=0; i < projectsToOpen.size(); i++) {
@@ -231,10 +224,15 @@ void PolycodeIDEApp::toggleConsole() {
 }
 
 void PolycodeIDEApp::doRemoveFile() {
+
+	if(!frame->getActiveProjectFrame()) {
+		return;
+	}
+
 	if(projectManager->selectedFile != "") {
 		core->removeDiskItem(projectManager->selectedFile);
 		if(projectManager->getActiveProject()) {
-			frame->projectBrowser->refreshProject(projectManager->getActiveProject());
+			frame->getCurrentProjectBrowser()->Refresh();
 		}
 		PolycodeEditor *editor = 0;
 		for (int i=0; i < editorManager->openEditors.size(); i++) {
@@ -274,7 +272,7 @@ void PolycodeIDEApp::newFile() {
 
 void PolycodeIDEApp::refreshProject() {
 	if(projectManager->getActiveProject()) {
-		frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+		frame->getCurrentProjectBrowser()->Refresh();
 	}
 }
 
@@ -283,7 +281,10 @@ void PolycodeIDEApp::removeEditor(PolycodeEditor *editor) {
 	if (!editor)
 		return;
 	
-	frame->removeEditor(editor);
+	if(editor->getEditorHolder()) {
+		editor->getEditorHolder()->setEditor(NULL);
+	}
+
 	editorManager->destroyEditor(editor);		
 	editorManager->setCurrentEditor(NULL);
 	
@@ -346,7 +347,9 @@ void PolycodeIDEApp::closeProject() {
 // private helper function that removes editors and project on project close.
 void PolycodeIDEApp::doCloseProject() {
 	doCloseFiles(tempEditorStore);
-	frame->getProjectBrowser()->removeProject(projectManager->getActiveProject());
+
+	frame->removeProjectFrame(projectManager->getActiveProject());
+	
 	projectManager->removeProject(projectManager->getActiveProject());
 	if(projectManager->getProjectCount() > 0) {
 		projectManager->setActiveProject(projectManager->getProjectByIndex(0));
@@ -436,11 +439,13 @@ bool PolycodeIDEApp::quitApp() {
 			frame->showModal(frame->yesNoCancelPopup);
 			return false;
 		} else {	
-			frame->removeEditor(editor);
+			if(editor->getEditorHolder()) {
+				editor->getEditorHolder()->setEditor(NULL);
+			}
 			editorManager->destroyEditor(editor);
 			if(editorManager->openEditors.size() > 0) {
 				editorManager->setCurrentEditor(editorManager->openEditors[0]);
-				frame->showEditor(editorManager->openEditors[0]);
+				frame->getActiveProjectFrame()->getActiveTab()->showEditor(editorManager->openEditors[0]);
 			} else{
 				editorManager->setCurrentEditor(NULL);
 			}
@@ -481,7 +486,7 @@ void PolycodeIDEApp::addFiles() {
 			core->copyDiskItem(files[i], projectManager->activeFolder + "/" + entry.name);
 		}
 		
-		frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+		frame->getCurrentProjectBrowser()->Refresh();
 #endif
 	}		
 }
@@ -570,14 +575,13 @@ void PolycodeIDEApp::openFile(OSFileEntry file) {
 	PolycodeEditor *editor = editorManager->getEditorForPath(file.fullPath);
 	
 	if(editor) {
-		frame->showEditor(editor);
+		frame->getActiveProjectFrame()->getActiveTab()->showEditor(editor);
 	} else {
 		editor = editorManager->createEditorForExtension(file.extension);
 		if(editor) {
 			editor->parentProject = projectManager->getActiveProject();
 			if(editor->openFile(file)) {
-				frame->addEditor(editor);
-				frame->showEditor(editor);
+				frame->getActiveProjectFrame()->getActiveTab()->showEditor(editor);
 			} else {
 				delete editor;
 				editor = NULL;
@@ -592,8 +596,25 @@ void PolycodeIDEApp::openFile(OSFileEntry file) {
 }
 
 void PolycodeIDEApp::handleEvent(Event *event) {
+	if(event->getDispatcher() == projectManager && event->getEventCode() == Event::CHANGE_EVENT) {
+		if(projectManager->getActiveProject()) {
+		
+			if(frame->getCurrentProjectBrowser()) {
+				frame->getCurrentProjectBrowser()->removeAllHandlersForListener(this);
+			}
+		
+			PolycodeProjectFrame *projectFame = frame->getProjectFrame(projectManager->getActiveProject());
+			if(projectFame) {
+				frame->switchToProjectFrame(projectFame);
+			} else {
+				frame->createProjectFrame(projectManager->getActiveProject());
+			}	
+			frame->getCurrentProjectBrowser()->addEventListener(this, Event::CHANGE_EVENT);
+			frame->getCurrentProjectBrowser()->addEventListener(this, PolycodeProjectBrowserEvent::HANDLE_MENU_COMMAND);
+		}
+	}
 
-	if(event->getDispatcher() == frame->editorHolder && event->getEventCode() == UIEvent::CLOSE_EVENT) {
+	if(event->getDispatcher() == frame && event->getEventCode() == UIEvent::CLOSE_EVENT) {
 		closeFile();
 	}
 
@@ -609,7 +630,7 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 				} else if(frame->fileDialog->action == "addFiles") {
 					OSFileEntry entry = OSFileEntry(path, OSFileEntry::TYPE_FILE);
 					core->copyDiskItem(path, projectManager->activeFolder + "/" + entry.name);
-					frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+					frame->getCurrentProjectBrowser()->Refresh();
 				}
 			}
 		}
@@ -692,7 +713,7 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 		}
 	}
 	
-	if(event->getDispatcher()  == frame->getProjectBrowser()) {
+	if(event->getDispatcher()  == frame->getCurrentProjectBrowser()) {
 		
 		if(event->getEventType() == "PolycodeProjectBrowserEvent") {
 			switch(event->getEventCode()) {
@@ -719,7 +740,7 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 		}
 		
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
-			PolycodeProjectBrowser *pb = frame->getProjectBrowser();
+			PolycodeProjectBrowser *pb = frame->getCurrentProjectBrowser();
 			BrowserUserData *selectedData = pb->getSelectedData();
 						
 			if(selectedData->type == 3) {
@@ -894,14 +915,14 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			if(frame->textInputPopup->action == "newGroup") {	
 				core->createFolder(projectManager->activeFolder+"/"+frame->textInputPopup->getValue());
 				if(projectManager->getActiveProject()) {
-					frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+					frame->getCurrentProjectBrowser()->Refresh();
 				}			
 			}
 			
 			if(frame->textInputPopup->action == "renameFile") {		
 				core->moveDiskItem(projectManager->selectedFileEntry.fullPath, projectManager->selectedFileEntry.basePath + "/" + frame->textInputPopup->getValue());			
 				if(projectManager->getActiveProject()) {
-					frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+					frame->getCurrentProjectBrowser()->Refresh();
 				}
 				
 				PolycodeEditor *editor = editorManager->getEditorForPath(projectManager->selectedFileEntry.fullPath);
@@ -953,10 +974,9 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 	if(event->getDispatcher() == frame->newFileWindow) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::OK_EVENT) {
 			projectManager->createNewFile(frame->newFileWindow->getTemplatePath(), frame->newFileWindow->getFileName());
-			frame->hideModal();			
-			
+			frame->hideModal();						
 			if(projectManager->getActiveProject()) {
-				frame->projectBrowser->refreshProject(projectManager->getActiveProject());
+				frame->getCurrentProjectBrowser()->Refresh();
 			}			
 		}
 	}
@@ -985,12 +1005,14 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 	
 	// open an editor/file if project browser has focus and user hits enter or right-arrow key
 	if (event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
-		if (event->getEventCode() == InputEvent::EVENT_KEYDOWN && frame->getProjectBrowser()->treeContainer->hasFocus) {
-			InputEvent *inEvent = (InputEvent*)event;
-			if (inEvent->keyCode() == KEY_RETURN || inEvent->keyCode() == KEY_RIGHT) {
-				BrowserUserData *selectedData = frame->getProjectBrowser()->getSelectedData();
-				if (selectedData)
-					openFile(selectedData->fileEntry);
+		if(frame->getActiveProjectFrame()) {
+			if (event->getEventCode() == InputEvent::EVENT_KEYDOWN && frame->getCurrentProjectBrowser()->treeContainer->hasFocus) {
+				InputEvent *inEvent = (InputEvent*)event;
+				if (inEvent->keyCode() == KEY_RETURN || inEvent->keyCode() == KEY_RIGHT) {
+					BrowserUserData *selectedData = frame->getCurrentProjectBrowser()->getSelectedData();
+					if (selectedData)
+						openFile(selectedData->fileEntry);
+				}
 			}
 		}
 	}
@@ -1067,7 +1089,7 @@ void PolycodeIDEApp::loadConfigFile() {
 			core->setVideoMode(1100, 700, false, true, 0, 0);	
 	}
 		
-	String themeName = "monokai";
+	String themeName = "default";
 	ObjectEntry *syntaxTheme = configFile.root["syntax_theme"];
 	if(syntaxTheme) {
 		themeName = syntaxTheme->stringVal;
@@ -1157,12 +1179,11 @@ bool PolycodeIDEApp::Update() {
 	
 	if(projectManager->getProjectCount() > 0) {
 		frame->welcomeEntity->enabled =  false;
-		frame->projectBrowser->enabled =  true;		
-		frame->mainSizer->enabled = true;
+		
+		frame->getConsoleSizer()->enabled = true;
 	} else {
 		frame->welcomeEntity->enabled =  true;
-		frame->projectBrowser->enabled =  false;			
-		frame->mainSizer->enabled = false;		
+		frame->getConsoleSizer()->enabled = false;		
 	}
 
 

+ 10 - 34
IDE/Contents/Source/PolycodeProjectBrowser.cpp

@@ -24,7 +24,7 @@
 
 extern UIGlobalMenu *globalMenu;
 
-PolycodeProjectBrowser::PolycodeProjectBrowser() : UIElement() {
+PolycodeProjectBrowser::PolycodeProjectBrowser(PolycodeProject *project) : UIElement() {
 
 	headerBg = new UIRect(10,10);
 	addChild(headerBg);
@@ -38,7 +38,7 @@ PolycodeProjectBrowser::PolycodeProjectBrowser() : UIElement() {
 	label->setPosition(10, 3);
 
 
-	treeContainer = new UITreeContainer("boxIcon.png", L"Projects", 200, 555);
+	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);
@@ -48,19 +48,21 @@ PolycodeProjectBrowser::PolycodeProjectBrowser() : UIElement() {
 	data->type = 0;
 	data->parentProject = NULL;
 	treeContainer->getRootNode()->setUserData((void*) data)	;
-	
+
 	addChild(treeContainer);		
 	selectedData = NULL;
+	
+	parseFolderIntoNode(treeContainer->getRootNode(), project->getRootFolder(), project);
 }
 
 PolycodeProjectBrowser::~PolycodeProjectBrowser() {
 	
 }
 
-void PolycodeProjectBrowser::refreshProject(PolycodeProject *project) {
-	
-	UITree *projectTree = treeContainer->getRootNode();
-	
+void PolycodeProjectBrowser::Refresh() {
+// FIX
+/*	
+	UITree *projectTree = treeContainer->getRootNode();	
 	for(int i=0; i < projectTree->getNumTreeChildren(); i++) {
 		UITree *projectChild = projectTree->getTreeChild(i);
 		BrowserUserData *userData = (BrowserUserData*)projectChild->getUserData();
@@ -69,33 +71,7 @@ void PolycodeProjectBrowser::refreshProject(PolycodeProject *project) {
 			return;
 		}
 	}	
-	
-}
-
-void PolycodeProjectBrowser::removeProject(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) {
-			projectTree->removeTreeChild(projectChild);
-			return;
-		}
-	}
-}
-
-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::handleEvent(Event *event) {

+ 1 - 1
IDE/Contents/Source/PolycodeProjectManager.cpp

@@ -72,7 +72,6 @@ PolycodeProject* PolycodeProjectManager::openProject(String path) {
 		CoreServices::getInstance()->getFontManager()->registerFont(fontName, fontPath);		
 	}
 	
-	projectBrowser->addProject(newProject);
 	dispatchEvent(new Event(), Event::CHANGE_EVENT);	
 	return newProject;
 }
@@ -113,6 +112,7 @@ void PolycodeProjectManager::setActiveProject(PolycodeProject* project) {
 		if(project){			
 			CoreServices::getInstance()->getResourceManager()->addArchive(project->getRootFolder());
 		}
+		
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	}
 }

+ 6 - 0
Modules/Contents/UI/Include/PolyUIHSizer.h

@@ -41,6 +41,12 @@ namespace Polycode {
 			
 			void addLeftChild(UIElement *element);
 			void addRightChild(UIElement *element);			
+			
+			UIElement *getLeftChild();
+			UIElement *getRightChild();	
+			void removeLeftChild();
+			void removeRightChild();
+						
 			void Resize(Number width, Number height);
 			
 			void updateSizer();

+ 5 - 0
Modules/Contents/UI/Include/PolyUIVSizer.h

@@ -43,6 +43,11 @@ namespace Polycode {
 			void addBottomChild(UIElement *element);			
 			void Resize(Number width, Number height);
 			
+			UIElement *getTopChild();
+			UIElement *getBottomChild();	
+			void removeTopChild();
+			void removeBottomChild();
+			
 			void updateSizer();
 			
 		protected:

+ 22 - 0
Modules/Contents/UI/Source/PolyUIHSizer.cpp

@@ -154,6 +154,28 @@ void UIHSizer::addRightChild(UIElement *element) {
 	updateSizer();
 }
 
+void UIHSizer::removeLeftChild() {
+	if(firstElement) {
+		childElements->removeChild(firstElement);
+		firstElement = NULL;
+	}
+}
+
+void UIHSizer::removeRightChild() {
+	if(secondElement) {
+		childElements->removeChild(secondElement);
+		secondElement = NULL;
+	}
+}
+
+UIElement *UIHSizer::getLeftChild() {
+	return firstElement;
+}
+
+UIElement *UIHSizer::getRightChild() {
+	return secondElement;
+}
+
 void UIHSizer::updateSizer() {
 
 	if(leftSizer) {

+ 22 - 0
Modules/Contents/UI/Source/PolyUIVSizer.cpp

@@ -158,6 +158,28 @@ void UIVSizer::addBottomChild(UIElement *element) {
 	updateSizer();
 }
 
+void UIVSizer::removeTopChild() {
+	if(firstElement) {
+		childElements->removeChild(firstElement);
+		firstElement = NULL;
+	}
+}
+
+void UIVSizer::removeBottomChild() {
+	if(secondElement) {
+		childElements->removeChild(secondElement);
+		secondElement = NULL;
+	}
+}
+
+UIElement *UIVSizer::getTopChild() {
+	return firstElement;
+}
+
+UIElement *UIVSizer::getBottomChild() {
+	return secondElement;
+}
+
 void UIVSizer::updateSizer() {
 
 	if(topSizer) {