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

zbychs at users.sourceforge.net zbychs at users.sourceforge.net
Wed Jul 11 15:48:53 CEST 2007


Revision: 28029
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28029&view=rev
Author:   zbychs
Date:     2007-07-11 06:48:53 -0700 (Wed, 11 Jul 2007)

Log Message:
-----------
Changing the project structure.
The building is broken at the moment.
Last good version is 28025.

Modified Paths:
--------------
    scummex/branches/gsoc2007-gameresbrowser/src/ReadMe.txt
    scummex/branches/gsoc2007-gameresbrowser/src/core/core_stdafx.h

Added Paths:
-----------
    scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryController.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRecognizer.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRegistry.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.h
    scummex/branches/gsoc2007-gameresbrowser/src/browser/plugin_api.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/common/
    scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/BitmapPanel.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/BitmapPanel.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/FileInfoPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/FileInfoPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/HtmlPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/HtmlPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/ImagePresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/ImagePresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/TextPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/TextPresenter.h

Removed Paths:
-------------
    scummex/branches/gsoc2007-gameresbrowser/src/browser/ftregistry.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/core/common/
    scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/ExplorationTree.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/ExplorationTree.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/FileInfoPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/FileInfoPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/HtmlPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/HtmlPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/ImagePresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/ImagePresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/PanelProvider.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/TextPresenter.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/gui/TextPresenter.h
    scummex/branches/gsoc2007-gameresbrowser/src/gui/VirtualNode.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/Directories.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/Directories.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/DiskFileProvider.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/DiskFileProvider.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/FileTypeRecognizer.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/GUIInterfaces.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/GUIInterfaces.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/PanelProvider.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/VirtualNode.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/plugins_stdafx.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/plugins_stdafx.h
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/wx2scstream.cpp
    scummex/branches/gsoc2007-gameresbrowser/src/plugins/wx2scstream.h

Modified: scummex/branches/gsoc2007-gameresbrowser/src/ReadMe.txt
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/ReadMe.txt	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/ReadMe.txt	2007-07-11 13:48:53 UTC (rev 28029)
@@ -4,6 +4,8 @@
 
 Directories:
 
