// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef NLGEORGES_PLUGIN_INTERFACE_H #define NLGEORGES_PLUGIN_INTERFACE_H #include #include "nel/misc/config_file.h" namespace NLGEORGES { /** * Georges plug-ins are dlls. To be loaded, dll must be listed in the georges.cfg config file. * The dll must export 1 function: * * IEditPlugin *IGeorgesEditGetInterface (int version, IEdit *globalInterface); * * This method must first compare the version number with NLGEORGES_PLUGIN_INTERFACE_VERSION defined in * plugin_interface.h. If the version is not the same, the function must returns NULL (can show an error message). * If the number is the same, the plugin must instanciate an interface and return its pointers. It should * do only basic initialisation stuff. This method is called only one time by georges editor session. * The IEditPlugin derived object must be allocated with new. It will be delete by the system. * * The globalInterface pointer is valid to the end of the session. */ class IEdit; class IEditPlugin; class IEditDocument; class IEditDocumentPlugin; // The get interface plugin DLL entry. typedef IEditPlugin *(*IGeorgesEditGetInterface) (int version, IEdit *globalInterface, NLMISC::INelContext &nelContext); #define NLGEORGES_PLUGIN_INTERFACE_VERSION 0x1 /** * Communication interface between the plugin and georges editor. * * This interface give access to global global events handling. * * If you use MFC, don't forget to call AFX_MANAGE_STATE(AfxGetStaticModuleState()); * at the beginning of each callback of the interface. * * This interface is instancied by the plugin. */ class IEditPlugin { public: /** * Destructor must uninitialise the plugin interface */ virtual ~IEditPlugin () {} /// Window related /** * This method is called at dialog initialisation. * Typicaly, this method will create / show some global edition tools. (Not document edition related dialog). * * \param is the HWND of georges editor main frame. */ virtual void dialogInit (HWND mainFrm) = 0; /** * This method is called to activate / disactivate the plugin UI. * * \param activate is true to activate the plugin UI, false to hide the plugin UI */ virtual void activate (bool activate) = 0; /** * Get the plugin name. */ virtual void getPluginName (std::string &name) = 0; /** * Pretranslate message hook. * This method give a chance to the plugin to pretranslate a message before the main frame. * Useful for shortcuts etc.. * Default implementation returns "false"; */ virtual bool pretranslateMessage (MSG *pMsg) = 0; /// Events /** * This method is called when a document has been created / opened. */ virtual void onCreateDocument (IEditDocument *document) = 0; }; /** * This interface give access to global functions. * * This interface is instancied by the system. */ class IEdit { public: /** * Return the active document. Return NULL if no current document. */ virtual IEditDocument *getActiveDocument () = 0; /** * Return the current search path. */ virtual void getSearchPath (std::string &searchPath) = 0; /** * Create a form in the editor. * * \param dfnName is the name of the DFN. Can't be NULL. * \param pathName is the file name of the created document. Can be NULL. * \return the document pointer or NULL if a problem occurred. */ virtual IEditDocument *createDocument (const char *dfnName, const char *pathName) = 0; /** * Retreive the loaded config file. * Usefull for plugins to read any configuration var. */ virtual NLMISC::CConfigFile &getConfigFile() =0; }; /** * Communication interface between the plugin and georges editor document. * For the time, the interface can't modify document. It can only read it. * The interface must be allocated with new. It will be released by the * system when the document will be destroyed. * * If you use MFC, don't forget to call AFX_MANAGE_STATE(AfxGetStaticModuleState()); * at the beginning of each callback of the interface. * * This interface is instancied by the plugin. */ class IEditDocumentPlugin { public: /** * Destructor must uninitialise the plugin interface */ virtual ~IEditDocumentPlugin () {} /// Event message /** * This method is called to intialise dialog during IEditDocument::bind (). * Typicaly, this method will create / show some document control tools. * * \param is the HWND of the document view. */ virtual void dialogInit (HWND documentView) = 0; /** * Pretranslate message hook. * This method give a chance to the plugin to pretranslate a message before the main frame. * Useful for shortcuts etc.. * Default implementation returns "false"; */ virtual bool pretranslateMessage (MSG *pMsg) = 0; /** * This method is called when a document's view has been activated / unactivated. * If activated == true, the view has been activated, else the view is unactivated. */ virtual void activate (bool activated) = 0; /** * Called by the system when a georges value has been changed. */ virtual void onValueChanged (const char *formName) = 0; /** * Called by the system when the current edition node has been changed. * Call IEditDocument::getActiveNode () to get the active node form name. */ virtual void onNodeChanged () = 0; }; /** * Document access interface. * By this interface, you can access some values of the document. * * This interface is instancied by the system. */ class IEditDocument { public: /// Get the georges form pointer virtual UForm *getForm () = 0; /// Get document DFN filename virtual void getDfnFilename (std::string &dfnName) = 0; /// Get the document active node form name. Can return false if the node is not a form node. virtual bool getActiveNode (std::string &formName) = 0; /// Refresh the document view. virtual void refreshView () = 0; /// Return document filename. virtual void getFilename (std::string &pathname) = 0; /// Return document title. virtual void getTitle (std::string &pathname) = 0; /** * Attach a document interface to this document. * * \param plugin is the global plugin interface. * \param docInterface is a document interface allocated with new. It will be released by the document. */ virtual void bind (NLGEORGES::IEditPlugin *plugin, NLGEORGES::IEditDocumentPlugin *docInterface) = 0; /// \name Modify the document /** * Set a form value with its name. If the node doesn't exist, it is created. * * \param value is a reference on the value to set in the form. * \param name is the form name of the value to set or create. * \param slot is 0, 1, 2, 3. 0 is the current document, 1 is 1st snapshot, 2 the 2nd snapshot etc.. */ virtual void setValue (const char *value, const char *name, uint slot=0) = 0; }; } // NLGEORGES #endif // NLGEORGES_PLUGIN_INTERFACE_H