/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Additional permissions under GNU GPL version 3 section 7 If you modify this Program, or any covered work, by linking or combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK (or a modified version of those libraries), containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the licensors of this Program grant you additional permission to convey the resulting work. Corresponding Source for a non-source form of such a combination shall include the source code for the parts of OpenSSL and IJG JPEG Library used as well as that of the covered work. You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ ////////////////////////////////////////////////////////////////////////////// // // // pfGUIControlHandlers Header // // // ////////////////////////////////////////////////////////////////////////////// #ifndef _pfGUIControlHandlers_h #define _pfGUIControlHandlers_h #include "hsStream.h" //// pfGUICtrlProcObject Definition ////////////////////////////////////////// // Any control which "does something" (buttons, edit boxes on Enter/Return, // etc) uses this in some form. Basically, each control will have an (optional?) // pointer to an object derived from this class type. The class has a single // standard, virtual function that gets called on the "do something" event. // Derive from this class, override the virtual and set the control's handler // to your object and you're all set. Kinda like windowProcs wrapped in a // C++ object. // Note: there are some predefined objects for simple, common events. See // below. // Note the second: DoSomething() takes a parameter--namely, a pointer to // the control that called it. Thus, you can make one object handle // several controls by just switch()ing on that parameter and save yourself // some object creation. // // UserCallback() is an additional function for use in communicating between // procs. Basically, if you want another proc to do something (another dialog), // and want you to get called once it's done, set the callback on the other // proc/whatever to you and override UserCallback(). // // HandleExtendedEvent() is similar to DoSomething(), but is called for extended // event types, such as value changing (for an edit control while typing) or // list scrolled. The event parameter is control-type-specific. // // Dialogs will use a similar functionality, but with more functions available. class pfGUIControlMod; class pfGUICtrlProcObject { protected: UInt32 fRefCnt; public: pfGUICtrlProcObject() { fRefCnt = 0; } virtual ~pfGUICtrlProcObject() { ; } virtual void DoSomething( pfGUIControlMod *ctrl ) = 0; virtual void HandleExtendedEvent( pfGUIControlMod *ctrl, UInt32 event ) { ; } virtual void UserCallback( UInt32 userValue ) { ; } // ONLY THE GUI SYSTEM SHOULD CALL THESE void IncRef( void ) { fRefCnt++; } hsBool DecRef( void ) { fRefCnt--; return ( fRefCnt > 0 ) ? false : true; } }; //// pfGUICtrlProcWriteableObject //////////////////////////////////////////// // This one is a read/writeable version of the above. Basically, you can just // call Read/Write() and it'll do all the mini-functionality of the factory // stuff so you don't have to worry about the derived type at runtime. Do // NOT derive from this class for your own handlers; this is just for the // handfull that will get added on export. class pfGUICtrlProcWriteableObject : public pfGUICtrlProcObject { protected: UInt32 fType; virtual void IRead( hsStream *s ) = 0; virtual void IWrite( hsStream *s ) = 0; public: enum Types { kNull, kConsoleCmd, kPythonScript, kCloseDlg }; pfGUICtrlProcWriteableObject() { fType = kNull; } pfGUICtrlProcWriteableObject( UInt32 type ) : fType( type ) { ; } virtual ~pfGUICtrlProcWriteableObject() { ; } virtual void DoSomething( pfGUIControlMod *ctrl ) = 0; static void Write( pfGUICtrlProcWriteableObject *obj, hsStream *s ); static pfGUICtrlProcWriteableObject *Read( hsStream *s ); }; //// pfGUIConsoleCmdProc ///////////////////////////////////////////////////// // Simply runs the console command specified. Exportable. class pfGUIConsoleCmdProc : public pfGUICtrlProcWriteableObject { protected: char *fCommand; virtual void IRead( hsStream *s ); virtual void IWrite( hsStream *s ); public: pfGUIConsoleCmdProc(); pfGUIConsoleCmdProc( const char *cmd ); virtual ~pfGUIConsoleCmdProc(); virtual void DoSomething( pfGUIControlMod *ctrl ); void SetCommand( const char *cmd ); }; //// pfGUIPythonScriptProc /////////////////////////////////////////////////// class pfGUIPythonScriptProc : public pfGUICtrlProcWriteableObject { protected: virtual void IRead( hsStream *s ); virtual void IWrite( hsStream *s ); public: pfGUIPythonScriptProc(); virtual ~pfGUIPythonScriptProc(); virtual void DoSomething( pfGUIControlMod *ctrl ); }; //// Simple Runtime Ones ///////////////////////////////////////////////////// class pfGUICloseDlgProc : public pfGUICtrlProcWriteableObject { protected: virtual void IRead( hsStream *s ) {} virtual void IWrite( hsStream *s ) {} public: pfGUICloseDlgProc() : pfGUICtrlProcWriteableObject( kCloseDlg ) {} virtual ~pfGUICloseDlgProc() {} virtual void DoSomething( pfGUIControlMod *ctrl ); }; #endif // _pfGUIControlHandlers_h