+TODO: getMainForm must be done like ExplorationTree
+
     core - core files (pins/slots/plugins/registries/objects...)
     browser - all the browser specific classes (plugins can use core and browser)
     gui  - wxWidgets browser gui (plugins can't use this)

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/Directories.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,216 @@
+/////////////////////////////////////////////////////////////////////////////
+// Directories.cpp
+
+#include "plugins_stdafx.h"
+
+#include "Directories.h"
+#include "CoreFileTypes.h"
+
+#include "common/simplefile.h"
+
+#include <iostream>
+
+#include <wx/filesys.h>
+#include <wx/filename.h>
+
+#include "tostring.h"
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//A directory implementation, whose contents are initialized with addFile(), addSubDir(),
+//and which creates *IDiskFileImpl* and *IDiskDirectoryImpl*.
+//So it's a "virtual" directory.
+class IVirtualDirectoryImpl : public IDirectoryImpl {
+protected:
+	str_pair_list _files;
+	str_pair_list _subdirs;
+
+	bool _created;
+public:
+	//inherit guid - it's a concrete implementation of an abstract interface
+	IVirtualDirectoryImpl(IDirectory* parentDir, coreString name);
+	IVirtualDirectoryImpl(IDirectory* parentDir, coreString name, const str_pair_list& files, const str_pair_list& subdirs);
+
+	virtual const ifile_list& getFiles();
+	virtual const idir_list& getSubDirs();
+
+	void addFile(coreString name, coreString fullpath);
+	void addSubDir(coreString name, coreString fullpath);
+
+	virtual void create();
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//A directory that loads it's contents from the disk.
+class IDiskDirectoryImpl : public IVirtualDirectoryImpl {
+protected:
+	coreString _directoryPath;
+public:
+	//inherit guid - it's a concrete implementation of an abstract interface
+	IDiskDirectoryImpl(IDirectory* parentDir, coreString name, coreString directoryPath);
+
+	virtual void create();
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+IVirtualDirectoryImpl::IVirtualDirectoryImpl(IDirectory* parentDir, coreString name)
+	: IDirectoryImpl(parentDir, name, true), _created(false) {}
+IVirtualDirectoryImpl::IVirtualDirectoryImpl(IDirectory* parentDir, coreString name, const str_pair_list& files, const str_pair_list& subdirs)
+	: IDirectoryImpl(parentDir, name, true),
+		_files(files), _subdirs(subdirs), _created(false) {}
+
+
+const ifile_list& IVirtualDirectoryImpl::getFiles() {
+	//infoout << wxT("IVirtualDirectoryImpl::getFiles()") << std::endl;
+	create();
+	return _ifiles;
+}
+
+const idir_list& IVirtualDirectoryImpl::getSubDirs() {
+	//infoout << wxT("IVirtualDirectoryImpl::getSubDirs()") << std::endl;
+	create();
+	return _isubdirs;
+}
+
+void IVirtualDirectoryImpl::addFile(coreString name, coreString fullpath) {
+	_files.push_back( std::make_pair(name, fullpath) );
+}
+
+void IVirtualDirectoryImpl::addSubDir(coreString name, coreString fullpath) {
+	_subdirs.push_back( std::make_pair(name, fullpath) );
+}
+
+void IVirtualDirectoryImpl::create() {
+	if (_created)
+		return;
+	_created = true;
+
+	str_pair_list::const_iterator i;
+
+	for (i = _files.begin(); i != _files.end(); ++i) {
+		const coreString& name = i->first;
+		const coreString& fullpath = i->second;
+
+		_ifiles.push_back( new IDiskFileImpl(this, name, fullpath) );
+	}
+
+	for (i = _subdirs.begin(); i != _subdirs.end(); ++i) {
+		const coreString& name = i->first;
+		const coreString& fullpath = i->second;
+
+		_isubdirs.push_back( new IDiskDirectoryImpl(this, name, fullpath) );
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+IDiskDirectoryImpl::IDiskDirectoryImpl(IDirectory* parentDir, coreString name, coreString directoryPath)
+	: IVirtualDirectoryImpl(parentDir, name), _directoryPath(directoryPath) {
+		_fileType = CoreFileTypes::diskDirectoryFileType();
+	}
+
+void IDiskDirectoryImpl::create() {
+	if (_created)
+		return;
+
+	wxFileName dir = wxFileName::DirName(_directoryPath);
+	if ( !(dir.IsOk() && dir.DirExists() && dir.IsDirReadable()) ) {
+		errout << wxT("IDiskDirectoryImpl::create(): unreadable dir: ") << dir.GetPath() << std::endl;
+		return;
+	}
+
+	wxFileSystem fs;
+	fs.ChangePathTo(dir.GetPath(), true);
+
+	wxString found;
+	
+	found = fs.FindFirst(wxT("*"), wxFILE);
+	while (!found.IsEmpty()) {
+		//wxFileName fname(dir.GetPath(), found);
+		wxFileName fname(found);
+		wxString dispName = fname.GetFullName();
+		addFile( toString(dispName), toString(fname.GetFullPath()));
+		found = fs.FindNext();
+	}
+
+	found = fs.FindFirst(wxT("*"), wxDIR);
+	while (!found.IsEmpty()) {
+		//wxFileName fname(dir);
+		//fname.AppendDir(found);
+		wxFileName fname = wxFileName::DirName(found);
+		wxArrayString dirs = fname.GetDirs();
+		wxString dispName = dirs.Last();
+		addSubDir(toString(dispName), toString(fname.GetPath()));
+		found = fs.FindNext();
+	}
+
+	IVirtualDirectoryImpl::create();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+PIN_DESCS_EX(RootDirectory)
+	PIN_DESC(_directoryPin, PIN_DEFAULT | PIN_MULTICAST, getDirectoryImpl, releaseDirectoryImpl)
+END_DESCS
+
+//TODO: this is not safe for multicast!
+IVirtualDirectoryImpl* RootDirectory::getDirectoryImpl() {
+	if (_idirectory == NULL) {
+		_idirectory = new IVirtualDirectoryImpl(NULL, wxT("Root Directory"), _files, _subdirs);
+		_idirectory->setDirectoryFileType(CoreFileTypes::rootDirectoryFileType());
+	}
+
+	return _idirectory;
+}
+
+void RootDirectory::releaseDirectoryImpl(IVirtualDirectoryImpl* iface) {
+	//infoout << wxT("RootDirectory::releaseDirectoryImpl()") << std::endl;
+	delete iface;
+}
+
+bool RootDirectory::addFile(coreString name, coreString fullpath) {
+	_files.push_back( std::make_pair(name, fullpath) );
+	return true;
+}
+
+bool RootDirectory::addSubDir(coreString name, coreString fullpath) {
+	_subdirs.push_back( std::make_pair(name, fullpath) );
+	return true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+PIN_DESCS_EX(DiskDirectory)
+	PIN_DESC(_directoryPin, PIN_DEFAULT | PIN_MULTICAST, getDirectoryImpl, releaseDirectoryImpl)
+END_DESCS
+
+//TODO: this is not safe for multicast!
+IVirtualDirectoryImpl* DiskDirectory::getDirectoryImpl() {
+	if (_idirectory == NULL) {
+		_idirectory = new IDiskDirectoryImpl(_parentDir, _directoryPath, _directoryPath);
+	}
+
+	return _idirectory;
+}
+
+void DiskDirectory::releaseDirectoryImpl(IVirtualDirectoryImpl* iface) {
+	//infoout << wxT("DiskDirectory::releaseDirectoryImpl()") << std::endl;
+	delete iface;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/Directories.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/Directories.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,93 @@
+/////////////////////////////////////////////////////////////////////////////
+// Directories.h
+
+#ifndef _DIRECTORIES_H_
+#define _DIRECTORIES_H_
+
+#include "VirtualNode.h"
+
+#include <list>
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+// This header defines a RootDirectory and a DiskDirectory. These are directories
+// that are also VirtualNodes.
+// DiskDirectory is not used at the moment. VirtualFiles and VirtualDirectories are.
+// Directories are displayed in (more or less) this fasion:
+// RootDirectory -> IDirectory -> DirectoryPresenter -> IFile ->
+// -> VirtualFile -> IFile -> SomeParser -> IDirectory -> DirectoryPresenter ->
+// -> VirtualFile/VirtualDirectory -> IFile...
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class IVirtualDirectoryImpl;
+class IDiskDirectoryImpl;
+typedef std::list< std::pair< coreString, coreString > > str_pair_list;
+
+class RootDirectory : public VirtualNode {
+	DECLARE_BOBJECT_CLASS(RootDirectory, VirtualNode)
+
+protected:
+	Pin<IDirectory>* _directoryPin;
+
+	str_pair_list _files;
+	str_pair_list _subdirs;
+
+	IVirtualDirectoryImpl* _idirectory;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PINS_DECL
+
+	RootDirectory(wxTreeItemId mineTreeItem)
+		: VirtualNode(mineTreeItem), _idirectory(NULL) {}
+
+	bool addFile(coreString name, coreString fullpath);
+	bool addSubDir(coreString name, coreString fullpath);
+
+	IVirtualDirectoryImpl* getDirectoryImpl();
+	void releaseDirectoryImpl(IVirtualDirectoryImpl* iface);
+
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//not used now - but potentially useable
+
+class DiskDirectory : public VirtualNode {
+	DECLARE_BOBJECT_CLASS(DiskDirectory, VirtualNode)
+
+protected:
+	Pin<IDirectory>* _directoryPin;
+
+	coreString _directoryPath;
+
+	IDirectory* _parentDir;
+	IVirtualDirectoryImpl* _idirectory;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PINS_DECL
+
+	//parentDir can be NULL
+	DiskDirectory(IDirectory* parentDir, wxTreeItemId mineTreeItem, coreString directoryPath)
+		: VirtualNode(mineTreeItem), _parentDir(parentDir), _directoryPath(directoryPath), _idirectory(NULL) {}
+
+	IVirtualDirectoryImpl* getDirectoryImpl();
+	void releaseDirectoryImpl(IVirtualDirectoryImpl* iface);
+
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_DIRECTORIES_H_

Added: scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryController.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryController.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryController.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,22 @@
+/////////////////////////////////////////////////////////////////////////////
+// DirectoryController.h
+
+#ifndef _DIRECTORY_CONTROLLER_H_
+#define _DIRECTORY_CONTROLLER_H_
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class DirectoryController {
+public:
+	virtual void expand() = 0;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_DIRECTORY_CONTROLLER_H_


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

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,240 @@
+/////////////////////////////////////////////////////////////////////////////
+// DirectoryPresenter.cpp
+
+#include "gui_stdafx.h"
+
+#include "DirectoryPresenter.h"
+#include "ExplorationTree.h"
+//#include "FilePresenter.h"
+#include "oregistry.h"
+#include "ftregistry.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+SLOT_DESCS_EX(DirectoryPresenter)
+	SLOT_DESC(_directorySlot, SLOT_DEFAULT)
+	SLOT_DESC(_nodeSlot, SLOT_DEFAULT)
+END_DESCS
+
+bool DirectoryPresenter::doRealize(ObjectChain* ochain) {
+	bool res = BObject::doRealize(ochain);
+	if (!res)
+		return false;
+
+	_inodeprovider = _nodeSlot->getInterface();
+	if (!_inodeprovider) {
+		_realized = false;
+		return false;
+	}
+
+	VirtualNode* node = _inodeprovider->getNode();
+	ExplorationTree::get()->registerDirectoryPresenter(node, this);
+	//ExplorationTree::get()->setItemHasChildren(node, true);
+
+	//WORKAROUND: in wxMSW SetItemHasChildren does not work, so we include a Dummy:
+	//wxTreeItemId dummyTreeItem = ExplorationTree::get()->appendItem(
+	//	node->getTreeItem(), wxT("Dummy"));
+
+	_expanded = false;
+
+	return true;
+}
+
+void DirectoryPresenter::doUnrealize(ObjectChain* ochain) {
+	ASSERT(_inodeprovider && _inodeprovider->getNode());
+	infoout << wxT("DirectoryPresenter::unrealize(): ")
+			  //<< (_inodeprovider ? _inodeprovider->getNode()->getTreeItemName().c_str() : wxT("<error>")) << wxT(" ")
+			  << (_idirectory ? _idirectory->getName().c_str() : wxT("<not expanded>")) << wxT(" ")
+			  << std::endl;
+
+	ExplorationTree::get()->unregisterDirectoryPresenter(this);
+
+	deleteKidChains();
+
+	_expanded = false;
+	_idirectory = NULL;
+	_inodeprovider = NULL;
+
+	_directorySlot->releaseInterface();
+	_nodeSlot->releaseInterface();
+
+	BObject::doUnrealize(ochain);
+}
+
+ObjectChain* DirectoryPresenter::prepareKidChain(const RCPtr<VirtualNode>& virtualNode, guid_list& parsers) {
+
+	ObjectChain* kidchain = new ObjectChain();
+
+	bool addingOk = true;
+
+	addingOk &= kidchain->addObject(virtualNode);
+
+	guid_list::iterator i;
+	for (i = parsers.begin(); i != parsers.end(); ++i) {
+		if (!addingOk)
+			break;
+		RCPtr<BObject> parser = ObjectRegistry::get()->getObject( *i );
+		if (parser.get() == NULL) {
+			errout << wxT("ERROR: DirectoryPresenter::prepareKidChain(): can't create parser: ") << (*i) << std::endl;
+			addingOk = false;
+			break;
+		}
+		addingOk &= kidchain->addObject( parser );
+	}
+
+	if (!addingOk) {
+		//ASSERT(false); //failure here means we've got a missing plugin
+		delete kidchain;
+		//virtualNode is deleted automatically
+		return NULL;
+	}
+
+	return kidchain;
+}
+
+void DirectoryPresenter::expand() {
+
+	if (_expanded)
+		return;
+	_expanded = true;
+
+	VirtualNode* parent = _inodeprovider->getNode();
+	ExplorationTree::get()->deleteChildren(parent->getTreeItem()); //delete the Dummy added by the ExplorationTree
+
+	_idirectory = _directorySlot->getInterface();
+	if (!_idirectory) {
+		errout << wxT("ERROR: DirectoryPresenter::expand(): can't get IDirectory interface.") << std::endl;
+		return; //TODO: report error
+	}
+
+	infoout << wxT("DirectoryPresenter::expand(): ") << _idirectory->getName().c_str() << std::endl;
+
+	const std::list<IDirectory*>& subdirs = _idirectory->getSubDirs();
+	std::list<IDirectory*>::const_iterator j;
+	for (j = subdirs.begin(); j != subdirs.end(); ++j) {
+		IDirectory* idirectory = *j;
+
+		wxTreeItemId kidTreeItem = ExplorationTree::get()->appendItem(
+			parent->getTreeItem(), idirectory->getName());
+
+		RCPtr<VirtualNode> virtualDir( new VirtualDirectory(kidTreeItem, idirectory) );
+
+		VirtualNodeItemData* itemData = new VirtualNodeItemData(virtualDir.get(), NULL);
+		ExplorationTree::get()->setItemData(kidTreeItem, itemData);
+
+		guid_list parsers;
+		//could omit it - ObjectChain::complete() would find it
+		parsers.push_back( DirectoryPresenter::static_GUID() );
+
+		ObjectChain* kidchain = prepareKidChain(virtualDir, parsers);
+		if (!kidchain) {
+			errout << wxT("ERROR: DirectoryPresenter::expand(): can't prepare kid chain for dir: ")
+				<< idirectory->getName() << std::endl;
+			ExplorationTree::get()->deleteItem(kidTreeItem);
+		} else {
+			itemData->setObjectChain(kidchain);
+			_kidChains.push_back(itemData);
+		}
+	}
+
+	const std::list<IFile*>& files = _idirectory->getFiles();
+	std::list<IFile*>::const_iterator i;
+	for (i = files.begin(); i != files.end(); ++i) {
+		IFile* ifile = *i;
+
+		wxTreeItemId kidTreeItem = ExplorationTree::get()->appendItem(
+			parent->getTreeItem(), ifile->getName());
+
+		//CAUTION: Do *not* create BObjects with bare 'new' and expect them to work! you'll get
+		//         segfaults! You have to wrap them like this: RCPtr<BObject>(new BObject()),
+		//         or call addReference()/releaseReference() manually - so that proper
+		//         initialisation take place (initialize()/destroy()).
+		VirtualFile* virtualFile = new VirtualFile(kidTreeItem, ifile);
+		RCPtr<VirtualNode> virtualNode(virtualFile);
+
+		VirtualNodeItemData* itemData = new VirtualNodeItemData(virtualFile, NULL);
+		ExplorationTree::get()->setItemData(kidTreeItem, itemData);
+
+		//Here we try to figure the fileType and the best parsers for it:
+
+		RecognizedFileType outFileType(ifile->getFileType());
+		guid_list parsers;
+		if (outFileType.isOk())
+			parsers = FileTypeRegistry::get()->resolveParsers(outFileType.getFileTypeGUID())._parserGUIDs;
+		else {
+			parsers = FileTypeRegistry::get()->resolveParsers(virtualFile, outFileType);
+			ifile->setFileType(outFileType);
+		}
+
+		//Ok, we've got the best parsers, so create a dedicated ObjectChain:
+
+		ObjectChain* kidchain = prepareKidChain(virtualNode, parsers);
+		if (!kidchain) {
+			errout << wxT("ERROR: DirectoryPresenter::expand(): can't prepare kid chain for file: ")
+				<< ifile->getName() << wxT(" file type: ") << outFileType.getFileTypeGUID() << std::endl;
+			ExplorationTree::get()->deleteItem(kidTreeItem);
+		} else {
+			itemData->setObjectChain(kidchain);
+			_kidChains.push_back(itemData);
+		}
+	}
+
+	//realize visible items:
+	//ExplorationTree::get()->realizeVisible(); done by the tree itself
+
+	//now realize those chains:
+	/*if (!realizeKidChains()) {
+		deleteKidChains();
+		errout << wxT("ERROR: DirectoryPresenter::expand(): can't realize kids.") << std::endl;
+		return; //TODO: report error
+	}*/
+}
+
+void DirectoryPresenter::deleteKidChains() {
+	std::list<VirtualNodeItemData*>::const_iterator i;
+	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
+		VirtualNodeItemData* data = *i;
+		ObjectChain* kidchain = data->getObjectChain();
+		ASSERT(kidchain);
+		delete kidchain; //unrealize
+	}
+	_kidChains.clear();
+
+	VirtualNode* node = _inodeprovider->getNode();
+	ExplorationTree::get()->deleteChildren(node->getTreeItem());
+}
+
+bool DirectoryPresenter::realizeKidChains() {
+	bool res = true;
+	/*std::list<ObjectChain*>::const_iterator i;
+	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
+		ObjectChain* kidchain = *i;
+		kidchain->complete();
+		res &= kidchain->realize();
+	}*/
+	return res;
+}
+
+void DirectoryPresenter::dumpObjectChains(streamout& os) {
+	std::list<VirtualNodeItemData*>::const_iterator i;
+	int idx = 0;
+	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
+		VirtualNodeItemData* data = *i;
+		ObjectChain* kidchain = data->getObjectChain();
+		ASSERT(kidchain);
+		kidchain->dumpObjectChain(coreString(wxT("kid")) + toString(idx), os);
+		idx++;
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/DirectoryPresenter.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,62 @@
+/////////////////////////////////////////////////////////////////////////////
+// DirectoryPresenter.h
+
+#ifndef _DIRECTORY_PRESENTER_H_
+#define _DIRECTORY_PRESENTER_H_
+
+#include "pinslot.h"
+#include "ochain.h"
+#include "CoreInterfaces.h"
+#include "VirtualNode.h"
+#include "FileTypeRecognizer.h"
+#include "DirectoryController.h"
+
+#include <list>
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class INodeProvider;
+
+class DirectoryPresenter : public BObject, public DirectoryController {
+	DECLARE_BOBJECT_CLASS(DirectoryPresenter, BObject)
+
+protected:
+	Slot<IDirectory>* _directorySlot;
+	Slot<INodeProvider>* _nodeSlot;
+
+	IDirectory* _idirectory;
+	INodeProvider* _inodeprovider;
+	std::list<VirtualNodeItemData*> _kidChains;
+
+	bool _expanded;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	SLOTS_DECL
+
+	DirectoryPresenter()
+	: _idirectory(NULL), _inodeprovider(NULL), _expanded(false) {}
+
+	virtual bool doRealize(ObjectChain* ochain);
+	virtual void doUnrealize(ObjectChain* ochain);
+
+	virtual bool realizeKidChains();
+	virtual void deleteKidChains();
+
+	virtual void expand();
+	ObjectChain* prepareKidChain(const RCPtr<VirtualNode>& virtualNode, guid_list& parsers);
+
+	virtual void dumpObjectChains(streamout& os);
+
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_DIRECTORY_PRESENTER_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/DiskFileProvider.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,42 @@
+/////////////////////////////////////////////////////////////////////////////
+// DiskFileProvider.cpp
+
+#include "plugins_stdafx.h"
+
+#include "DiskFileProvider.h"
+#include "common/simplefile.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+PIN_DESCS_EX(DiskFileProvider)
+	PIN_DESC(_filePin, PIN_MULTICAST, getFileImpl, releaseFileImpl)
+END_DESCS
+
+
+IStreamFileImpl* DiskFileProvider::getFileImpl() {
+	//infoout << wxT("DiskFileProvider::getFileImpl(): ") << _diskFileName << std::endl;
+	Common::SimpleFile* file = new Common::SimpleFile();
+	bool res = file->open(_diskFileName);
+	if (!res) {
+		delete file;
+		return NULL;
+	}
+	return new IStreamFileImpl(NULL, _diskFileName, file, true);
+}
+
+void DiskFileProvider::releaseFileImpl(IStreamFileImpl* iface) {
+	//infoout << wxT("DiskFileProvider::releaseFileImpl(): ") << _diskFileName << std::endl;
+	delete iface;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/DiskFileProvider.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/DiskFileProvider.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,49 @@
+/////////////////////////////////////////////////////////////////////////////
+// DiskFileProvider.h
+
+// This class in unused, although potentially usable.
+
+#ifndef _DISKFILEPROVIDER_H_
+#define _DISKFILEPROVIDER_H_
+
+#include "pinslot.h"
+
+#include "CoreInterfaces.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class DiskFileProvider : public BObject {
+	DECLARE_BOBJECT_CLASS(DiskFileProvider, BObject)
+
+protected:
+	Pin<IFile>* _filePin;
+
+	coreString _diskFileName;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PINS_DECL
+
+	DiskFileProvider() {}
+	DiskFileProvider(coreString diskFileName)
+		: _diskFileName(diskFileName) {}
+
+	virtual void init(coreString diskFileName) {
+		_diskFileName = diskFileName;
+	}
+
+	IStreamFileImpl* getFileImpl();
+	void releaseFileImpl(IStreamFileImpl* iface);
+
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser
+
+#endif // _DISKFILEPROVIDER_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/ExplorationTree.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,529 @@
+/////////////////////////////////////////////////////////////////////////////
+// ExplorationTree.cpp
+
+#include "gui_stdafx.h"
+
+#include "ExplorationTree.h"
+#include "PanelProvider.h"
+#include "DirectoryController.h"
+
+#include "ochain.h"
+
+#include <iostream>
+
+#include <map>
+#include <list>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// private structs
+
+//information about registered panel
+struct PanelInfo {
+	bool _activated;
+	wxPanel* _page;
+	size_t _pageIdx;
+	PanelProvider* _panelProvider;
+	PanelInfo(PanelProvider* panelProvider)
+		: _panelProvider(panelProvider), _activated(false), _page(NULL), _pageIdx(-1) {}
+};
+
+//collection of registered panels
+struct PanelMap {
+	typedef std::multimap<VirtualNode*, PanelInfo*> panel_map;
+	panel_map _panelInfos;    
+
+	~PanelMap() {
+		cleanup();
+	}
+
+	void cleanup() {
+		panel_map::iterator i;
+		while (!_panelInfos.empty()) {
+			i = _panelInfos.begin();
+			PanelInfo* pinfo = i->second;   
+			if (pinfo->_activated)
+				ExplorationTree::get()->pinfoDeactivate(pinfo); //<-- CAUTION: this uses _panelInfos!
+			delete pinfo;
+			_panelInfos.erase(i);
+		}
+	}
+
+	std::list<PanelInfo*> getPanelsFor(VirtualNode* node) {
+		std::list<PanelInfo*> pinfos;
+
+		panel_map::iterator i;
+		i = _panelInfos.find(node);
+		for (; i != _panelInfos.end() && i->first == node; ++i)
+			pinfos.push_back(i->second); 
+
+		return pinfos;
+	}
+
+	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;
+
+			if (pinfo->_activated)
+				ExplorationTree::get()->pinfoDeactivate(pinfo);
+
+			delete pinfo;
+			_panelInfos.erase(i);
+			return;
+		}
+	}
+
+	void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
+		_panelInfos.insert( std::make_pair(node, new PanelInfo(panelProvider)) );
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//collection of registered directories
+struct DirMap {
+	typedef std::map<VirtualNode*, DirectoryController*> dir_map;
+	dir_map _dirInfos;    
+
+	~DirMap() {
+		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) {
+		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) );
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ExplorationTree::ExplorationTree()
+	: _explorationTree(NULL), _panelNotebook(NULL), _activeNode(NULL) {
+	_rootObjectChain = new ObjectChain();
+	_panelMap = new PanelMap();
+	_dirMap = new DirMap();
+	_notCompletedCount = 0;
+}
+
+ExplorationTree::~ExplorationTree() {
+	_dirMap->cleanup();
+	_panelMap->cleanup();
+
+	delete _rootObjectChain; //unrealize
+
+	delete _dirMap;
+	delete _panelMap;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ExplorationTree* ExplorationTree::_instance = NULL;
+
+/*static*/ bool ExplorationTree::canGet() {
+	return _instance != NULL;
+}
+/*static*/ ExplorationTree* ExplorationTree::get() {
+	ASSERT(_instance);
+	return _instance;
+}
+/*static*/ void ExplorationTree::initialize(wxTreeCtrl* explorationTree, wxNotebook* panelNotebook) {
+	ASSERT(!_instance);
+	_instance = new ExplorationTree();
+	_instance->_explorationTree = explorationTree;
+	_instance->_panelNotebook = panelNotebook;
+}
+/*static*/ void ExplorationTree::release() {
+	if (_instance)
+		delete _instance;
+	_instance = NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+bool ExplorationTree::onIdleRec(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (data && !data->getCompleted()) {
+		ObjectChain* kidchain = data->getObjectChain();
+		ASSERT(kidchain);
+
+		infoout << wxT("INFO: ExplorationTree::onIdleRec(): completing") << std::endl;
+		kidchain->complete();
+		_notCompletedCount--;
+		data->setCompleted(true);
+
+		//FIXME: This won't work for other DirectoryControllers
+		ASSERT_STATICS_ALLOWED();
+		static directoryPresenterGUID(wxT("CoreObjects"), wxT("DirectoryController"), 1);
+		//WORKAROUND: in wxMSW SetItemHasChildren does not work, so we include a Dummy:
+		if (!kidchain->isContained(directoryPresenterGUID)) {
+			ExplorationTree::get()->deleteChildren(item); //delete the Dummy added by the ExplorationTree
+		}
+
+		return true;
+	}
+	getItemText(item);
+
+	wxTreeItemIdValue cookie;
+	wxTreeItemId child = _explorationTree->GetFirstChild(item, cookie);
+	while (child.IsOk()) {
+		if (onIdleRec(child))
+			return true;
+		child = _explorationTree->GetNextChild(item, cookie);
+	}
+
+	return false;
+}
+
+bool ExplorationTree::onIdle() {
+	if (_notCompletedCount <= 0)
+		return false;
+
+	infoout << wxT("INFO: ExplorationTree::onIdle(): trying to complete: ") << _notCompletedCount << std::endl;
+	return onIdleRec(_explorationTree->GetRootItem());
+}
+
+void ExplorationTree::realizeVisible(bool dirsOnly /*= true*/) {
+	wxTreeItemId item = _explorationTree->GetFirstVisibleItem();
+	while (item.IsOk() &&
+		_explorationTree->IsVisible(item)) {  //WORKAROUND: in wxMSW this is necessary
+			realizeNode(item, dirsOnly);
+			item = _explorationTree->GetNextVisible(item);
+	}
+}
+
+bool ExplorationTree::isNodeRealized(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (!data)
+		return false;
+
+	return data->getRealized();
+}
+
+bool ExplorationTree::realizeNode(const wxTreeItemId& item, bool dirsOnly /*= false*/) {
+	ASSERT_VALID_TREE_ITEM(item);
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (!data)
+		return false;
+
+	if (!data->getRealized()) {
+
+		ObjectChain* kidchain = data->getObjectChain();
+		ASSERT(kidchain);
+
+		if (!data->getCompleted()) {
+			kidchain->complete();
+			_notCompletedCount--; //FIXME: the counting is not entirely correct
+			data->setCompleted(true);
+		}
+
+		if (dirsOnly) {
+			if (kidchain->isContained(DirectoryController::static_GUID()))
+				return true;
+			//WORKAROUND: in wxMSW SetItemHasChildren does not work, so we include a Dummy:
+			ExplorationTree::get()->deleteChildren(item); //delete the Dummy added by the ExplorationTree
+			return true;
+		}
+
+		if (!kidchain->isContained(DirectoryController::static_GUID()))
+			ExplorationTree::get()->deleteChildren(item); //delete the Dummy added by the ExplorationTree
+
+		wxString name = getItemText(item);
+		infoout << wxT("ExplorationTree::realizeNode(): realizing chain for node: ")
+			<< name << std::endl;
+
+		bool res = kidchain->realize();
+
+		if (!res) {
+			errout << wxT("ERROR: ExplorationTree::realizeNode(): can't realize chain for node: ")
+				<< name << std::endl;
+			wxString outName = name + wxT(".dot");
+			errout << wxT("Dumping Object Chain to: ") << outName << std::endl;
+			kidchain->dumpObjectChain(outName);
+
+			//delete kidchain;
+			//deleteItem(item);
+
+			return false;
+		} else {
+			data->setRealized(true);
+		}
+	}
+
+	return true;
+}
+
+VirtualNode* ExplorationTree::getNode(const wxTreeItemId& item) {
+	if (!realizeNode(item))
+		return NULL;
+
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (!data)
+		return NULL;
+
+	return data->getNode();
+}
+
+VirtualNode* ExplorationTree::getSelectedNode() {
+	wxTreeItemId item = getSelected();
+	if (!item.IsOk())
+		return NULL;
+	VirtualNode* node = getNode(item);
+	return node;
+}
+
+wxTreeItemId ExplorationTree::getSelected() {
+	wxTreeItemId item = _explorationTree->GetSelection();
+	return item;
+}
+
+wxTreeItemId ExplorationTree::appendItem(const wxTreeItemId& parent, wxString title) {
+	ASSERT_VALID_TREE_ITEM(parent);
+	wxTreeItemId item = _explorationTree->AppendItem(parent, title, -1, -1, NULL);
+	ASSERT_VALID_TREE_ITEM(item);
+	//_explorationTree->SetItemHasChildren(item);
+	_notCompletedCount++;
+	return item;
+}
+
+void ExplorationTree::deleteItem(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+	if (data && !data->getCompleted())
+		_notCompletedCount--;
+	_explorationTree->Delete(item);
+}
+
+void ExplorationTree::deleteChildren(const wxTreeItemId& parent) {
+	ASSERT_VALID_TREE_ITEM(parent);
+	_explorationTree->DeleteChildren(parent);
+	//_recDel(parent, false);
+}
+
+void ExplorationTree::setItemData(const wxTreeItemId& item, wxTreeItemData* data) {
+	ASSERT_VALID_TREE_ITEM(item);
+	_explorationTree->SetItemData(item, data);
+}
+
+wxTreeItemData* ExplorationTree::getItemData(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	return _explorationTree->GetItemData(item);
+}
+
+wxTreeItemId ExplorationTree::getItemParent(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	wxTreeItemId parent = _explorationTree->GetItemParent(item);
+	ASSERT_VALID_TREE_ITEM(parent);
+	return parent;
+}
+
+wxString ExplorationTree::getItemText(const wxTreeItemId& item) {
+	ASSERT_VALID_TREE_ITEM(item);
+	return _explorationTree->GetItemText(item);
+}
+
+
+wxTreeItemId ExplorationTree::addRoot(wxString title) {
+	wxTreeItemId item = _explorationTree->AddRoot(title, -1, -1, NULL);
+	_notCompletedCount = 1;
+	ASSERT_VALID_TREE_ITEM(item);
+	_explorationTree->AppendItem(item, wxT("Dummy"), -1, -1, NULL); //WORKAROUND
+	return item;
+}
+
+void ExplorationTree::deleteAllItems() {
+	_notCompletedCount = 0;
+	_explorationTree->DeleteAllItems();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ObjectChain* ExplorationTree::getRootObjectChain() {
+	return _rootObjectChain;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+void ExplorationTree::pinfoDeactivate(PanelInfo* pinfo) {
+	if (!pinfo->_activated)
+		return;
+
+	//_panelNotebook->GetFirstPage();
+
+	pinfo->_panelProvider->panelDeactivate();
+	_panelNotebook->DeletePage(pinfo->_pageIdx);
+	//WORKAROUND: DeletePage is supposed to have DeletePage(wxWindow*)... but it doesn't.
+	std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(_activeNode);
+	std::list<PanelInfo*>::iterator i;
+	for (i = pinfos.begin(); i != pinfos.end(); ++i) {
+		PanelInfo* pinfo2 = *i;
+		if (pinfo2->_pageIdx > pinfo->_pageIdx)
+			pinfo2->_pageIdx--;
+	}
+	pinfo->_activated = false;
+	pinfo->_page = NULL;
+	pinfo->_pageIdx = -1;
+}
+
+void ExplorationTree::pinfoActivate(PanelInfo* pinfo) {
+	if (pinfo->_activated)
+		return;
+
+	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);
+}
+
+void ExplorationTree::nodeDeactivate() {
+	if (_activeNode == NULL)
+		return;
+
+	std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(_activeNode);
+	std::list<PanelInfo*>::iterator i;
+	for (i = pinfos.begin(); i != pinfos.end(); ++i) {
+		pinfoDeactivate(*i);
+	}
+
+	_activeNode = NULL;
+}
+
+void ExplorationTree::nodeActivated(VirtualNode* activatedNode) {
+	if (activatedNode != _activeNode)
+		nodeDeactivate();
+	_activeNode = activatedNode;
+	if (!_activeNode)
+		return;
+
+	std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(activatedNode);
+	std::list<PanelInfo*>::iterator i;
+	for (i = pinfos.begin(); i != pinfos.end(); ++i) {
+		pinfoActivate(*i);
+	}
+}
+
+void ExplorationTree::itemActivated(wxTreeItemId item) {
+	VirtualNode* node = getNode(item);
+	if (node)
+		nodeActivated(node);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+void ExplorationTree::dirCollapsed(DirectoryController* dirPresenter) {
+	//nop
+}
+
+void ExplorationTree::dirExpanded(DirectoryController* dirPresenter) {
+	if (!dirPresenter)
+		return;
+
+	dirPresenter->expand();
+}
+
+void ExplorationTree::nodeExpanded(VirtualNode* expandedNode) {
+	if (!expandedNode)
+		return;
+
+	DirectoryController* dirPresenter = _dirMap->getDirFor(expandedNode);
+	dirExpanded(dirPresenter);
+}
+
+void ExplorationTree::itemExpanding(wxTreeItemId item) {
+	VirtualNode* node = getNode(item);
+	if (node)
+		nodeExpanded(node);
+}
+
+void ExplorationTree::itemExpanded(wxTreeItemId item) {
+	VirtualNode* node = getNode(item);
+	if (node) {
+		//realizeVisible();
+
+		//TODO: make it nicer
+		//WORKAROUND: adding Dummies
+		ASSERT_VALID_TREE_ITEM(item);
+		wxTreeItemIdValue cookie;
+		wxTreeItemId child = _explorationTree->GetFirstChild(item, cookie);
+		while (child.IsOk()) {
+			if (!isNodeRealized(child)) {
+				wxTreeItemIdValue cookie2;
+				wxTreeItemId child2 = _explorationTree->GetFirstChild(child, cookie2);
+				if (!child2.IsOk())
+					_explorationTree->AppendItem(child, wxT("Dummy"), -1, -1, NULL); //WORKAROUND
+			}
+
+			child = _explorationTree->GetNextChild(item, cookie);
+		}
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+void ExplorationTree::registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
+	_panelMap->registerPanelProvider(node, panelProvider);
+}
+void ExplorationTree::unregisterPanelProvider(PanelProvider* panelProvider) {
+	_panelMap->unregisterPanelProvider(panelProvider);
+}
+
+void ExplorationTree::registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter) {
+	_dirMap->registerDirectoryPresenter(node, dirPresenter);
+}
+void ExplorationTree::unregisterDirectoryPresenter(DirectoryController* dirPresenter) {
+	_dirMap->unregisterDirectoryPresenter(dirPresenter);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/ExplorationTree.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,105 @@
+/////////////////////////////////////////////////////////////////////////////
+// ExplorationTree.h
+
+#ifndef _EXPLORATION_TREE_H_
+#define _EXPLORATION_TREE_H_
+
+#include <wx/wx.h>
+
+#include <wx/notebook.h>
+#include <wx/treectrl.h>
+#include <wx/panel.h>
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+#define ASSERT_VALID_TREE_ITEM(item) \
+	ASSERT(item.IsOk())
+
+struct PanelInfo;
+struct PanelMap;
+struct DirMap;
+class VirtualNode;
+class PanelProvider;
+class DirectoryController;
+class ObjectChain;
+
+//ExplorationTree's items does not hold any objects by reference. They do however hold
+//them via SetItemData( new VirtualNodeItemData(BObject*) ).
+//ExplorationTree holds objects by reference via _rootObjectChain, though.
+class ExplorationTree {
+	static ExplorationTree* _instance;
+
+	wxTreeCtrl* _explorationTree;
+	wxNotebook* _panelNotebook;
+
+	ObjectChain* _rootObjectChain;
+
+	PanelMap* _panelMap;
+	VirtualNode* _activeNode;
+	DirMap* _dirMap;
+
+	int _notCompletedCount;
+
+private:
+	ExplorationTree();
+	~ExplorationTree();
+
+public:
+	static bool canGet();
+	static ExplorationTree* get();
+	static void release();
+
+	static void initialize(wxTreeCtrl* explorationTree, wxNotebook* panelNotebook);
+
+	//static wxTreeCtrl* _getTree();
+	//wxTreeCtrl* getTree();
+	bool onIdleRec(const wxTreeItemId& item);
+	bool onIdle();
+	void realizeVisible(bool dirsOnly = true);
+	bool isNodeRealized(const wxTreeItemId& item);
+	bool realizeNode(const wxTreeItemId& item, bool dirsOnly = false);
+	VirtualNode* getNode(const wxTreeItemId& item);
+	VirtualNode* getSelectedNode();
+
+	wxTreeItemId getSelected();
+	wxTreeItemId appendItem(const wxTreeItemId& parent, wxString title);
+	void deleteItem(const wxTreeItemId& item);
+	void deleteChildren(const wxTreeItemId& parent);
+	void setItemData(const wxTreeItemId& item, wxTreeItemData* data);
+	wxTreeItemData* getItemData(const wxTreeItemId& item);
+	wxTreeItemId getItemParent(const wxTreeItemId& item);
+	wxString getItemText(const wxTreeItemId& item);
+	wxTreeItemId addRoot(wxString title);
+	void deleteAllItems();
+
+	ObjectChain* getRootObjectChain();
+
+	void pinfoDeactivate(PanelInfo* pinfo);
+	void pinfoActivate(PanelInfo* pinfo);
+	void nodeDeactivate();
+	void nodeActivated(VirtualNode* activatedNode);
+
+	void dirCollapsed(DirectoryController* dirPresenter);
+	void dirExpanded(DirectoryController* dirPresenter);
+	void nodeExpanded(VirtualNode* expandedNode);
+
+	void itemActivated(wxTreeItemId item);
+	void itemExpanding(wxTreeItemId item);
+	void itemExpanded(wxTreeItemId item);
+
+	void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider);
+	void unregisterPanelProvider(PanelProvider* panelProvider);
+
+	void registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter);
+	void unregisterDirectoryPresenter(DirectoryController* dirPresenter);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_EXPLORATION_TREE_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRecognizer.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/FileTypeRecognizer.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRecognizer.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRecognizer.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,139 @@
+/////////////////////////////////////////////////////////////////////////////
+// FileTypeRecognizer.cpp
+
+#include "plugins_stdafx.h"
+
+#include "FileTypeRecognizer.h"
+
+#include "VirtualNode.h"
+#include "ochain.h"
+
+#include "CoreFileTypes.h"
+
+#include "safe_static.h"
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Static fields
+
+SAFE_CLASS_STATIC(RecognizedFileType, NotRecognized, RecognizedFileType,
+				  (NO_MATCH, BGUID::Unknown()) )
+
+SAFE_STATIC(_empty_guid_list, guid_list, EMPTY_INITIALIZER)
+SAFE_CLASS_STATIC(ResolvedFileTypeParsers, NoParsers, ResolvedFileTypeParsers,
+				  (NO_PARSERS, _empty_guid_list()) )
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+RecognizedFileType BinaryFileTypeRecognizer::recognize(VirtualFile* file) {
+	return RecognizedFileType(POOR_MATCH, CoreFileTypes::binaryFileTypeGUID());
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ResolvedFileTypeParsers BinaryFileTypeParserResolver::resolve(const BGUID& fileType) {
+	guid_list parsers;
+	if (fileType != CoreFileTypes::binaryFileTypeGUID())
+		return ResolvedFileTypeParsers::NoParsers();
+
+	parsers.push_back(CoreFileTypes::binaryParserGUID());
+	parsers.push_back(CoreFileTypes::fileInfoPresenterGUID());
+
+	return ResolvedFileTypeParsers(IDEAL_PARSERS, parsers);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+RecognizedFileType GenericFileTypeRecognizer::recognize(VirtualFile* file) {
+	RCPtr<BObject> _file(file);
+	RCPtr<BObject> _this(this);
+
+	ObjectChain chain; //it will be automatically unrealized
+	chain.addObject( _file );
+	chain.addObject( _this );
+	chain.connect(_file, _this, IFile::static_GUID());
+	if (!chain.realize())
+		return RecognizedFileType::NotRecognized();
+
+	IFile* ifile = _fileSlot->getInterface();
+	if (!ifile)
+		return RecognizedFileType::NotRecognized();
+
+	RecognizedFileType recognized = doRecognize(file, ifile);
+
+	_fileSlot->releaseInterface();
+
+	return recognized;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+RecognizedFileType TextFileTypeRecognizer::doRecognize(VirtualFile* file, IFile* ifile) {
+
+	wxString name = ifile->getName();
+	if (name.EndsWith(wxT(".txt")))
+		return RecognizedFileType(GOOD_MATCH, CoreFileTypes::textFileTypeGUID());
+
+	return RecognizedFileType::NotRecognized();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ResolvedFileTypeParsers TextFileTypeParserResolver::resolve(const BGUID& fileType) {
+	if (fileType != CoreFileTypes::textFileTypeGUID())
+		return ResolvedFileTypeParsers::NoParsers();
+
+	guid_list parsers;
+
+	parsers.push_back(CoreFileTypes::textParserGUID());
+	parsers.push_back(CoreFileTypes::fileInfoPresenterGUID());
+
+	return ResolvedFileTypeParsers(IDEAL_PARSERS, parsers);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+RecognizedFileType BMPFileTypeRecognizer::doRecognize(VirtualFile* file, IFile* ifile) {
+	Common::SeekableReadStream* stream = ifile->getStream();
+	if (!stream)
+		return RecognizedFileType::NotRecognized();
+
+	stream->seek(0, SEEK_SET);
+	byte b = stream->readByte();
+	byte m = stream->readByte();
+
+	if ( b != 'B' || m != 'M' )
+		return RecognizedFileType::NotRecognized();
+
+	return RecognizedFileType(IDEAL_MATCH, CoreFileTypes::bmpFileTypeGUID());
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+ResolvedFileTypeParsers BMPFileTypeParserResolver::resolve(const BGUID& fileType) {
+	if (fileType != CoreFileTypes::bmpFileTypeGUID())
+		return ResolvedFileTypeParsers::NoParsers();
+
+	guid_list parsers;
+
+	parsers.push_back(CoreFileTypes::bmpParserGUID());
+	parsers.push_back(CoreFileTypes::fileInfoPresenterGUID());
+
+	return ResolvedFileTypeParsers(IDEAL_PARSERS, parsers);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRegistry.cpp (from rev 28027, scummex/branches/gsoc2007-gameresbrowser/src/browser/ftregistry.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRegistry.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/FileTypeRegistry.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,151 @@
+/////////////////////////////////////////////////////////////////////////////
+// FileTypeRegistry.cpp
+//
+// Declares FileTypeRegistry
+// Plugins are registered into FileTypeRegistry by ObjectRegistry.
+//
+
+#include "plugins_stdafx.h"
+
+#include "FileTypeRegistry.h"
+#include "ObjectRegistry.h"
+
+#include <algorithm>
+#include <vector>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// The FileTypeRegistry
+
+FileTypeRegistry* FileTypeRegistry::_instance = NULL;
+
+/*static*/ FileTypeRegistry* FileTypeRegistry::get() {
+	if (!_instance)
+		_instance = new FileTypeRegistry();
+
+	return _instance;
+}
+
+/*static*/ void FileTypeRegistry::release() {
+	if (_instance)
+		delete _instance;
+	_instance = NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Plugin registration
+
+void FileTypeRegistry::registerPlugins() {
+
+	std::list<const ObjectPlugin*> plugins;
+	std::list<const ObjectPlugin*>::const_iterator j;
+	object_list::iterator i;
+	
+	plugins = ObjectRegistry::get()->findObjectsWithFlags(IS_FILE_TYPE_RECOGNIZER);
+	for (j = plugins.begin(); j != plugins.end(); ++j) {
+		const ObjectPlugin* oplug = *j;
+		const BGUID& objGUID = oplug->getObjectGUID();
+		for (i = _recognizers.begin(); i != _recognizers.end(); ++i) {
+			RCPtr<BObject> recognizer = *i;
+			if (recognizer->get_GUID() == objGUID)
+				goto skip_recognizer;
+		}
+		RCPtr<BObject> recognizer( oplug->newInstance() );
+		_recognizers.push_back(recognizer);
+skip_recognizer:
+	}
+
+	plugins = ObjectRegistry::get()->findObjectsWithFlags(IS_FILE_TYPE_RESOLVER);
+	for (j = plugins.begin(); j != plugins.end(); ++j) {
+		const ObjectPlugin* oplug = *j;
+		const BGUID& objGUID = oplug->getObjectGUID();
+		for (i = _resolvers.begin(); i != _resolvers.end(); ++i) {
+			RCPtr<BObject> resolver = *i;
+			if (resolver->get_GUID() == objGUID)
+				goto skip_resolver;
+		}
+		RCPtr<BObject> resolver( oplug->newInstance() );
+		_resolvers.push_back(resolver);
+skip_resolver:
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// File type recognition
+
+//return properly sorted list of fileTypes
+RecognizedFileTypes FileTypeRegistry::recognizeFileType(VirtualFile* file) {
+	RecognizedFileTypes fileTypes;
+
+	object_list::iterator i;
+	for (i = _recognizers.begin(); i != _recognizers.end(); ++i) {
+		BObject* obj = (*i).get();
+		FileTypeRecognizer* recognizer = dynamic_cast<FileTypeRecognizer*>(obj);
+		ASSERT(recognizer);
+		RecognizedFileType fileType = recognizer->recognize(file);
+		if (fileType.isOk())
+			fileTypes.push_back( fileType );
+	}
+
+	//FIXME: VC++'s STL can't sort std::list - Ughhh...
+	std::vector<RecognizedFileType> types( fileTypes.begin(), fileTypes.end() );
+	std::sort( types.begin(), types.end() );
+	RecognizedFileTypes outTypes( types.begin(), types.end() );
+
+	return outTypes;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Parser resolving
+
+guid_list FileTypeRegistry::resolveParsers(VirtualFile* file, RecognizedFileType& outFileType) {
+	RecognizedFileTypes fileTypes( recognizeFileType(file) );
+
+	RecognizedFileTypes::iterator i;
+	for (i = fileTypes.begin(); i != fileTypes.end(); ++i) {
+		BGUID fileType = i->getFileTypeGUID();
+
+		ResolvedFileTypeParsers parsers( resolveParsers(fileType) );
+		if (parsers.isOk()) {
+			outFileType = *i;
+			return parsers._parserGUIDs;
+		}
+	}
+
+	outFileType = RecognizedFileType::NotRecognized();
+	return guid_list();
+}
+
+ResolvedFileTypeParsers FileTypeRegistry::resolveParsers(const BGUID& fileType) {
+	ResolvedFileTypeParsers bestParsers(ResolvedFileTypeParsers::NoParsers());
+
+	object_list::iterator i;
+	for (i = _resolvers.begin(); i != _resolvers.end(); ++i) {
+		BObject* obj = (*i).get();
+		FileTypeParserResolver* resolver = dynamic_cast<FileTypeParserResolver*>(obj);
+		ASSERT(resolver);
+		ResolvedFileTypeParsers parsers = resolver->resolve(fileType);
+		if (parsers.isOk()) {
+			if (!bestParsers.isOk())
+				bestParsers = parsers;
+			if (parsers < bestParsers)
+				bestParsers = parsers;
+			if (bestParsers._priority == IDEAL_PARSERS)
+				return bestParsers;
+		}
+	}
+
+	return bestParsers;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/GUIInterfaces.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,36 @@
+/////////////////////////////////////////////////////////////////////////////
+// GUIInterfaces.cpp
+
+#include "plugins_stdafx.h"
+
+#include "GUIInterfaces.h"
+
+#include <iostream>
+
+#include <wx/image.h>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Concrete implementations of the interfaces
+
+IImageImpl::IImageImpl(wxImage* image, bool ownImage /*= false*/)
+	: _image(image), _ownImage(ownImage) {}
+
+wxImage* IImageImpl::getImage() {
+	//infoout << wxT("IImageImpl::getImage()") << std::endl;
+	return _image;
+}
+
+IImageImpl::~IImageImpl() {
+	if (_ownImage)
+		delete _image;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/GUIInterfaces.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/GUIInterfaces.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,46 @@
+/////////////////////////////////////////////////////////////////////////////
+// GUIInterfaces.h
+
+#ifndef _GUI_INTERFACES_H_
+#define _GUI_INTERFACES_H_
+
+#include "pinslot.h"
+
+class wxImage;
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Interfaces
+
+class IImage : public IInterface {
+public:
+	GUID_FOR(IImage, wxT("GUIInterfaces"), 1)
+	virtual wxImage* getImage() = 0;
+	virtual void release() {
+		delete this;
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Concrete implementations of the interfaces
+
+class IImageImpl : public IImage {
+protected:
+	wxImage* _image;
+	bool _ownImage;
+public:
+	//inherit guid - it's a concrete implementation of an abstract interface
+	IImageImpl(wxImage* image, bool ownImage = false);
+	virtual wxImage* getImage();
+	virtual ~IImageImpl();
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser
+
+#endif // _GUI_INTERFACES_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/PanelProvider.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,62 @@
+/////////////////////////////////////////////////////////////////////////////
+// PanelProvider.cpp
+
+#include "gui_stdafx.h"
+
+#include "PanelProvider.h"
+#include "ExplorationTree.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+SLOT_DESCS_EX(PanelProvider)
+	SLOT_DESC(_panelRecieverSlot, SLOT_DEFAULT)
+	SLOT_DESC(_nodeSlot, SLOT_DEFAULT)
+END_DESCS
+
+bool PanelProvider::doRealize(ObjectChain* ochain) {
+	bool res = BObject::doRealize(ochain);
+	if (!res)
+		return false;
+
+	_ipanelreciever = _panelRecieverSlot->getInterface();
+	_inodeprovider = _nodeSlot->getInterface();
+	if (!_ipanelreciever || !_inodeprovider) {
+		doUnrealize(ochain);
+		return false;
+	}
+
+	ExplorationTree::get()->registerPanelProvider(_inodeprovider->getNode(), this);
+
+	return true;
+}
+
+void PanelProvider::doUnrealize(ObjectChain* ochain) {
+	ExplorationTree::get()->unregisterPanelProvider(this);
+
+	_panelRecieverSlot->releaseInterface();
+	_nodeSlot->releaseInterface();
+
+	BObject::doUnrealize(ochain);
+}
+
+coreString PanelProvider::getPanelTitle() {
+	return _ipanelreciever->getPanelTitle();
+}
+void PanelProvider::panelActivate(wxPanel* panel) {
+	_ipanelreciever->panelActivate(panel);
+}
+void PanelProvider::panelDeactivate() {
+	_ipanelreciever->panelDeactivate();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/PanelProvider.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/PanelProvider.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,89 @@
+/////////////////////////////////////////////////////////////////////////////
+// PanelProvider.h
+
+#ifndef _PANEL_PROVIDER_H_
+#define _PANEL_PROVIDER_H_
+
+#include <wx/wx.h>
+
+#include "pinslot.h"
+#include "VirtualNode.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class PanelReciever {
+public:
+	virtual coreString getPanelTitle() = 0;
+	virtual void panelActivate(wxPanel* panel) = 0;
+	virtual void panelDeactivate() = 0;
+};
+
+class IPanelReciever : public IInterface, public PanelReciever {
+public:
+	GUID_FOR(IPanelReciever, wxT("CoreInterfaces"), 1);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//IPanelRecieverImpl delegates method invocations to the apropraiate PanelReciever (_that)
+class IPanelRecieverImpl : public IPanelReciever {
+protected:
+	PanelReciever* _that;
+public:
+	//inherit guid - it's a concrete implementation of an abstract interface
+	IPanelRecieverImpl(PanelReciever* that)
+		: _that(that) {}
+	virtual coreString getPanelTitle() {
+		return _that->getPanelTitle();
+	}
+	virtual void panelActivate(wxPanel* panel) {
+		_that->panelActivate(panel);
+	}
+	virtual void panelDeactivate() {
+		_that->panelDeactivate();
+	}
+	void release() {
+		delete this;
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+// How the PanelProvider works:
+//  PanelProvider registers itself in ExplorationTree.
+//  PanelProvider is then delegating PanelReciever methods from ExplorationTree,
+//  via IPanelReciever slot, to the proper object.
+
+class PanelProvider : public BObject, public PanelReciever {
+	DECLARE_BOBJECT_CLASS(PanelProvider, BObject)
+
+protected:
+	Slot<IPanelReciever>* _panelRecieverSlot;
+	Slot<INodeProvider>* _nodeSlot;
+
+	IPanelReciever* _ipanelreciever;
+	INodeProvider* _inodeprovider;
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	SLOTS_DECL
+
+	virtual bool doRealize(ObjectChain* ochain);
+	virtual void doUnrealize(ObjectChain* ochain);
+
+	virtual coreString getPanelTitle();
+	virtual void panelActivate(wxPanel* panel);
+	virtual void panelDeactivate();
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_PANEL_PROVIDER_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/gui/VirtualNode.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,118 @@
+/////////////////////////////////////////////////////////////////////////////
+// VirtualNode.cpp
+
+#include "gui_stdafx.h"
+
+#include "VirtualNode.h"
+
+#include "ExplorationTree.h"
+#include "common/simplefile.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+VirtualNodeItemData::VirtualNodeItemData(VirtualNode* node, ObjectChain* ochain)
+	: _node(node), _ochain(ochain), _realized(false), _completed(false) {}
+
+VirtualNode* VirtualNodeItemData::getNode() {
+	return _node;
+}
+
+bool VirtualNodeItemData::getRealized() {
+	return _realized;
+}
+
+void VirtualNodeItemData::setRealized(bool realized) {
+	_realized = realized;
+}
+
+bool VirtualNodeItemData::getCompleted() {
+	return _completed;
+}
+
+void VirtualNodeItemData::setCompleted(bool completed) {
+	_completed = completed;
+}
+
+ObjectChain* VirtualNodeItemData::getObjectChain() {
+	return _ochain;
+}
+
+void VirtualNodeItemData::setObjectChain(ObjectChain* ochain) {
+	_ochain = ochain;
+}
+
+
+/*static*/ VirtualNodeItemData* VirtualNodeItemData::getForNode(const wxTreeItemId& item) {
+	if (!item.IsOk())
+		return NULL;
+	VirtualNodeItemData* data = static_cast<VirtualNodeItemData*>
+		(ExplorationTree::get()->getItemData(item));
+	return data;
+}
+
+/*static*/ VirtualNode* VirtualNodeItemData::getNode(const wxTreeItemId& item) {
+	VirtualNodeItemData* data = getForNode(item);
+	if (!data)
+		return NULL;
+	return data->getNode();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class INodeProviderImpl : public INodeProvider {
+protected:
+	VirtualNode* _node;
+public:
+	//inherit guid - it's a concrete implementation of an abstract interface
+	INodeProviderImpl(VirtualNode* node)
+		: _node(node) {}
+
+	virtual VirtualNode* getNode() {
+		//infoout << wxT("INodeProviderImpl::getNode()") << std::endl;
+		ASSERT_VALID(_node);
+		return _node;
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+VirtualNode* VirtualNode::getParent() {
+	ASSERT(_mineTreeItem.IsOk());
+	wxTreeItemId parentTreeItem = ExplorationTree::get()->getItemParent(_mineTreeItem);
+	return VirtualNodeItemData::getNode(parentTreeItem);
+}
+
+wxString VirtualNode::getTreeItemName() {
+	ASSERT(_mineTreeItem.IsOk());
+	wxString name = ExplorationTree::get()->getItemText(_mineTreeItem);
+	return name;
+}
+
+
+PIN_DESCS_EX(VirtualNode)
+	PIN_DESC(_nodePin, PIN_MULTICAST, getNodeProviderImpl, releaseNodeProviderImpl)
+END_DESCS
+
+INodeProviderImpl* VirtualNode::getNodeProviderImpl() {
+	//infoout << wxT("VirtualNode::getNodeProviderImpl()") << std::endl;
+	return new INodeProviderImpl(this);
+}
+
+void VirtualNode::releaseNodeProviderImpl(INodeProviderImpl* iface) {
+	//infoout << wxT("VirtualNode::releaseNodeProviderImpl()") << std::endl;
+	delete iface;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/VirtualNode.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/VirtualNode.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,200 @@
+/////////////////////////////////////////////////////////////////////////////
+// VirtualNode.h
+
+#ifndef _VIRTUAL_NODE_H_
+#define _VIRTUAL_NODE_H_
+
+#include "core_stdafx.h"
+
+#include "pinslot.h"
+
+#include "CoreInterfaces.h"
+
+#include <wx/treectrl.h> //for wxTreeItemId
+
+namespace Browser {
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class VirtualNode;
+class ObjectChain;
+
+class VirtualNodeItemData : public wxTreeItemData {
+	VirtualNode* _node;
+	bool _realized;
+	bool _completed;
+	ObjectChain* _ochain;
+
+public:
+	VirtualNodeItemData(VirtualNode* node, ObjectChain* ochain);
+	//virtual ~VirtualNodeItemData() {}
+
+	VirtualNode* getNode();
+	bool getRealized();
+	void setRealized(bool realized);
+	bool getCompleted();
+	void setCompleted(bool completed);
+	ObjectChain* getObjectChain();
+	void setObjectChain(ObjectChain* ochain);
+
+	static VirtualNodeItemData* getForNode(const wxTreeItemId& item);
+	static VirtualNode* getNode(const wxTreeItemId& item);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class INodeProvider : public IInterface {
+public:
+	GUID_FOR(INodeProvider, wxT("CoreInterfaces"), 1);
+	virtual VirtualNode* getNode() = 0;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class INodeProviderImpl;
+
+//TODO: make it realizable in multiple chains
+class VirtualNode : public BObject {
+	DECLARE_BOBJECT_CLASS(VirtualNode, BObject)
+
+	//coreString _name;
+	wxTreeItemId _mineTreeItem;
+
+protected:
+	Pin<INodeProvider>* _nodePin;
+
+	VirtualNode() {}
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PINS_DECL
+
+	VirtualNode(wxTreeItemId mineTreeItem)
+		: _mineTreeItem(mineTreeItem) {
+		ASSERT(_mineTreeItem.IsOk());
+	}
+
+	/*const coreString& getName() {
+		return _name;
+	}*/
+
+	wxTreeItemId getTreeItem() {
+		ASSERT(_mineTreeItem.IsOk());
+		return _mineTreeItem;
+	}
+	wxString getTreeItemName();
+
+	void setTreeItem(wxTreeItemId mineTreeItem) {
+		ASSERT(mineTreeItem.IsOk());
+		_mineTreeItem = mineTreeItem;
+	}
+
+	VirtualNode* getParent();
+
+	INodeProviderImpl* getNodeProviderImpl();
+	void releaseNodeProviderImpl(INodeProviderImpl* iface);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//this class defines an object that can deliver given IFile interface
+class VirtualFile : public VirtualNode {
+	DECLARE_BOBJECT_CLASS(VirtualFile, VirtualNode)
+
+protected:
+	Pin<IFile>* _filePin;
+	Pin<IStream>* _streamPin;
+
+	int _taken;
+	IFile* _ifile;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PIN_DESCS
+		PIN_DESC(_filePin, PIN_DEFAULT | PIN_MULTICAST, getFile, releaseFile)
+		PIN_DESC(_streamPin, PIN_DEFAULT | PIN_MULTICAST, getFile, releaseFile)
+	END_DESCS
+
+	VirtualFile(wxTreeItemId mineTreeItem, IFile* ifile)
+		: VirtualNode(mineTreeItem), _taken(0), _ifile(ifile) {}
+
+	~VirtualFile() {
+		ASSERT(_taken == 0);
+	}
+
+	IFile* getFile() {
+		_taken++;
+		return _ifile;
+	}
+	void releaseFile(IFile* iface) {
+		_taken--;
+	}
+
+	bool isTaken() {
+		return _taken > 0;
+	}
+
+	virtual coreString dumpName() {
+		if (!_ifile)
+			return wxT("VirtualFile-NULL_ifile");
+		return _ifile->getName();
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//this class defines an object that can deliver given IDirectory interface
+class VirtualDirectory : public VirtualNode {
+	DECLARE_BOBJECT_CLASS(VirtualDirectory, VirtualNode)
+
+protected:
+	Pin<IDirectory>* _directoryPin;
+
+	int _taken;
+	IDirectory* _idirectory;
+
+public:
+	ASSIGN_DESC(0,wxT("CoreObjects"), 1)
+
+	PIN_DESCS
+		PIN_DESC(_directoryPin, PIN_DEFAULT | PIN_MULTICAST, getDirectory, releaseDirectory)
+	END_DESCS
+
+	VirtualDirectory(wxTreeItemId mineTreeItem, IDirectory* idirectory)
+		: VirtualNode(mineTreeItem), _taken(0), _idirectory(idirectory) {}
+
+	~VirtualDirectory() {
+		ASSERT(_taken == 0);
+	}
+
+	IDirectory* getDirectory() {
+		_taken++;
+		return _idirectory;
+	}
+	void releaseDirectory(IDirectory* iface) {
+		_taken--;
+	}
+
+	bool isTaken() {
+		return _taken > 0;
+	}
+
+	virtual coreString dumpName() {
+		if (!_idirectory)
+			return wxT("VirtualDirectory-NULL_idirectory");
+		return _idirectory->getName();
+	}
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
+
+#endif //_VIRTUAL_NODE_H_

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/plugins_stdafx.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// PinSlot.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "plugins_stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file

Copied: scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/plugins_stdafx.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/browser_stdafx.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,24 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#ifndef _BROWSER_STDAFX_H_
+#define _BROWSER_STDAFX_H_
+
+// TODO: reference additional headers your program requires here
+
+#include "core_stdafx.h"
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+//just to make compilation faster
+#ifdef WX_PRECOMP
+#include "pinslot.h"
+#endif
+
+#endif //_BROWSER_STDAFX_H_

Deleted: scummex/branches/gsoc2007-gameresbrowser/src/browser/ftregistry.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ftregistry.cpp	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ftregistry.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -1,151 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// FileTypeRegistry.cpp
-//
-// Declares FileTypeRegistry
-// Plugins are registered into FileTypeRegistry by ObjectRegistry.
-//
-
-#include "plugins_stdafx.h"
-
-#include "FileTypeRegistry.h"
-#include "ObjectRegistry.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "debugmem.h"
-
-namespace Browser {
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-// The FileTypeRegistry
-
-FileTypeRegistry* FileTypeRegistry::_instance = NULL;
-
-/*static*/ FileTypeRegistry* FileTypeRegistry::get() {
-	if (!_instance)
-		_instance = new FileTypeRegistry();
-
-	return _instance;
-}
-
-/*static*/ void FileTypeRegistry::release() {
-	if (_instance)
-		delete _instance;
-	_instance = NULL;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-// Plugin registration
-
-void FileTypeRegistry::registerPlugins() {
-
-	std::list<const ObjectPlugin*> plugins;
-	std::list<const ObjectPlugin*>::const_iterator j;
-	object_list::iterator i;
-	
-	plugins = ObjectRegistry::get()->findObjectsWithFlags(IS_FILE_TYPE_RECOGNIZER);
-	for (j = plugins.begin(); j != plugins.end(); ++j) {
-		const ObjectPlugin* oplug = *j;
-		const BGUID& objGUID = oplug->getObjectGUID();
-		for (i = _recognizers.begin(); i != _recognizers.end(); ++i) {
-			RCPtr<BObject> recognizer = *i;
-			if (recognizer->get_GUID() == objGUID)
-				goto skip_recognizer;
-		}
-		RCPtr<BObject> recognizer( oplug->newInstance() );
-		_recognizers.push_back(recognizer);
-skip_recognizer:
-	}
-
-	plugins = ObjectRegistry::get()->findObjectsWithFlags(IS_FILE_TYPE_RESOLVER);
-	for (j = plugins.begin(); j != plugins.end(); ++j) {
-		const ObjectPlugin* oplug = *j;
-		const BGUID& objGUID = oplug->getObjectGUID();
-		for (i = _resolvers.begin(); i != _resolvers.end(); ++i) {
-			RCPtr<BObject> resolver = *i;
-			if (resolver->get_GUID() == objGUID)
-				goto skip_resolver;
-		}
-		RCPtr<BObject> resolver( oplug->newInstance() );
-		_resolvers.push_back(resolver);
-skip_resolver:
-	}
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-// File type recognition
-
-//return properly sorted list of fileTypes
-RecognizedFileTypes FileTypeRegistry::recognizeFileType(VirtualFile* file) {
-	RecognizedFileTypes fileTypes;
-
-	object_list::iterator i;
-	for (i = _recognizers.begin(); i != _recognizers.end(); ++i) {
-		BObject* obj = (*i).get();
-		FileTypeRecognizer* recognizer = dynamic_cast<FileTypeRecognizer*>(obj);
-		ASSERT(recognizer);
-		RecognizedFileType fileType = recognizer->recognize(file);
-		if (fileType.isOk())
-			fileTypes.push_back( fileType );
-	}
-
-	//FIXME: VC++'s STL can't sort std::list - Ughhh...
-	std::vector<RecognizedFileType> types( fileTypes.begin(), fileTypes.end() );
-	std::sort( types.begin(), types.end() );
-	RecognizedFileTypes outTypes( types.begin(), types.end() );
-
-	return outTypes;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-// Parser resolving
-
-guid_list FileTypeRegistry::resolveParsers(VirtualFile* file, RecognizedFileType& outFileType) {
-	RecognizedFileTypes fileTypes( recognizeFileType(file) );
-
-	RecognizedFileTypes::iterator i;
-	for (i = fileTypes.begin(); i != fileTypes.end(); ++i) {
-		BGUID fileType = i->getFileTypeGUID();
-
-		ResolvedFileTypeParsers parsers( resolveParsers(fileType) );
-		if (parsers.isOk()) {
-			outFileType = *i;
-			return parsers._parserGUIDs;
-		}
-	}
-
-	outFileType = RecognizedFileType::NotRecognized();
-	return guid_list();
-}
-
-ResolvedFileTypeParsers FileTypeRegistry::resolveParsers(const BGUID& fileType) {
-	ResolvedFileTypeParsers bestParsers(ResolvedFileTypeParsers::NoParsers());
-
-	object_list::iterator i;
-	for (i = _resolvers.begin(); i != _resolvers.end(); ++i) {
-		BObject* obj = (*i).get();
-		FileTypeParserResolver* resolver = dynamic_cast<FileTypeParserResolver*>(obj);
-		ASSERT(resolver);
-		ResolvedFileTypeParsers parsers = resolver->resolve(fileType);
-		if (parsers.isOk()) {
-			if (!bestParsers.isOk())
-				bestParsers = parsers;
-			if (parsers < bestParsers)
-				bestParsers = parsers;
-			if (bestParsers._priority == IDEAL_PARSERS)
-				return bestParsers;
-		}
-	}
-
-	return bestParsers;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-} // namespace Browser

Added: scummex/branches/gsoc2007-gameresbrowser/src/browser/plugin_api.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/plugin_api.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/plugin_api.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,91 @@
+/////////////////////////////////////////////////////////////////////////////
+// Plugin API
+
+#include "gui_stdafx.h"
+
+#include "MainForm.h"
+#include "ExplorationTree.h"
+#include "VirtualNode.h"
+
+#include <iostream>
+#include <list>
+
+#include <wx/filedlg.h>
+#include <wx/wfstream.h>
+#include <wx/stdpaths.h>
+
+#include "ochain.h"
+
+#include "debugmem.h"
+
+using namespace Browser;
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//outputs a Native path
+wxString getResourcesDir() {
+#ifdef UNIX
+	wxFileName execFN(wxStandardPaths::Get().GetExecutablePath());
+	wxStandardPaths::Get().SetInstallPrefix(execFN.GetPath());
+#endif
+	wxString dataDir = wxStandardPaths::Get().GetResourcesDir();
+	return dataDir;
+}
+
+//expects input as Linux path relative to the resources dir, outputs a Native path
+wxString getResourcePath(const wxString& resourceName) {
+	wxString dataDir = getResourcesDir();
+	wxFileName dataFN(dataDir, wxEmptyString, wxPATH_NATIVE);
+	wxFileName resFN(resourceName, wxPATH_UNIX);
+	for (int i = 0; i < resFN.GetDirCount(); ++i)
+		dataFN.AppendDir(resFN.GetDirs()[i]);
+	if (resFN.HasName())
+		dataFN.SetName(resFN.GetName());
+	if (resFN.HasExt())
+		dataFN.SetExt(resFN.GetExt());
+	return dataFN.GetFullPath(wxPATH_NATIVE);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+//outputs a Native path
+wxString getPluginsDir() {
+#ifdef UNIX
+	wxFileName execFN(wxStandardPaths::Get().GetExecutablePath());
+	wxStandardPaths::Get().SetInstallPrefix(execFN.GetPath());
+#endif
+	wxString dataDir = wxStandardPaths::Get().GetPluginsDir();
+	return dataDir;
+}
+
+//expects input as Linux path relative to the resources dir, outputs a Native path
+wxString getPluginPath(const wxString& pluginName) {
+	wxString dataDir = getPluginsDir();
+	wxFileName dataFN(dataDir, wxEmptyString, wxPATH_NATIVE);
+	wxFileName resFN(pluginName, wxPATH_UNIX);
+	for (int i = 0; i < resFN.GetDirCount(); ++i)
+		dataFN.AppendDir(resFN.GetDirs()[i]);
+	if (resFN.HasName())
+		dataFN.SetName(resFN.GetName());
+	if (resFN.HasExt())
+		dataFN.SetExt(resFN.GetExt());
+	return dataFN.GetFullPath(wxPATH_NATIVE);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef UNIX
+#include <dlfcn.h>
+#endif
+
+bool loadPlugin(wxString nativePath) {
+	infoout << wxT("Registering plugin: ") << nativePath << std::endl;
+	LoadLibrary
+		ObjectRegistry::get()->registerPlugin( &getTest2Plugin, false );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////


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

Copied: scummex/branches/gsoc2007-gameresbrowser/src/common (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/core/common)

Copied: scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.cpp (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/wx2scstream.cpp)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.cpp	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,102 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/mstream.cpp
+// Purpose:     wxT("Memory stream") classes
+// Author:      Guilhem Lavaux
+// Modified by: VZ (23.11.00): general code review
+// Created:     04/01/98
+// RCS-ID:      $Id: mstream.cpp, v 1.39 2006/05/03 21:50:25 ABX Exp $
+// Copyright:   (c) Guilhem Lavaux
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes wxT("wx.h").
+#include "plugins_stdafx.h"
+
+#include "wx2scstream.h"
+
+#include "wx/stream.h"
+
+//#include <stdlib.h>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+wxScummInputStream::~wxScummInputStream() {
+	if (_ownStream)
+		delete _stream;
+}
+
+char wxScummInputStream::Peek() {
+	size_t pos = _stream->pos();
+	if ( pos == _size ) {
+		m_lasterror = wxSTREAM_READ_ERROR;
+		return 0;
+	}
+
+	char c = _stream->readSByte();
+	if (_stream->ioFailed()) {
+		m_lasterror = wxSTREAM_READ_ERROR;
+		return 0;
+	}
+
+	_stream->seek(-1, SEEK_CUR);
+	if (_stream->ioFailed()) {
+		m_lasterror = wxSTREAM_READ_ERROR;
+		return 0;
+	}
+
+	return c;
+}
+
+size_t wxScummInputStream::OnSysRead(void *buffer, size_t nbytes) {
+	size_t pos = _stream->pos(); //m_i_streambuf->GetIntPosition();
+	if ( pos == _size ) {
+		m_lasterror = wxSTREAM_EOF;
+
+		return 0;
+	}
+
+	uint32 nread = _stream->read(buffer, (uint32)nbytes);
+	if (_stream->ioFailed()) {
+		//HACK: simplefile stream sets ioFailed when it
+		//      can't read the whole requested batch
+		//m_lasterror = wxSTREAM_READ_ERROR;
+		m_lasterror = wxSTREAM_NO_ERROR;
+		return nread;
+	}
+	m_lasterror = wxSTREAM_NO_ERROR;
+
+	return nread;
+}
+
+wxFileOffset wxScummInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) {
+	int whence = SEEK_SET;
+	if (mode == wxFromCurrent)
+		whence = SEEK_CUR;
+	else
+	if (mode == wxFromEnd)
+		whence = SEEK_END;
+
+	_stream->seek(pos, whence);
+	return _stream->pos();
+}
+
+wxFileOffset wxScummInputStream::OnSysTell() const
+{
+	return _stream->pos();
+}
+
+} // namespace Browser

Copied: scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.h (from rev 28002, scummex/branches/gsoc2007-gameresbrowser/src/plugins/wx2scstream.h)
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.h	                        (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/common/wx2scstream.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -0,0 +1,67 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/mstream.h
+// Purpose:     Memory stream classes
+// Author:      Guilhem Lavaux
+// Modified by:
+// Created:     11/07/98
+// RCS-ID:      $Id: mstream.h, v 1.34 2006/04/14 16:52:56 ABX Exp $
+// Copyright:   (c) Guilhem Lavaux
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_WX2SCUMM_STREAM_H__
+#define _WX_WX2SCUMM_STREAM_H__
+
+//#include "wx/defs.h"
+
+#include <wx/stream.h>
+#include "common/stream.h"
+
+namespace Browser {
+
+class WXDLLIMPEXP_BASE wxScummInputStream : public wxInputStream
+{
+protected:
+	Common::SeekableReadStream* _stream;
+	bool _ownStream;
+	uint32 _size;
+
+public:
+	wxScummInputStream(Common::SeekableReadStream* stream, bool ownStream = false)
+		: _stream(stream), _ownStream(ownStream), _size( _stream->size() ) {}
+
+	virtual ~wxScummInputStream();
+
+	virtual wxFileOffset GetLength() const {
+		return _size;
+	}
+	virtual bool IsSeekable() const {
+		return true; 
+	}
+
+	char Peek();
+
+	wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; }
+
+#if WXWIN_COMPATIBILITY_2_6
+	// deprecated, compatibility only
+	wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const );
+#endif // WXWIN_COMPATIBILITY_2_6
+
+protected:
+	wxStreamBuffer *m_i_streambuf;
+
+	size_t OnSysRead(void *buffer, size_t nbytes);
+	wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
+	wxFileOffset OnSysTell() const;
+
+private:
+	size_t m_length;
+
+	DECLARE_NO_COPY_CLASS(wxScummInputStream)
+};
+
+} // namespace Browser
+
+#endif
+// _WX_WX2SCUMM_STREAM_H__

Modified: scummex/branches/gsoc2007-gameresbrowser/src/core/core_stdafx.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/core/core_stdafx.h	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/core/core_stdafx.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -6,17 +6,16 @@
 #ifndef _CORE_STDAFX_H_
 #define _CORE_STDAFX_H_
 
-//core uses only wxString
-#include <wx/wxprec.h>
+#include <wx/string.h>
 
-#ifndef WX_PRECOMP
-#include <wx/wx.h>
+#ifndef wxUSE_UNICODE
+	#error wxUSE_UNICODE must be defined
 #endif
 
-#include <wx/string.h>
+#if (wxUSE_UNICODE && !defined(_UNICODE)) || (!wxUSE_UNICODE && defined(_UNICODE))
+	#error wxUSE_UNICODE and _UNICODE are inconsistent
+#endif
 
-#define ARRAY_SIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
-
 //CAUTION: wxWidgets redefines _UNICODE!
 #ifdef _UNICODE
 	#define errout std::wcerr
@@ -25,14 +24,14 @@
 	#define strstreamout std::wostringstream
 	#define fstreamout std::wfstream
 	#ifndef stprintf
-	#ifdef _MSC_VER
-		#define stprintf _snwprintf
-	#else
-		#define stprintf swprintf
+		#ifdef _MSC_VER
+			#define stprintf _snwprintf
+		#else
+			#define stprintf swprintf
+		#endif
 	#endif
-	#endif
 	#ifndef tstrcat
-	#define tstrcat wcscat
+		#define tstrcat wcscat
 	#endif
 #else
 	#define errout std::cerr
@@ -41,10 +40,10 @@
 	#define strstreamout std::ostringstream
 	#define fstreamout std::fstream
 	#ifndef stprintf
-	#define stprintf snprintf
+		#define stprintf snprintf
 	#endif
 	#ifndef tstrcat
-	#define tstrcat strcat
+		#define tstrcat strcat
 	#endif
 #endif
 
@@ -52,18 +51,4 @@
 
 #include "tostring.h"
 
-#ifdef WX_PRECOMP
-#include "pinslot.h"
-#endif
-
-#ifndef wxUSE_UNICODE
-	#error wxUSE_UNICODE must be defined
-#endif
-
-#if (wxUSE_UNICODE && !defined(_UNICODE)) || (!wxUSE_UNICODE && defined(_UNICODE))
-	#error wxUSE_UNICODE and _UNICODE are inconsistent
-#endif
-
-// TODO: reference additional headers your program requires here
-
 #endif //_CORE_STDAFX_H_

Deleted: scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.cpp	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -1,37 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// BitmapPanel.cpp
-
-// For compilers that support precompilation, includes wxT("wx/wx.h").
-#include "gui_stdafx.h"
-
-#include "BitmapPanel.h"
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-BEGIN_EVENT_TABLE(BitmapPanel, wxPanel)
-	EVT_PAINT(BitmapPanel::OnPaint)
-	//EVT_ERASE_BACKGROUND(BitmapPanel::OnEraseBackground)
-	//EVT_LEFT_DCLICK(BitmapPanel::OnSave)
-END_EVENT_TABLE()
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-BitmapPanel::BitmapPanel(wxPanel *parent, const wxBitmap& bitmap)
-	: wxPanel(parent), _bitmap(bitmap) {
-	SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
-}
-
-void BitmapPanel::OnPaint(wxPaintEvent& WXUNUSED(event)) {
-	wxPaintDC dc( this );
-	dc.DrawBitmap( _bitmap, 0, 0, true /* use mask */ );
-}
-
-//TODO: draw a checkboard
-/*void BitmapPanel::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) {
-// do nothing here to be able to see how transparent images are shown
-}*/
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////

Deleted: scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.h	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/gui/BitmapPanel.h	2007-07-11 13:48:53 UTC (rev 28029)
@@ -1,34 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// BitmapPanel.h
-
-#ifndef _BITMAP_PANEL_H_
-#define _BITMAP_PANEL_H_
-
-// For compilers that support precompilation, includes wxT("wx/wx.h").
-#include "gui_stdafx.h"
-
-#include <wx/panel.h>
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-class BitmapPanel : public wxPanel
-{
-public:
-	BitmapPanel(wxPanel *parent, const wxBitmap& bitmap);
-
-	void OnPaint(wxPaintEvent& event);
-
-	//TODO: draw a checkboard
-	//void OnEraseBackground(wxEraseEvent& event);
-
-private:
-	wxBitmap _bitmap;
-
-	DECLARE_EVENT_TABLE()
-};
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-#endif // _BITMAP_PANEL_H_

Deleted: scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.cpp	2007-07-11 13:25:21 UTC (rev 28028)
+++ scummex/branches/gsoc2007-gameresbrowser/src/gui/DirectoryPresenter.cpp	2007-07-11 13:48:53 UTC (rev 28029)
@@ -1,240 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// DirectoryPresenter.cpp
-
-#include "gui_stdafx.h"
-
-#include "DirectoryPresenter.h"
-#include "ExplorationTree.h"
-//#include "FilePresenter.h"
-#include "oregistry.h"
-#include "ftregistry.h"
-
-#include <iostream>
-
-#include "debugmem.h"
-
-namespace Browser {
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-SLOT_DESCS_EX(DirectoryPresenter)
-	SLOT_DESC(_directorySlot, SLOT_DEFAULT)
-	SLOT_DESC(_nodeSlot, SLOT_DEFAULT)
-END_DESCS
-
-bool DirectoryPresenter::doRealize(ObjectChain* ochain) {
-	bool res = BObject::doRealize(ochain);
-	if (!res)
-		return false;
-
-	_inodeprovider = _nodeSlot->getInterface();
-	if (!_inodeprovider) {
-		_realized = false;
-		return false;
-	}
-
-	VirtualNode* node = _inodeprovider->getNode();
-	ExplorationTree::get()->registerDirectoryPresenter(node, this);
-	//ExplorationTree::get()->setItemHasChildren(node, true);
-
-	//WORKAROUND: in wxMSW SetItemHasChildren does not work, so we include a Dummy:
-	//wxTreeItemId dummyTreeItem = ExplorationTree::get()->appendItem(
-	//	node->getTreeItem(), wxT("Dummy"));
-
-	_expanded = false;
-
-	return true;
-}
-
-void DirectoryPresenter::doUnrealize(ObjectChain* ochain) {
-	ASSERT(_inodeprovider && _inodeprovider->getNode());
-	infoout << wxT("DirectoryPresenter::unrealize(): ")
-			  //<< (_inodeprovider ? _inodeprovider->getNode()->getTreeItemName().c_str() : wxT("<error>")) << wxT(" ")
-			  << (_idirectory ? _idirectory->getName().c_str() : wxT("<not expanded>")) << wxT(" ")
-			  << std::endl;
-
-	ExplorationTree::get()->unregisterDirectoryPresenter(this);
-
-	deleteKidChains();
-
-	_expanded = false;
-	_idirectory = NULL;
-	_inodeprovider = NULL;
-
-	_directorySlot->releaseInterface();
-	_nodeSlot->releaseInterface();
-
-	BObject::doUnrealize(ochain);
-}
-
-ObjectChain* DirectoryPresenter::prepareKidChain(const RCPtr<VirtualNode>& virtualNode, guid_list& parsers) {
-
-	ObjectChain* kidchain = new ObjectChain();
-
-	bool addingOk = true;
-
-	addingOk &= kidchain->addObject(virtualNode);
-
-	guid_list::iterator i;
-	for (i = parsers.begin(); i != parsers.end(); ++i) {
-		if (!addingOk)
-			break;
-		RCPtr<BObject> parser = ObjectRegistry::get()->getObject( *i );
-		if (parser.get() == NULL) {
-			errout << wxT("ERROR: DirectoryPresenter::prepareKidChain(): can't create parser: ") << (*i) << std::endl;
-			addingOk = false;
-			break;
-		}
-		addingOk &= kidchain->addObject( parser );
-	}
-
-	if (!addingOk) {
-		//ASSERT(false); //failure here means we've got a missing plugin
-		delete kidchain;
-		//virtualNode is deleted automatically
-		return NULL;
-	}
-
-	return kidchain;
-}
-
-void DirectoryPresenter::expand() {
-
-	if (_expanded)
-		return;
-	_expanded = true;
-
-	VirtualNode* parent = _inodeprovider->getNode();
-	ExplorationTree::get()->deleteChildren(parent->getTreeItem()); //delete the Dummy added by the ExplorationTree
-
-	_idirectory = _directorySlot->getInterface();
-	if (!_idirectory) {
-		errout << wxT("ERROR: DirectoryPresenter::expand(): can't get IDirectory interface.") << std::endl;
-		return; //TODO: report error
-	}
-
-	infoout << wxT("DirectoryPresenter::expand(): ") << _idirectory->getName().c_str() << std::endl;
-
-	const std::list<IDirectory*>& subdirs = _idirectory->getSubDirs();
-	std::list<IDirectory*>::const_iterator j;
-	for (j = subdirs.begin(); j != subdirs.end(); ++j) {
-		IDirectory* idirectory = *j;
-
-		wxTreeItemId kidTreeItem = ExplorationTree::get()->appendItem(
-			parent->getTreeItem(), idirectory->getName());
-
-		RCPtr<VirtualNode> virtualDir( new VirtualDirectory(kidTreeItem, idirectory) );
-
-		VirtualNodeItemData* itemData = new VirtualNodeItemData(virtualDir.get(), NULL);
-		ExplorationTree::get()->setItemData(kidTreeItem, itemData);
-
-		guid_list parsers;
-		//could omit it - ObjectChain::complete() would find it
-		parsers.push_back( DirectoryPresenter::static_GUID() );
-
-		ObjectChain* kidchain = prepareKidChain(virtualDir, parsers);
-		if (!kidchain) {
-			errout << wxT("ERROR: DirectoryPresenter::expand(): can't prepare kid chain for dir: ")
-				<< idirectory->getName() << std::endl;
-			ExplorationTree::get()->deleteItem(kidTreeItem);
-		} else {
-			itemData->setObjectChain(kidchain);
-			_kidChains.push_back(itemData);
-		}
-	}
-
-	const std::list<IFile*>& files = _idirectory->getFiles();
-	std::list<IFile*>::const_iterator i;
-	for (i = files.begin(); i != files.end(); ++i) {
-		IFile* ifile = *i;
-
-		wxTreeItemId kidTreeItem = ExplorationTree::get()->appendItem(
-			parent->getTreeItem(), ifile->getName());
-
-		//CAUTION: Do *not* create BObjects with bare 'new' and expect them to work! you'll get
-		//         segfaults! You have to wrap them like this: RCPtr<BObject>(new BObject()),
-		//         or call addReference()/releaseReference() manually - so that proper
-		//         initialisation take place (initialize()/destroy()).
-		VirtualFile* virtualFile = new VirtualFile(kidTreeItem, ifile);
-		RCPtr<VirtualNode> virtualNode(virtualFile);
-
-		VirtualNodeItemData* itemData = new VirtualNodeItemData(virtualFile, NULL);
-		ExplorationTree::get()->setItemData(kidTreeItem, itemData);
-
-		//Here we try to figure the fileType and the best parsers for it:
-
-		RecognizedFileType outFileType(ifile->getFileType());
-		guid_list parsers;
-		if (outFileType.isOk())
-			parsers = FileTypeRegistry::get()->resolveParsers(outFileType.getFileTypeGUID())._parserGUIDs;
-		else {
-			parsers = FileTypeRegistry::get()->resolveParsers(virtualFile, outFileType);
-			ifile->setFileType(outFileType);
-		}
-
-		//Ok, we've got the best parsers, so create a dedicated ObjectChain:
-
-		ObjectChain* kidchain = prepareKidChain(virtualNode, parsers);
-		if (!kidchain) {
-			errout << wxT("ERROR: DirectoryPresenter::expand(): can't prepare kid chain for file: ")
-				<< ifile->getName() << wxT(" file type: ") << outFileType.getFileTypeGUID() << std::endl;
-			ExplorationTree::get()->deleteItem(kidTreeItem);
-		} else {
-			itemData->setObjectChain(kidchain);
-			_kidChains.push_back(itemData);
-		}
-	}
-
-	//realize visible items:
-	//ExplorationTree::get()->realizeVisible(); done by the tree itself
-
-	//now realize those chains:
-	/*if (!realizeKidChains()) {
-		deleteKidChains();
-		errout << wxT("ERROR: DirectoryPresenter::expand(): can't realize kids.") << std::endl;
-		return; //TODO: report error
-	}*/
-}
-
-void DirectoryPresenter::deleteKidChains() {
-	std::list<VirtualNodeItemData*>::const_iterator i;
-	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
-		VirtualNodeItemData* data = *i;
-		ObjectChain* kidchain = data->getObjectChain();
-		ASSERT(kidchain);
-		delete kidchain; //unrealize
-	}
-	_kidChains.clear();
-
-	VirtualNode* node = _inodeprovider->getNode();
-	ExplorationTree::get()->deleteChildren(node->getTreeItem());
-}
-
-bool DirectoryPresenter::realizeKidChains() {
-	bool res = true;
-	/*std::list<ObjectChain*>::const_iterator i;
-	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
-		ObjectChain* kidchain = *i;
-		kidchain->complete();
-		res &= kidchain->realize();
-	}*/
-	return res;
-}
-
-void DirectoryPresenter::dumpObjectChains(streamout& os) {
-	std::list<VirtualNodeItemData*>::const_iterator i;
-	int idx = 0;
-	for (i = _kidChains.begin(); i != _kidChains.end(); ++i) {
-		VirtualNodeItemData* data = *i;
-		ObjectChain* kidchain = data->getObjectChain();
-		ASSERT(kidchain);
-		kidchain->dumpObjectChain(coreString(wxT("kid")) + toString(idx), os);
-		idx++;
-	}
-}
-
-/////////////////////////////////////////////////////////////////////////////

@@ Diff output truncated at 100000 characters. @@

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