2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "filetypes.h"
24 #include "debugging/debugging.h"
26 #include "ifiletypes.h"
28 #include "string/string.h"
33 class RadiantFileTypeRegistry : public IFileTypeRegistry
35 struct filetype_copy_t
37 filetype_copy_t( const char* moduleName, const filetype_t other )
38 : m_can_load( other.can_load ), m_can_import( other.can_import ), m_can_save( other.can_save ),
39 m_moduleName( moduleName ), m_name( other.name ), m_pattern( other.pattern ) {
41 const char* getModuleName() const {
42 return m_moduleName.c_str();
44 filetype_t getType() const {
45 return filetype_t( m_name.c_str(), m_pattern.c_str(), m_can_load, m_can_save, m_can_import );
51 std::string m_moduleName;
53 std::string m_pattern;
55 typedef std::vector<filetype_copy_t> filetype_list_t;
56 std::map<std::string, filetype_list_t> m_typelists;
58 RadiantFileTypeRegistry(){
59 addType( "*", "*", filetype_t( "All Files", "*.*" ) );
61 void addType( const char* moduleType, const char* moduleName, filetype_t type ){
62 m_typelists[moduleType].push_back( filetype_copy_t( moduleName, type ) );
64 void getTypeList( const char* moduleType, IFileTypeList* typelist, bool want_load, bool want_import, bool want_save ){
65 filetype_list_t& list_ref = m_typelists[moduleType];
66 for ( filetype_list_t::iterator i = list_ref.begin(); i != list_ref.end(); ++i )
68 if ( want_load && !( *i ).m_can_load ) {
71 if ( want_import && !( *i ).m_can_import ) {
74 if ( want_save && !( *i ).m_can_save ) {
77 typelist->addType( ( *i ).getModuleName(), ( *i ).getType() );
82 static RadiantFileTypeRegistry g_patterns;
84 IFileTypeRegistry* GetFileTypeRegistry(){
88 const char* findModuleName( IFileTypeRegistry* registry, const char* moduleType, const char* extension ){
89 class SearchFileTypeList : public IFileTypeList
92 const char* m_moduleName;
94 SearchFileTypeList( const char* ext )
98 strncpy( m_pattern + 2, ext, 125 );
99 m_pattern[127] = '\0';
101 void addType( const char* moduleName, filetype_t type ){
102 if ( extension_equal( m_pattern, type.pattern ) ) {
103 m_moduleName = moduleName;
107 const char* getModuleName(){
110 } search( extension );
111 registry->getTypeList( moduleType, &search );
112 return search.getModuleName();
116 #include "modulesystem/singletonmodule.h"
117 #include "modulesystem/moduleregistry.h"
121 IFileTypeRegistry* m_filetypes;
123 typedef IFileTypeRegistry Type;
124 STRING_CONSTANT( Name, "*" );
127 m_filetypes = GetFileTypeRegistry();
129 IFileTypeRegistry* getTable(){
134 typedef SingletonModule<FiletypesAPI> FiletypesModule;
135 typedef Static<FiletypesModule> StaticFiletypesModule;
136 StaticRegisterModule staticRegisterFiletypes( StaticFiletypesModule::instance() );