You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.8 KiB
128 lines
3.8 KiB
// |
|
// Copyright (c) 2010-2011 Matthew Jack and Doug Binks |
|
// |
|
// This software is provided 'as-is', without any express or implied |
|
// warranty. In no event will the authors be held liable for any damages |
|
// arising from the use of this software. |
|
// Permission is granted to anyone to use this software for any purpose, |
|
// including commercial applications, and to alter it and redistribute it |
|
// freely, subject to the following restrictions: |
|
// 1. The origin of this software must not be misrepresented; you must not |
|
// claim that you wrote the original software. If you use this software |
|
// in a product, an acknowledgment in the product documentation would be |
|
// appreciated but is not required. |
|
// 2. Altered source versions must be plainly marked as such, and must not be |
|
// misrepresented as being the original software. |
|
// 3. This notice may not be removed or altered from any source distribution. |
|
|
|
#pragma once |
|
|
|
#ifndef IGUIELEMENT_INCLUDED |
|
#define IGUIELEMENT_INCLUDED |
|
|
|
#include "IGUIDocument.h" |
|
#include <cstring> |
|
|
|
struct IGUIEvent |
|
{ |
|
virtual ~IGUIEvent() {} |
|
virtual void GetParameter(const char* parameter, char* buffer, size_t buffer_size ) const = 0; |
|
}; |
|
|
|
struct IGUIEventListener |
|
{ |
|
virtual ~IGUIEventListener() {} |
|
virtual void OnEvent( const IGUIEvent& event_info ) = 0; |
|
}; |
|
|
|
struct IGUIElement |
|
{ |
|
public: |
|
virtual ~IGUIElement() {} |
|
|
|
virtual const char* GetId() const = 0; |
|
virtual void SetInnerRML(const char* content) = 0; |
|
virtual void SetProperty(const char* name, const char* value) = 0; |
|
virtual IGUIElement* GetElementById(const char* id) = 0; |
|
virtual void GetAttribute(const char* attribute, char* buffer, size_t buffer_size ) const = 0; |
|
virtual void SetAttribute(const char* name, const char* value) = 0; |
|
virtual float GetClientWidth() const = 0; |
|
virtual float GetClientHeight() const = 0; |
|
|
|
// Reference counting |
|
virtual void AddReference() = 0; |
|
virtual void RemoveReference() = 0; |
|
|
|
// Add an event listener |
|
virtual void AddEventListener( const char* pName, IGUIEventListener* pEventListener ) = 0; |
|
|
|
// Remove an event listener |
|
virtual void RemoveEventListener( const char* pName, IGUIEventListener* pEventListener ) = 0; |
|
}; |
|
|
|
// IGUISingleEventListener can only listen to single events, but has auto removal for easy usuage |
|
class IGUISingleEventListener : public IGUIEventListener |
|
{ |
|
char* m_pEventname; |
|
IGUIElement* m_pElement; |
|
|
|
public: |
|
IGUISingleEventListener( ) |
|
: m_pEventname( 0 ) |
|
, m_pElement( 0 ) |
|
{ |
|
} |
|
|
|
const char* GetName() |
|
{ |
|
return m_pEventname; |
|
} |
|
|
|
IGUIElement* GetElement() |
|
{ |
|
return m_pElement; |
|
} |
|
|
|
void AddEventToElementInDoc( const char* pEventname, const char* pElementname_, IGUIDocument* pDocument ) |
|
{ |
|
IGUIElement* pElement = pDocument->Element()->GetElementById( pElementname_ ); |
|
if( pElement ) |
|
{ |
|
AddEventToElement( pEventname, pElement ); |
|
pElement->RemoveReference(); // a ref is added in addevent |
|
} |
|
} |
|
|
|
|
|
// AddEventToElement adds a reference to pElement which it will remove when the |
|
// event is deleted or RemoveEvent is called. |
|
void AddEventToElement( const char* pEventname, IGUIElement* pElement ) |
|
{ |
|
RemoveEvent(); |
|
m_pEventname = new char[ strlen( pEventname ) + 1 ]; |
|
strcpy( m_pEventname, pEventname ); |
|
m_pElement = pElement; |
|
m_pElement->AddReference(); |
|
m_pElement->AddEventListener( m_pEventname, this ); |
|
} |
|
|
|
void RemoveEvent() |
|
{ |
|
if( m_pElement ) |
|
{ |
|
m_pElement->RemoveEventListener( m_pEventname, this ); |
|
m_pElement->RemoveReference(); |
|
m_pElement = 0; |
|
delete[] m_pEventname; |
|
m_pEventname = 0; |
|
} |
|
} |
|
|
|
virtual ~IGUISingleEventListener() |
|
{ |
|
RemoveEvent(); |
|
} |
|
|
|
}; |
|
|
|
#endif // IGUIELEMENT_INCLUDED
|