X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4726948f8e61c0e6472b5b249d4b7164f69582bc..d9b91de7d39cbd988d8da38c85a2b7bf3651cae6:/contrib/applet/appletwindow.cpp diff --git a/contrib/applet/appletwindow.cpp b/contrib/applet/appletwindow.cpp new file mode 100644 index 0000000000..c9131eca07 --- /dev/null +++ b/contrib/applet/appletwindow.cpp @@ -0,0 +1,371 @@ +/**************************************************************************** +* +* wxWindows HTML Applet Package +* +* Copyright (C) 1991-2001 SciTech Software, Inc. +* All rights reserved. +* +* ====================================================================== +* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +* | | +* |This copyrighted computer code is a proprietary trade secret of | +* |SciTech Software, Inc., located at 505 Wall Street, Chico, CA 95928 | +* |USA (www.scitechsoft.com). ANY UNAUTHORIZED POSSESSION, USE, | +* |VIEWING, COPYING, MODIFICATION OR DISSEMINATION OF THIS CODE IS | +* |STRICTLY PROHIBITED BY LAW. Unless you have current, express | +* |written authorization from SciTech to possess or use this code, you | +* |may be subject to civil and/or criminal penalties. | +* | | +* |If you received this code in error or you would like to report | +* |improper use, please immediately contact SciTech Software, Inc. at | +* |530-894-8400. | +* | | +* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +* ====================================================================== +* +* Language: ANSI C++ +* Environment: Any +* +* Description: Main wxHtmlAppletWindow class implementation +* +****************************************************************************/ + +// For compilers that support precompilation +#include "wx/wxprec.h" + +// Include private headers +#include "wx/applet/applet.h" + +/*------------------------- Implementation --------------------------------*/ + +// Empty event handler. We include this event handler simply so that +// sub-classes of wxApplet can reference wxApplet in the event tables +// that they create as necessary. +BEGIN_EVENT_TABLE(wxHtmlAppletWindow, wxHtmlWindow) +END_EVENT_TABLE() + +// Implement the class functions for wxHtmlAppletWindow +IMPLEMENT_CLASS(wxHtmlAppletWindow, wxHtmlWindow); + +// Define the wxAppletList implementation +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxAppletList); + +/**************************************************************************** +REMARKS: +Constructor for the applet window class. +****************************************************************************/ +wxHtmlAppletWindow::wxHtmlAppletWindow( + wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) + : wxHtmlWindow(parent,id,pos,size,style,name) +{ + // Ensure all cookie data is destroyed when window is killed + m_Cookies.DeleteContents(true); +} + +/**************************************************************************** +REMARKS: +Destructor for the applet window class. +****************************************************************************/ +wxHtmlAppletWindow::~wxHtmlAppletWindow() +{ +} + +/**************************************************************************** +PARAMETERS: +className - Name of the applet class to create an object for +size - Initial size of the applet to be created + +RETURNS: +Pointer to the wxApplet created, or NULL if unable to create the applet. + +REMARKS: +This function is used to create new wxApplet objects dynamically based on the +class name as a string. This allows instances of wxApplet classes to be +created dynamically based on string values embedded in the custom tags of an +HTML page. +****************************************************************************/ +wxApplet *wxHtmlAppletWindow::CreateApplet( + const wxString& className, + const wxSize& size) +{ + // We presently only allow one applet per page of the same class! + if (m_AppletList.Find(className)) + return NULL; + + // Dynamically create the class instance at runtime + wxClassInfo *info = wxClassInfo::FindClass(className.c_str()); + if (!info) + return NULL; + wxObject *obj = info->CreateObject(); + if (!obj) + return NULL; + wxApplet *applet = wxDynamicCast(obj,wxApplet); + if (!applet) + return NULL; + if (!applet->Create(this,size)) { + delete applet; + return NULL; + } + m_AppletList.Append(className,applet); + return applet; +} + +/**************************************************************************** +PARAMETERS: +appletName - Name of the applet class to find + +RETURNS: +Pointer to the wxApplet found, or NULL if not found. + +REMARKS: +Find an instance of an applet based on it's name +****************************************************************************/ +wxApplet *wxHtmlAppletWindow::FindApplet( + const wxString& appletName) +{ + wxAppletList::Node *node = m_AppletList.Find(appletName); + if (!node) + return NULL; + return node->GetData(); +} + +/**************************************************************************** +PARAMETERS: +applet - Pointer to the applet object to remove from the list + +RETURNS: +True if the applet was found and removed, false if not. The applet itself +is *not* destroyed! + +REMARKS: +Remove an applet from the manager. Called during applet destruction +****************************************************************************/ +bool wxHtmlAppletWindow::RemoveApplet( + const wxApplet *applet) +{ + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) { + if (node->GetData() == applet) { + m_AppletList.DeleteNode(node); + return true; + } + } + return false; +} + +/**************************************************************************** +PARAMETERS: +URL - New URL for the page to load + +RETURNS: +True if page loaded successfully, false if not + +REMARKS: +Remove an applet from the manager. Called during applet destruction +****************************************************************************/ +bool wxHtmlAppletWindow::LoadPage( + const wxString& hRef) +{ + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) + (node->GetData())->OnLinkClicked(hRef); + return wxHtmlWindow::LoadPage(hRef); +} + +/**************************************************************************** +PARAMETERS: +URL - String URL that we are navigating to + +REMARKS: +Called when the user navigates to a new URL from the current page. We simply +call the LoadPage function above to load the new page and display it. +****************************************************************************/ +void wxHtmlAppletWindow::OnLinkClicked( + const wxHtmlLinkInfo& link) +{ + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) + (node->GetData())->OnLinkClicked(link); + wxHtmlWindow::LoadPage(link.GetHref()); +} + +/**************************************************************************** +REMARKS: +Called when the user navigates forward within the HTML history stack. +We call all the applets in turn allowing them to handle the navigation +command prior to being destructed when the current page is destroyed. +****************************************************************************/ +bool wxHtmlAppletWindow::HistoryForward() +{ + if (!HistoryCanForward()) + return false; + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) + (node->GetData())->OnHistoryForward(); + return wxHtmlWindow::HistoryForward(); +} + +/**************************************************************************** +REMARKS: +Called when the user navigates backwards within the HTML history stack. +We call all the applets in turn allowing them to handle the navigation +command prior to being destructed when the current page is destroyed. +****************************************************************************/ +bool wxHtmlAppletWindow::HistoryBack() +{ + if (!HistoryCanBack()) + return false; + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) + (node->GetData())->OnHistoryBack(); + return wxHtmlWindow::HistoryBack(); +} + +/**************************************************************************** +PARAMETERS: +msg - wxEvent message to be sent to all wxApplets + +REMARKS: +This function is called by the wxApplet's when they need to send a message +to all other applets on the current page. This is the primary form of +communication between applets on the page if they need to inform each +other of internal information. + +Note that the event handling terminates as soon as the first wxApplet +handles the event. If the event should be handled by all wxApplet's, +the event handlers for the applets should not reset the wxEvent::Skip() +value (ie: by default it is true). +****************************************************************************/ +void wxHtmlAppletWindow::SendMessage( + wxEvent& msg) +{ + // Preset the skip flag + msg.Skip(); + + // Process all applets in turn and send them the message + for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) { + (node->GetData())->OnMessage(msg); + if (!msg.GetSkipped()) + break; + } +} + +/**************************************************************************** +PARAMETERS: +msg - wxEvent message to be sent to all wxApplets + +RETURNS: +True if new cookie was added, false if cookie with same name already exists. + +REMARKS: +This function is called by the wxApplet's when they need register a cookie +of data in the applet window's cookie table. Cookies are arbitrary data +objects that are references by unique name's by the wxApplet. These +values can be used to store and retrieve data that needs to remain +persisent across invocations of the wxApplet. Ie: The first time an +applet is created it would use the cookie to store data to maintain +it's present state so that if you navigated back to the same page +is would be able to re-load the prior state as though the applet +was never actually destructed. + +Note: If a cookie with the same name already exists, this function returns + false. Hence if you wish to replace a cookie you should first call + UnRegisterCookie to ensure the cookie is deleted and then call this + function. +****************************************************************************/ +bool wxHtmlAppletWindow::RegisterCookie( + const wxString& name, + wxObject *cookie) +{ + // Fail if the named cookie already exists! + if (m_Cookies.Get(name)) + return false; + m_Cookies.Put(name,cookie); + return true; +} + +/**************************************************************************** +PARAMETERS: +msg - wxEvent message to be sent to all wxApplets + +RETURNS: +True if found and deleted, false if not found in table. + +REMARKS: +This function is called by the wxApplet's when they need de-register a +cookie of data in the applet window's cookie table. The data in the +cookie itself is also deleted before it is removed from the table. +****************************************************************************/ +bool wxHtmlAppletWindow::UnRegisterCookie( + const wxString& name) +{ + wxObject *data = m_Cookies.Delete(name); + if (data) { + delete data; + return true; + } + return false; +} + +/**************************************************************************** +PARAMETERS: +msg - wxEvent message to be sent to all wxApplets + +RETURNS: +Pointer to the cookie data if found, NULL if not found. + +REMARKS: +This function is called by the wxApplet's when they need to find a cookie +of data given it's public name. If the cookie is not found, NULL is +returned. +****************************************************************************/ +wxObject *wxHtmlAppletWindow::FindCookie( + const wxString& name) +{ + return m_Cookies.Get(name); +} + +#include "wx/html/m_templ.h" + +/**************************************************************************** +REMARKS: +Implementation for the HTML tag handler. This handler takes care +of automatically constructing the wxApplet objects of the appropriate +class based on the tag information. +****************************************************************************/ +TAG_HANDLER_BEGIN(Embed, "EMBED") + +TAG_HANDLER_PROC(tag) +{ + wxWindow *wnd; + wxHtmlAppletWindow *appletWindow; + wxApplet *applet; + int width, height; + int floatPercent = 0; + + wnd = m_WParser->GetWindow(); + if ((appletWindow = wxDynamicCast(wnd,wxHtmlAppletWindow)) != NULL) { + tag.ScanParam("WIDTH", "%i", &width); + tag.ScanParam("HEIGHT", "%i", &height); + if (tag.HasParam("FLOAT")) + tag.ScanParam("FLOAT", "%i", &floatPercent); + if (tag.HasParam("APPLET")) { + if ((applet = appletWindow->CreateApplet(tag.GetParam("APPLET"), wxSize(width, height))) != NULL) { + applet->Show(true); + m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(applet,floatPercent)); + } + } + else if (tag.HasParam("TEXT")) { + // TODO: Somehow get the text returned from this class displayed on the page! + } + } + return false; +} + +TAG_HANDLER_END(Embed) + +TAGS_MODULE_BEGIN(Embed) + TAGS_MODULE_ADD(Embed) +TAGS_MODULE_END(Embed) +