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 #if !defined( INCLUDED_NAMEKEYS_H )
23 #define INCLUDED_NAMEKEYS_H
27 #include "generic/static.h"
28 #include "entitylib.h"
29 #include "namespace.h"
31 inline bool string_is_integer( const char* string ){
32 strtol( string, const_cast<char**>( &string ), 10 );
33 return *string == '\0';
36 typedef bool ( *KeyIsNameFunc )( const char* key );
41 KeyIsNameFunc m_keyIsName;
42 const char* m_nameKey;
49 typedef MemberCaller1<EntityKeyValue, const char*, &EntityKeyValue::assign> KeyValueAssignCaller;
50 typedef MemberCaller1<EntityKeyValue, const KeyObserver&, &EntityKeyValue::attach> KeyValueAttachCaller;
51 typedef MemberCaller1<EntityKeyValue, const KeyObserver&, &EntityKeyValue::detach> KeyValueDetachCaller;
53 class NameKeys : public Entity::Observer, public Namespaced
55 Namespace* m_namespace;
56 EntityKeyValues& m_entity;
57 KeyIsNameFunc m_keyIsName;
58 NameKeys( const NameKeys& other );
59 NameKeys& operator=( const NameKeys& other );
61 typedef std::map<CopiedString, EntityKeyValue*> KeyValues;
62 KeyValues m_keyValues;
64 void insertName( const char* key, EntityKeyValue& value ){
65 if ( m_namespace != 0 && m_keyIsName( key ) ) {
66 //globalOutputStream() << "insert " << key << "\n";
67 m_namespace->attach( KeyValueAssignCaller( value ), KeyValueAttachCaller( value ) );
70 void eraseName( const char* key, EntityKeyValue& value ){
71 if ( m_namespace != 0 && m_keyIsName( key ) ) {
72 //globalOutputStream() << "erase " << key << "\n";
73 m_namespace->detach( KeyValueAssignCaller( value ), KeyValueDetachCaller( value ) );
77 for ( KeyValues::iterator i = m_keyValues.begin(); i != m_keyValues.end(); ++i )
79 insertName( ( *i ).first.c_str(), *( *i ).second );
83 for ( KeyValues::iterator i = m_keyValues.begin(); i != m_keyValues.end(); ++i )
85 eraseName( ( *i ).first.c_str(), *( *i ).second );
89 NameKeys( EntityKeyValues& entity ) : m_namespace( 0 ), m_entity( entity ), m_keyIsName( Static<KeyIsName>::instance().m_keyIsName ){
90 m_entity.attach( *this );
93 m_entity.detach( *this );
95 void setNamespace( Namespace& space ){
100 void setKeyIsName( KeyIsNameFunc keyIsName ){
102 m_keyIsName = keyIsName;
105 void insert( const char* key, EntityKeyValue& value ){
106 m_keyValues.insert( KeyValues::value_type( key, &value ) );
107 insertName( key, value );
109 void erase( const char* key, EntityKeyValue& value ){
110 eraseName( key, value );
111 m_keyValues.erase( key );
115 inline bool keyIsNameDoom3( const char* key ){
116 return string_equal( key, "target" )
117 || ( string_equal_n( key, "target", 6 ) && string_is_integer( key + 6 ) )
118 || string_equal( key, "name" );
121 inline bool keyIsNameDoom3Doom3Group( const char* key ){
122 return keyIsNameDoom3( key )
123 || string_equal( key, "model" );
126 inline bool keyIsNameQuake3( const char* key ){
127 return string_equal( key, "target" )
128 || string_equal( key, "targetname" )
129 || string_equal( key, "killtarget" )
130 || ( string_equal_n( key, "target", 6 ) && string_is_integer( key + 6 ) ); // Nexuiz