[Scummvm-cvs-logs] SF.net SVN: scummvm: [28065] scummex/branches/gsoc2007-gameresbrowser

zbychs at users.sourceforge.net zbychs at users.sourceforge.net
Sat Jul 14 14:35:26 CEST 2007


Revision: 28065
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28065&view=rev
Author:   zbychs
Date:     2007-07-14 05:35:25 -0700 (Sat, 14 Jul 2007)

Log Message:
-----------
Added detachable panels.

Modified Paths:
--------------
    scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h
    scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout

Added Paths:
-----------
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
    scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h

Property Changed:
----------------
    scummex/branches/gsoc2007-gameresbrowser/


Property changes on: scummex/branches/gsoc2007-gameresbrowser
___________________________________________________________________
Name: svn:ignore
   - PinSlot.vcproj
PinSlot.vcproj.ELWOOD.RootBoot.user
Debug
trash

   + PinSlot.vcproj
PinSlot.vcproj.ELWOOD.RootBoot.user
Debug
trash
vc8


Modified: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp	2007-07-14 12:35:25 UTC (rev 28065)
@@ -8,6 +8,7 @@
 #include "DirectoryController.h"
 
 #include "ObjectChain.h"
+#include "PluginUtil.h"
 
 #include <iostream>
 
@@ -15,6 +16,8 @@
 #include <list>
 #include <algorithm>
 
+#include <wx/wx.h>
+
 #include "debugmem.h"
 
 namespace Browser {
@@ -23,137 +26,105 @@
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// private structs
+// PanelInfo
+//
+// Information about a panel registered for a specific node.
+// Normally a panel, when activated, is added into the wxNotebook beside the
+// ExplorationTree. But the panel can be detached into it's own window.
+//
+// It extends wxEvtHandler so that it can listen for window events (when
+// it's detached).
 
-//information about registered panel
-struct PanelInfo {
-	PanelProvider* _panelProvider; //the panel provider it represents
-	bool _activated;		//wheather it's being displayed now
-	wxPanel* _page;			//it's panel
-	size_t _pageIdx;		//it's page index in the wxNotebook
-	PanelInfo(PanelProvider* panelProvider)
-		: _panelProvider(panelProvider), _activated(false), _page(NULL), _pageIdx(-1) {}
-};
+class PanelInfo : public wxEvtHandler {
+	static const int ID_ATTACH = 1099; //command id
 
-bool _pinfo_compare(const PanelInfo* left, const PanelInfo* right) {
-	return *left->_panelProvider < *right->_panelProvider;
-}
+	VirtualNode* _node;		//a node the panel if registered for
+	PanelProvider* _panelProvider; //the panel provider for this panel
+	wxNotebook* _panelNotebook; //reference to the notebook beside the exploration tree
 
-//collection of registered panels (a multimap VirtualNode -> Panels)
-struct PanelMap {
-	typedef std::multimap<VirtualNode*, PanelInfo*> panel_map;
-	panel_map _panelInfos;    
+	bool _activated;		//wheather the panel is being displayed now
+	bool _detached;			//wheather the panel is detached from the notebook (has it's own window)
+	wxPanel* _page;			//the GUI element: a page in the wxNotebook
+	size_t _pageIdx;		//the page's index in the wxNotebook
 
-	~PanelMap() {
-		cleanup();
-	}
+public:
+	PanelInfo(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook);
+	virtual ~PanelInfo();
 
-	void cleanup() {
-		ExplorationTree::get()->nodeDeactivate();
-		panel_map::iterator i;
-		for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
-			PanelInfo* pinfo = i->second;   
-			ASSERT(!pinfo->_activated);
-		}
-		_panelInfos.clear();
-	}
+	PanelProvider* getPanelProvider() const;
+	bool isAttached() const;
+	size_t getPageIdx() const;
 
-	std::list<PanelInfo*> getPanelsFor(VirtualNode* node) {
-		std::vector<PanelInfo*> pinfos;
+	//create the panel in the notebook
+	void activate();
+	void deactivate();
 
-		VirtualNodeItemData* data = VirtualNodeItemData::getForNode(node->getTreeItem());
-		if (!data)
-			return std::list<PanelInfo*>();
+	//detach from the notebook into a new window
+	void detach();
 
-		const guid_list_t& parserGUIDs = data->getParsersOrdering();
+private:
+	//attach to the notebook, after being detached
+	void attach();
 
-		panel_map::iterator i;
-		i = _panelInfos.find(node);
-		for (; i != _panelInfos.end() && i->first == node; ++i) {
-			PanelInfo* pinfo = i->second;
-			pinfo->_panelProvider->determineIndex(parserGUIDs);
-			pinfos.push_back(pinfo); 
-		}
+	//events from a window when we are detached
+	void OnClose(wxCloseEvent& event);
+	void OnCloseCmd(wxCommandEvent& event);
+	void reattachClicked(wxCommandEvent& event);
 
-		//We've got the panels. Let's sort them now.
-		std::sort(pinfos.begin(), pinfos.end(), &_pinfo_compare);
+	//If we are in the Notebook, and want to detach, we have to fix the indexes of
+	//other panels in the Notebook.
+	void removeIdx();
+};
 
-		return std::list<PanelInfo*>(pinfos.begin(), pinfos.end());
-	}
+//used for determining the order in which the panels should be displayed
+bool _pinfo_compare(const PanelInfo* left, const PanelInfo* right) {
+	return *left->getPanelProvider() < *right->getPanelProvider();
+}
 
-	void unregisterPanelProvider(PanelProvider* panelProvider) {
-		panel_map::iterator i;
-		for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
-			PanelInfo* pinfo = i->second;   
-			if (pinfo->_panelProvider != panelProvider)
-				continue;
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Collection of registered panels (a multimap VirtualNode -> PanelInfos)
 
-			if (pinfo->_activated)
-				ExplorationTree::get()->nodeDeactivate();
+struct PanelMap {
+	typedef std::multimap<VirtualNode*, PanelInfo*> panel_map;
+	panel_map _panelInfos;
+	std::list<PanelInfo*> _activePanels;	//panels currently activated
 
-			delete pinfo;
-			_panelInfos.erase(i);
-			return;
-		}
-	}
+	~PanelMap();
+	void cleanup();
 
-	void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
-		_panelInfos.insert( std::make_pair(node, new PanelInfo(panelProvider)) );
-	}
+	std::list<PanelInfo*>& getActivePanels();
+	PanelInfo* getPanelInfo(int pageIdx);					//get PanelInfo for a given netobook page
+	std::list<PanelInfo*> getPanelsFor(VirtualNode* node);	//get panels for a given node
+
+	void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook);
+	void unregisterPanelProvider(PanelProvider* panelProvider);
 };
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
+// Collection of registered directories (a map VirtualNode -> DirectoryControler)
 
