[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