-//collection of registered directories
 struct DirMap {
 	typedef std::map<VirtualNode*, DirectoryController*> dir_map;
 	dir_map _dirInfos;    
 
-	~DirMap() {
-		cleanup();
-	}
+	~DirMap();
+	void cleanup();
 
-	void cleanup() {
-		dir_map::iterator i;
-		for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
-			DirectoryController* dir = i->second;
-			ExplorationTree::get()->dirCollapsed(dir);
-		}
-		_dirInfos.clear();
-	}
+	DirectoryController* getDirFor(VirtualNode* node);
 
-	DirectoryController* getDirFor(VirtualNode* node) {
-		dir_map::iterator i;
-		i = _dirInfos.find(node);
-		if (i != _dirInfos.end())
-			return i->second; 
-
-		return NULL;
-	}
-
-	void unregisterDirectoryPresenter(DirectoryController* dirPresenter) {
-		dir_map::iterator i;
-		for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
-			DirectoryController* dir = i->second;   
-			if (dir != dirPresenter)
-				continue;
-
-			ExplorationTree::get()->dirCollapsed(dir);
-
-			_dirInfos.erase(i);
-			return;
-		}
-	}
-
-	void registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter) {
-		_dirInfos.insert( std::make_pair(node, dirPresenter) );
-	}
+	void registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter);
+	void unregisterDirectoryPresenter(DirectoryController* dirPresenter);
 };
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
+//TODO: this should be done in a more flexible way
+#define DEFDIR_ICON 61
+#define DEFFILE_ICON 62
+
 ExplorationTree::ExplorationTree()
 	: _explorationTree(NULL), _panelNotebook(NULL), _activeNode(NULL) {
 	_rootObjectChain = new ObjectChain();
@@ -173,13 +144,13 @@
 void ExplorationTree::cleanup() {
 	nodeDeactivate();
 
+	_dirMap->cleanup();
+	_panelMap->cleanup();
+
 	_rootObjectChain->removeAllObjects();
 
 	//deleting the root
 	ExplorationTree::get()->deleteAllItems();
-
-	_dirMap->cleanup();
-	_panelMap->cleanup();
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -304,6 +275,8 @@
 	if (isDirectory)
 		_explorationTree->AppendItem(item, wxT("Dummy"), -1, -1, NULL); //WORKAROUND: adding Dummies
 		//_explorationTree->SetItemHasChildren(item);
+	if (iconId == -1)
+		iconId = isDirectory ? DEFDIR_ICON : DEFFILE_ICON;
 	if (iconId != -1)
 		setItemIcon(item, iconId);
 
@@ -313,11 +286,14 @@
 void ExplorationTree::deleteItem(const wxTreeItemId& item) {
 	ASSERT_VALID_TREE_ITEM(item);
 	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (data)
+		nodeDeactivate(data->getNode(), true);
 	_explorationTree->Delete(item);
 }
 
 void ExplorationTree::deleteChildren(const wxTreeItemId& parent) {
 	ASSERT_VALID_TREE_ITEM(parent);
+	//FIXME: does not deactivate panels
 	_explorationTree->DeleteChildren(parent);
 }
 
@@ -347,8 +323,9 @@
 wxTreeItemId ExplorationTree::addRoot(wxString title) {
 	wxTreeItemId item = _explorationTree->AddRoot(title, -1, -1, NULL);
 	ASSERT_VALID_TREE_ITEM(item);
-	//TODO: set icon
 	_explorationTree->AppendItem(item, wxT("Dummy"), -1, -1, NULL); //WORKAROUND
+	if (DEFDIR_ICON != -1)
+		setItemIcon(item, DEFDIR_ICON);
 	return item;
 }
 
@@ -366,28 +343,40 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
-//deactivate currently activated node
-void ExplorationTree::nodeDeactivate() {
-	if (_activeNode == NULL)
+//deactivate the specified node's panels
+void ExplorationTree::nodeDeactivate(VirtualNode* node, bool alsoDetached) {
+	if (!node)
 		return;
 
-	std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(_activeNode);
+	std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(node);
 	std::list<PanelInfo*>::iterator i;
 	for (i = pinfos.begin(); i != pinfos.end(); ++i) {
 		PanelInfo* pinfo = *i;
-		ASSERT(pinfo->_activated);
 
-		pinfo->_panelProvider->panelDeactivate();
-
-		pinfo->_activated = false;
-		pinfo->_page = NULL;
-		pinfo->_pageIdx = -1;
+		if (alsoDetached || pinfo->isAttached())
+			pinfo->deactivate();
 	}
-	_panelNotebook->DeleteAllPages();
 
 	_activeNode = NULL;
 }
 
+//deactivate currently activated node, and all other attached panels
+void ExplorationTree::nodeDeactivate() {
+	nodeDeactivate(_activeNode, false); //don't deactivate detached panels
+	_activeNode = NULL;
+
+	std::list<PanelInfo*>& activePanels = _panelMap->getActivePanels();
+	std::list<PanelInfo*>::iterator i, next;
+	for (i = activePanels.begin(); i != activePanels.end(); i = next) {
+		PanelInfo* pinfo = *i;
+
+		next = i; //deactivate() changes the activePanels list, so be safe
+		++next;
+		if (pinfo->isAttached())
+			pinfo->deactivate();
+	}
+}
+
 void ExplorationTree::nodeActivated(VirtualNode* activatedNode) {
 	if (activatedNode != _activeNode)
 		nodeDeactivate();
@@ -399,17 +388,7 @@
 	std::list<PanelInfo*>::iterator i;
 	for (i = pinfos.begin(); i != pinfos.end(); ++i) {
 		PanelInfo* pinfo = *i;
-		if (pinfo->_activated)
-			continue;
-
-		wxPanel* panel = new wxPanel(_panelNotebook);
-		_panelNotebook->AddPage(panel, pinfo->_panelProvider->getPanelTitle());
-
-		pinfo->_activated = true;
-		pinfo->_page = panel;
-		pinfo->_pageIdx = _panelNotebook->GetPageCount() - 1;
-
-		pinfo->_panelProvider->panelActivate(panel);
+		pinfo->activate();
 	}
 }
 
@@ -422,6 +401,19 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
+void ExplorationTree::detachPanel() {
+	int pageIdx = _panelNotebook->GetSelection();
+	if (pageIdx == -1)
+		return;
+
+	PanelInfo* pinfo = _panelMap->getPanelInfo(pageIdx);
+	if (pinfo)
+		pinfo->detach();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
 void ExplorationTree::dirCollapsed(DirectoryController* dirPresenter) {
 	//nop
 }
@@ -458,7 +450,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 void ExplorationTree::registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
-	_panelMap->registerPanelProvider(node, panelProvider);
+	_panelMap->registerPanelProvider(node, panelProvider, _panelNotebook);
 }
 void ExplorationTree::unregisterPanelProvider(PanelProvider* panelProvider) {
 	_panelMap->unregisterPanelProvider(panelProvider);
@@ -493,5 +485,260 @@
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
+// PanelInfo implementation
 
+PanelInfo::PanelInfo(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook)
+	: _node(node), _panelProvider(panelProvider), _panelNotebook(panelNotebook),
+	_activated(false), _detached(false), _page(NULL), _pageIdx(-1) {}
+
+PanelInfo::~PanelInfo() {
+	deactivate();
 }
+
+PanelProvider* PanelInfo::getPanelProvider() const {
+	return _panelProvider;
+}
+bool PanelInfo::isAttached() const {
+	return !_detached;
+}
+size_t PanelInfo::getPageIdx() const {
+	return _pageIdx;
+}
+
+//create the panel in the notebook
+void PanelInfo::activate() {
+	if (_activated)
+		return;
+
+	_page = new wxPanel(_panelNotebook);
+	_panelNotebook->AddPage(_page, _panelProvider->getPanelTitle());
+
+	std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+	activePanels.push_front(this);
+	_activated = true;
+	_detached = false;
+	_pageIdx = _panelNotebook->GetPageCount() - 1;
+
+	_panelProvider->panelActivate(_page);
+}
+
+//detach from the notebook (insert into it's own window)
+void PanelInfo::detach() {
+	if (!_activated || _detached)
+		return;
+
+	const long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU | wxTHICK_FRAME | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX;
+	wxFrame* frame = new wxFrame(PluginUtil::getMainForm(), wxID_ANY,
+		_panelProvider->getPanelTitle(), wxDefaultPosition, _page->GetSize(), style);
+
+	wxMenu* fileMenu = new wxMenu(0);
+	fileMenu->Append(ID_ATTACH, wxT("Reattach"));
+	fileMenu->AppendSeparator();
+	fileMenu->Append(wxID_CLOSE, wxT("Close"));
+
+	wxMenuBar* menuBar = new wxMenuBar();
+	menuBar->Append(fileMenu, wxT("File"));
+	frame->SetMenuBar(menuBar);
+
+	frame->Connect(ID_ATTACH, wxEVT_COMMAND_MENU_SELECTED,
+		wxCommandEventHandler(PanelInfo::reattachClicked), NULL, this);
+	frame->Connect(wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED,
+		wxCommandEventHandler(PanelInfo::OnCloseCmd), NULL, this);
+	frame->Connect(wxID_ANY, wxEVT_CLOSE_WINDOW,
+		wxCloseEventHandler(PanelInfo::OnClose), NULL, this);
+
+	_page->Reparent(frame);
+	_panelNotebook->RemovePage(_pageIdx);
+	removeIdx();
+	_detached = true;
+
+	frame->Show(true);
+}
+
+void PanelInfo::OnClose(wxCloseEvent& event) {
+	deactivate();
+}
+void PanelInfo::OnCloseCmd(wxCommandEvent& event) {
+	deactivate();
+}
+void PanelInfo::reattachClicked(wxCommandEvent& event) {
+	attach();
+}
+
+//attach to the notebook, after being detached
+void PanelInfo::attach() {
+	if (!_activated || !_detached)
+		return;
+	wxWindow* frame = _page->GetParent();
+	_page->Reparent(_panelNotebook);
+	_panelNotebook->AddPage(_page, _panelProvider->getPanelTitle());
+	_pageIdx = _panelNotebook->GetPageCount() - 1;
+	frame->Destroy();
+	_detached = false;
+}
+
+//If we are in the Notebook, and want to detach, we have to fix the indexes of
+//other panels.
+void PanelInfo::removeIdx() {
+	if (_pageIdx == -1)
+		return;
+
+	//fix the indexes of the other panels
+	std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+	std::list<PanelInfo*>::iterator i;
+	for (i = activePanels.begin(); i != activePanels.end(); ++i) {
+		PanelInfo* pinfo = *i;
+		if (pinfo->_pageIdx > this->_pageIdx)
+			pinfo->_pageIdx--;
+	}
+
+	_pageIdx = -1;
+}
+
+void PanelInfo::deactivate() {
+	if (!_activated)
+		return;
+
+	_panelProvider->panelDeactivate();
+	if (!_detached) {
+		_panelNotebook->DeletePage(_pageIdx);
+		removeIdx();
+	} else {
+		wxWindow* frame = _page->GetParent();
+		frame->Destroy();
+	}
+
+	std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+	activePanels.remove(this);
+	_activated = false;
+	_detached = false;
+	_page = NULL;
+	_pageIdx = -1;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// PanelMap implementation
+
+PanelMap::~PanelMap() {
+	cleanup();
+}
+
+void PanelMap::cleanup() {
+	panel_map::iterator i;
+	for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
+		PanelInfo* pinfo = i->second;   
+		pinfo->deactivate();
+		delete pinfo;
+	}
+	_panelInfos.clear();
+}
+
+std::list<PanelInfo*>& PanelMap::getActivePanels() {
+	return _activePanels;
+}
+
+//get PanelInfo for a given netobook page
+PanelInfo* PanelMap::getPanelInfo(int pageIdx) {
+	if (pageIdx == -1)
+		return NULL;
+
+	std::list<PanelInfo*>::iterator i;
+	for (i = _activePanels.begin(); i != _activePanels.end(); ++i) {
+		PanelInfo* pinfo = *i;
+		if (pinfo->getPageIdx() == pageIdx)
+			return pinfo;
+	}
+	return NULL;
+}
+
+std::list<PanelInfo*> PanelMap::getPanelsFor(VirtualNode* node) {
+	std::vector<PanelInfo*> pinfos;
+
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(node->getTreeItem());
+	if (!data)
+		return std::list<PanelInfo*>();
+
+	const guid_list_t& parserGUIDs = data->getParsersOrdering();
+
+	panel_map::iterator i;
+	i = _panelInfos.find(node);
+	for (; i != _panelInfos.end() && i->first == node; ++i) {
+		PanelInfo* pinfo = i->second;
+		pinfo->getPanelProvider()->determineIndex(parserGUIDs);
+		pinfos.push_back(pinfo); 
+	}
+
+	//We've got the panels. Let's sort them now.
+	std::sort(pinfos.begin(), pinfos.end(), &_pinfo_compare);
+
+	return std::list<PanelInfo*>(pinfos.begin(), pinfos.end());
+}
+
+void PanelMap::unregisterPanelProvider(PanelProvider* panelProvider) {
+	panel_map::iterator i;
+	for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
+		PanelInfo* pinfo = i->second;   
+		if (pinfo->getPanelProvider() != panelProvider)
+			continue;
+
+		pinfo->deactivate();
+
+		delete pinfo;
+		_panelInfos.erase(i);
+		return;
+	}
+}
+
+void PanelMap::registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook) {
+	_panelInfos.insert( std::make_pair(node, new PanelInfo(node, panelProvider, panelNotebook)) );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// DirMap implementation
+
+DirMap::~DirMap() {
+	cleanup();
+}
+
+void DirMap::cleanup() {
+	dir_map::iterator i;
+	for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
+		DirectoryController* dir = i->second;
+		ExplorationTree::get()->dirCollapsed(dir);
+	}
+	_dirInfos.clear();
+}
+
+DirectoryController* DirMap::getDirFor(VirtualNode* node) {
+	dir_map::iterator i;
+	i = _dirInfos.find(node);
+	if (i != _dirInfos.end())
+		return i->second; 
+
+	return NULL;
+}
+
+void DirMap::unregisterDirectoryPresenter(DirectoryController* dirPresenter) {
+	dir_map::iterator i;
+	for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
+		DirectoryController* dir = i->second;   
+		if (dir != dirPresenter)
+			continue;
+
+		ExplorationTree::get()->dirCollapsed(dir);
+
+		_dirInfos.erase(i);
+		return;
+	}
+}
+
+void DirMap::registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter) {
+	_dirInfos.insert( std::make_pair(node, dirPresenter) );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h	2007-07-14 12:35:25 UTC (rev 28065)
@@ -72,7 +72,7 @@
 #define ASSERT_VALID_TREE_ITEM(item) \
 	ASSERT(item.IsOk())
 
-struct PanelInfo;
+class PanelInfo;
 struct PanelMap;
 struct DirMap;
 class VirtualNode;
@@ -91,6 +91,8 @@
 	VirtualNode* _activeNode;
 	DirMap* _dirMap;			//registered DirectoryContolers
 
+	friend class PanelInfo;
+
 private:
 	ExplorationTree();
 	~ExplorationTree();
@@ -124,7 +126,9 @@
 
 	//activating/deactivating panels
 	void nodeActivated(VirtualNode* activatedNode);
+	void nodeDeactivate(VirtualNode* node, bool alsoDetached);
 	void nodeDeactivate();
+	void detachPanel();
 
 	void dirCollapsed(DirectoryController* dirPresenter);
 	void dirExpanded(DirectoryController* dirPresenter);

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp	2007-07-14 12:35:25 UTC (rev 28065)
@@ -43,6 +43,7 @@
 	EVT_MENU(ID_TEST1_CLEANUP, MainForm::OnTest1Cleanup)
 	EVT_MENU(ID_TEST0, MainForm::OnTest0)
 	EVT_MENU(ID_TEST2, MainForm::OnTest2)
+	EVT_MENU(ID_DETACH, MainForm::OnDetachPanel)
 	
 	EVT_TREE_ITEM_ACTIVATED(ID_BROWSERTREE,MainForm::browserTreeItemActivated)
 	EVT_TREE_ITEM_EXPANDED(ID_BROWSERTREE,MainForm::browserTreeItemExpanded)
@@ -119,6 +120,10 @@
 	ID_TEST_MENU_Mnu_Obj->Append(ID_TEST0, wxT("Test0 - No Scumm Plugins"), wxT(""), wxITEM_NORMAL);
 	ID_TEST_MENU_Mnu_Obj->Append(ID_TEST2, wxT("Test2 - With Scumm Plugins"), wxT(""), wxITEM_NORMAL);
 	WxMenuBar1->Append(ID_TEST_MENU_Mnu_Obj, wxT("Tests"));
+	
+	wxMenu *ID_DETACHPANEL_Mnu_Obj = new wxMenu(0);
+	ID_DETACHPANEL_Mnu_Obj->Append(ID_DETACH, wxT("Detach"), wxT(""), wxITEM_NORMAL);
+	WxMenuBar1->Append(ID_DETACHPANEL_Mnu_Obj, wxT("Detach panel"));
 	SetMenuBar(WxMenuBar1);
 
 	WxSplitterWindow1->SplitVertically(browserTree,mainPanel,185);

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h	2007-07-14 12:35:25 UTC (rev 28065)
@@ -62,6 +62,7 @@
 	void OnOpen(wxCommandEvent& event);
 		void MainFormIdle(wxIdleEvent& event);
 	void OnLoadPlugin(wxCommandEvent& event);
+	void OnDetachPanel(wxCommandEvent& event);
 		
 	private:
 		//Do not add custom control declarations between
@@ -98,6 +99,8 @@
 			ID_TEST1_CLEANUP = 1012,
 			ID_TEST0 = 1022,
 			ID_TEST2 = 1024,
+			ID_DETACHPANEL = 1031,
+			ID_DETACH = 1032,
 			
 			ID_BROWSERNOTEBOOK = 1021,
 			ID_MAINPANEL = 1017,

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform	2007-07-14 12:35:25 UTC (rev 28065)
@@ -391,7 +391,29 @@
       2057697468205363756D6D20506C7567696E7312436172726965642E57785F43
       6865636B65640816436172726965642E57585F4249544D41502E446174610A0C
       00000007544269746D61700000000016436172726965642E57785F46696C6548
-      6973746F72790800000000}
+      6973746F7279080000000011000000545778437573746F6D4D656E754974656D
+      5450463018547778437573746F6D4D656E754974656D57726170706572001143
+      6172726965642E49735375624D656E750812436172726965642E57785F456E61
+      626C65640911436172726965642E57785F48696464656E081143617272696564
+      2E57785F49444E616D65060E49445F44455441434850414E454C124361727269
+      65642E57785F494456616C756503070418436172726965642E57785F4D656E75
+      4974656D5374796C65070F77784D6E7549746D5F4E6F726D616C124361727269
+      65642E57785F43617074696F6E060C4465746163682070616E656C1243617272
+      6965642E57785F436865636B65640816436172726965642E57585F4249544D41
+      502E446174610A0C00000007544269746D61700000000016436172726965642E
+      57785F46696C65486973746F72790818436172726965642E5778437573746F6D
+      4D656E754974656D0A5B01000011000000545778437573746F6D4D656E754974
+      656D5450463018547778437573746F6D4D656E754974656D5772617070657200
+      11436172726965642E49735375624D656E750810436172726965642E4556545F
+      4D656E75060D4F6E44657461636850616E656C12436172726965642E57785F45
+      6E61626C65640911436172726965642E57785F48696464656E08114361727269
+      65642E57785F49444E616D65060949445F44455441434812436172726965642E
+      57785F494456616C756503080418436172726965642E57785F4D656E75497465
+      6D5374796C65070F77784D6E7549746D5F4E6F726D616C12436172726965642E
+      57785F43617074696F6E060644657461636812436172726965642E57785F4368
+      65636B65640816436172726965642E57585F4249544D41502E446174610A0C00
+      000007544269746D61700000000016436172726965642E57785F46696C654869
+      73746F72790800000000}
     Wx_HasHistory = False
   end
 end

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp	2007-07-14 12:35:25 UTC (rev 28065)
@@ -263,5 +263,13 @@
 	//ExplorationTree::canGet() && ExplorationTree::get()->onIdle();
 }
 
+/*
+* OnDetachPanel
+*/
+void MainForm::OnDetachPanel(wxCommandEvent& event)
+{
+	ExplorationTree::get()->detachPanel();
+}
+
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////

Added: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm	2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,62 @@
+/* XPM */ 
+static const char * defdir_icon_xpm[] = {
+"16 16 43 1",
+" 	c None",
+"!	c black",
+"#	c #CC9933",
+"$	c #CB9832",
+"%	c #C99630",
+"&	c #C7942E",
+"'	c white",
+"(	c #C28F29",
+")	c #FFFF99",
+"*	c #BD8A24",
+"+	c #BA8721",
+",	c #B7841E",
+"-	c #B5821C",
+".	c #B3801A",
+"0	c #B07D17",
+"1	c #FFF791",
+"2	c #FFF48E",
+"3	c #AE7B15",
+"4	c #FFEB85",
+"5	c #FFE680",
+"6	c #C5922C",
+"7	c #C08D27",
+"8	c #BC8923",
+"9	c #B8851F",
+":	c #B4811B",
+";	c #FFE07A",
+"<	c #A3700A",
+"=	c #FFD46E",
+">	c #F8C55F",
+"?	c #A06D07",
+"@	c #FFCC66",
+"A	c #EFBC56",
+"B	c #9E6B05",
+"C	c #E6B34D",
+"D	c #9C6903",
+"E	c #BF8C26",
+"F	c #DCA943",
+"G	c #9A6701",
+"H	c #D3A03A",
+"I	c #996600",
+"J	c #AB7812",
+"K	c #A8750F",
+"L	c #A5720C",
+"                ",
+"  #$%&          ",
+" #''''(         ",
+"#'))))'*+,-.0   ",
+"$122222'''''3!  ",
+"%45666666789:.. ",
+"&;6'''''''''5'<!",
+"6=#)))))))))>)?!",
+"(@$)11111111A)B!",
+"7 at 6)44444444C)D!",
+"*@E);;;;;;;;F)G!",
+"+ at 9)========H)I!",
+" -.03JKL<?BDGI!!",
+"  !!!!!!!!!!!!! ",
+"                ",
+"                "};
\ No newline at end of file


Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm	2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,106 @@
+/* XPM */ 
+static const char * deffile_icon_xpm[] = {
+"16 16 87 1",
+" 	c None",
+"!	c black",
+"#	c #B2C2D8",
+"$	c #AEBED4",
+"%	c #A9B9CF",
+"&	c #A4B3C9",
+"'	c white",
+"(	c #FEFFFF",
+")	c #9CABC0",
+"*	c #354963",
+"+	c #7A8BA2",
+",	c #AFBFD5",
+"-	c #FEFEFF",
+".	c #FBFCFE",
+"0	c #95A4B9",
+"1	c #BAC5D4",
+"2	c #ABBBD1",
+"3	c #FDFEFF",
+"4	c #FBFBFE",
+"5	c #F8F9FD",
+"6	c #93A2B7",
+"7	c #364A64",
+"8	c #A7B6CC",
+"9	c #326AD8",
+":	c #3066D0",
+";	c #2D60C4",
+"<	c #2A59B7",
+"=	c #2852A8",
+">	c #F3F6FC",
+"?	c #EFF4FB",
+"@	c #A3B2C8",
+"A	c #FCFDFF",
+"B	c #F9FBFD",
+"C	c #F6F9FD",
+"D	c #F2F5FC",
+"E	c #EEF2FB",
+"F	c #EAEFFB",
+"G	c #E6ECF9",
+"H	c #9EAEC3",
+"I	c #FEFEFE",
+"J	c #2E60C4",
+"K	c #2B59B7",
+"L	c #2752A7",
+"M	c #254B99",
+"N	c #22458E",
+"O	c #DFE8F8",
+"P	c #9AA9BE",
+"Q	c #F4F7FD",
+"R	c #F0F4FC",
+"S	c #EDF1FB",
+"T	c #E8EEFA",
+"U	c #E4EAF8",
+"V	c #DFE7F7",
+"W	c #DAE2F6",
+"X	c #96A5BA",
+"Y	c #244B9A",
+"Z	c #D3DFF5",
+"[	c #E6EBF9",
+"]	c #E1E8F9",
+"^	c #DBE5F7",
+"_	c #D7E1F6",
+"`	c #D3DEF4",
+"a	c #CDDAF3",
+"b	c #EDF2FB",
+"c	c #3165D0",
+"d	c #2851A7",
+"e	c #254B9A",
+"f	c #C7D5F3",
+"g	c #E8EEF9",
+"h	c #E3EAF8",
+"i	c #DEE6F8",
+"j	c #D9E3F7",
+"k	c #D5DFF5",
+"l	c #D0DBF5",
+"m	c #CBD8F3",
+"n	c #C6D5F2",
+"o	c #C2D1F1",
+"p	c #E2E9F9",
+"q	c #DDE6F8",
+"r	c #D8E2F7",
+"s	c #D3DEF5",
+"t	c #CEDBF4",
+"u	c #CAD7F3",
+"v	c #C5D4F2",
+"w	c #C1D0F1",
+"x	c #BCCDF0",
+"y	c #DCE5F7",
+"                ",
+"  ######$%&&    ",
+"  #''''''()*+   ",
+"  ,'''''-.01*+  ",
+"  2''''3456777  ",
+"  8'9:;<=>?667  ",
+"  @''ABCDEFG6*  ",
+"  HI9:JKLMNO6*  ",
+"  P.5QRSTUVW6*  ",
+"  XC9:;K=YNZ6*  ",
+"  6>EF[]^_`a6*  ",
+"  6b9c;KdeNf6*  ",
+"  6ghijklmno6*  ",
+"  6pqrstuvwx6*  ",
+"  6y666666666*  ",
+"  6***********  "};
\ No newline at end of file


Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h	2007-07-14 12:35:25 UTC (rev 28065)
@@ -28,6 +28,9 @@
 	#include "scummex.xpm"
 #endif
 
+#include "icons/defdir_icon.xpm"
+#include "icons/deffile_icon.xpm"
+
 #include "icons/open_icon.xpm"
 #include "icons/save_icon.xpm"
 #include "icons/exit_icon.xpm"
@@ -163,6 +166,8 @@
 #include "icons/xpm_60_big.xpm"
 
 #define NUM_SCUMM_ICONS 61
+#define DEFDIR_ICON 61
+#define DEFFILE_ICON 62
 
 wxImageList* loadScummIcons() {
 	wxImageList* ImageList = new wxImageList(16, 16, true, NUM_SCUMM_ICONS);
@@ -228,6 +233,8 @@
 	ImageList->Add(wxBitmap(xpm_58));
 	ImageList->Add(wxBitmap(xpm_59));
 	ImageList->Add(wxBitmap(xpm_60));
+	ImageList->Add(wxBitmap(defdir_icon_xpm));
+	ImageList->Add(wxBitmap(deffile_icon_xpm));
 
 	return ImageList;
 }

Added: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp	2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,70 @@
+/////////////////////////////////////////////////////////////////////////////
+// IconPresenter.cpp
+
+#include "basic_stdafx.h"
+
+#include "IconPresenter.h"
+
+#include "ExplorationTree.h"
+#include "CoreInterfaces.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+using namespace Core;
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+SLOT_DESCS(IconPresenter)
+	SLOT_DESC(_iconSlot, SLOT_DEFAULT)
+	SLOT_DESC(_nodeSlot, SLOT_DEFAULT)
+END_DESCS
+
+bool IconPresenter::doRealize(ObjectChain* ochain) {
+	bool res = BObject::doRealize(ochain);
+	if (!res)
+		return false;
+
+	IIcon* iicon = _iconSlot->getInterface();
+	if (!iicon) {
+		errout << wxT("IconPresenter::doRealize(): could not get IIcon interface") << std::endl;
+		_realized = false;
+		return false;
+	}
+
+	_icon = iicon->getIcon();
+	_iconSlot->releaseInterface();
+
+	INodeProvider* _inodeprovider = _nodeSlot->getInterface();
+	if (!_inodeprovider) {
+		errout << wxT("IconPresenter::doRealize(): could not get INodeProvider interface") << std::endl;
+		_realized = false;
+		return false;
+	}
+
+	//Change the node's icon
+	VirtualNode* node = _inodeprovider->getNode();
+	ASSERT(node);
+	ExplorationTree::get()->setNodeIcon(node, _icon);
+
+	_nodeSlot->releaseInterface();
+
+	return true;
+}
+
+void IconPresenter::doUnrealize(ObjectChain* ochain) {
+	_icon = -1;
+	/*_inodeprovider = NULL;
+	_nodeSlot->releaseInterface();*/
+
+	BObject::doUnrealize(ochain);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser


Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h	2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,55 @@
+/////////////////////////////////////////////////////////////////////////////
+// IconPresenter.h
+
+#ifndef _ICON_PRESENTER_H_
+#define _ICON_PRESENTER_H_
+
+#include <wx/wx.h>
+
+#include "VirtualNode.h"
+#include "CoreInterfaces.h"
+#include "AuxInterfaces.h"
+
+namespace Browser {
+
+using namespace Core;
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+//
+// TextPresenter is a PanelReciever (see PanelProvider.h) that displays
+// text on the recieved panel.
+//
+// It takes the text from the IText pin.
+//
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class BASIC_PLUGIN_API IconPresenter : public BObject {
+	DECLARE_BOBJECT_CLASS(IconPresenter, BObject)
+
+protected:
+	Slot<IIcon>* _iconSlot;
+	Slot<INodeProvider>* _nodeSlot;
+
+	int _icon;
+	//INodeProvider* _inodeprovider;
+
+public:
+	ASSIGN_DESC(0, wxT("CoreObjects"), 1)
+
+	SLOTS_DECL
+
+	IconPresenter()
+	: _icon(-1)/*, _inodeprovider(NULL)*/ {}
+
+	virtual bool doRealize(ObjectChain* ochain);
+	virtual void doUnrealize(ObjectChain* ochain);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser
+
+#endif //_ICON_PRESENTER_H_


Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout	2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout	2007-07-14 12:35:25 UTC (rev 28065)
@@ -24,8 +24,8 @@
 CursorRow=1
 TopLine=1
 LeftChar=1
-Open=0
-Top=0
+Open=1
+Top=1
 [Editor_1]
 CursorCol=1
 CursorRow=1
@@ -35,7 +35,7 @@
 Top=0
 [Editors]
 Focused=-1
-Order=
+Order=-1
 [Editor_2]
 Open=0
 Top=0
@@ -44,7 +44,7 @@
 CursorRow=1
 TopLine=1
 LeftChar=1
-Open=0
+Open=1
 Top=0
 [Editor_6]
 CursorCol=1
@@ -58,5 +58,5 @@
 CursorRow=1
 TopLine=1
 LeftChar=1
-Open=0
+Open=1
 Top=0


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list