From d9b91de7d39cbd988d8da38c85a2b7bf3651cae6 Mon Sep 17 00:00:00 2001 From: Kendall Bennett Date: Thu, 3 May 2001 17:20:52 +0000 Subject: [PATCH] Moved applet code into contrib. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9982 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/applet/applet.cpp | 86 +++++++ contrib/applet/appletwindow.cpp | 371 +++++++++++++++++++++++++++++ contrib/applet/makefile | 32 +++ contrib/include/wx/applet/applet.h | 83 +++++++ contrib/include/wx/applet/window.h | 114 +++++++++ 5 files changed, 686 insertions(+) create mode 100644 contrib/applet/applet.cpp create mode 100644 contrib/applet/appletwindow.cpp create mode 100644 contrib/applet/makefile create mode 100644 contrib/include/wx/applet/applet.h create mode 100644 contrib/include/wx/applet/window.h diff --git a/contrib/applet/applet.cpp b/contrib/applet/applet.cpp new file mode 100644 index 0000000000..6e11b6f68a --- /dev/null +++ b/contrib/applet/applet.cpp @@ -0,0 +1,86 @@ +/**************************************************************************** +* +* 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 wxApplet 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(wxApplet, wxPanel) + EVT_ERASE_BACKGROUND(wxApplet::OnEraseBackground) +END_EVENT_TABLE() + +// Implement the abstract class functions +IMPLEMENT_ABSTRACT_CLASS(wxApplet, wxPanel); + +/**************************************************************************** +REMARKS: +Psuedo virtual constructor for the wxApplet class. +****************************************************************************/ +bool wxApplet::Create( + wxHtmlAppletWindow *parent, + const wxSize& size, + long style) +{ + bool ret = wxPanel::Create(parent, -1, wxDefaultPosition, size, style); + if (ret) { + m_Parent = parent; + } + return ret; +} + +/**************************************************************************** +REMARKS: +Destructor for the wxApplet class. +****************************************************************************/ +wxApplet::~wxApplet() +{ + m_Parent->RemoveApplet(this); +} + +/**************************************************************************** +REMARKS: +Special handler for background erase messages. We do nothing in here which +causes the background to not be erased which is exactly what we want. All +the wxApplet classes display over an HTML window, so we want the HTML +background to show through. +****************************************************************************/ +void wxApplet::OnEraseBackground(wxEraseEvent&) +{ +} + 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) + diff --git a/contrib/applet/makefile b/contrib/applet/makefile new file mode 100644 index 0000000000..69b6155c5c --- /dev/null +++ b/contrib/applet/makefile @@ -0,0 +1,32 @@ +############################################################################# +# +# Copyright (C) 1999 SciTech Software +# All rights reserved. +# +# Descripton: Generic makefile for the SciTech wxApplet library +# +############################################################################# + +# We are building with the Win32 version + +USE_RTTI := 1 +USE_CPPEXCEPT := 1 +PRECOMP_HDR := wx/wxprec.h +CFLAGS += -D__WIN95__ -D__WXMSW__ -D__WINDOWS__ + +# Link with wxWindows static link libraries or with the DLL. DLL is default. + +.IF $(STATIC_LINK) +.ELSE +CFLAGS += -DWXUSINGDLL +.ENDIF + +# Define the library name and objects + +LIBFILE = wxapplet$L +LIBCLEAN = *.il? *.dll *.lib +OBJECTS := applet$O appletwindow$O + +DEPEND_OBJ = $(OBJECTS) +.INCLUDE: "$(SCITECH)\makedefs\common.mk" + diff --git a/contrib/include/wx/applet/applet.h b/contrib/include/wx/applet/applet.h new file mode 100644 index 0000000000..3c96fa5b4c --- /dev/null +++ b/contrib/include/wx/applet/applet.h @@ -0,0 +1,83 @@ +/**************************************************************************** +* +* 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: Header file for the wxApplet class +* +****************************************************************************/ + +#ifndef __WX_APPLET_H +#define __WX_APPLET_H + +#include "wx/panel.h" +#include "wx/applet/window.h" + +/*--------------------------- Class Definitions ---------------------------*/ + +/**************************************************************************** +REMARKS: +Defines the abstract base class for wxApplet objects. +****************************************************************************/ +class wxApplet : public wxPanel { +private: + DECLARE_ABSTRACT_CLASS(wxApplet); + DECLARE_EVENT_TABLE(); + +protected: + wxHtmlAppletWindow *m_Parent; + + // Special handler for background erase messages + void OnEraseBackground(wxEraseEvent&); + +public: + // Constructor (called during dynamic creation) + wxApplet() { m_Parent = NULL; } + + // Psuedo virtual constructor + virtual bool Create( + wxHtmlAppletWindow *parent, + const wxSize& size, + long style = wxTAB_TRAVERSAL | wxNO_BORDER); + + // Virtual destructor + virtual ~wxApplet(); + + // Handle HTML navigation to a new URL + virtual void OnLinkClicked(const wxHtmlLinkInfo& link) = 0; + + // Handle HTML navigation forward command in applet + virtual void OnHistoryForward() = 0; + + // Handle HTML navigation back command in applet + virtual void OnHistoryBack() = 0; + + // Handle messages from the wxAppletManager and other applets + virtual void OnMessage(wxEvent& msg) = 0; + }; + +#endif // __WX_APPLET_H + diff --git a/contrib/include/wx/applet/window.h b/contrib/include/wx/applet/window.h new file mode 100644 index 0000000000..d100cd103b --- /dev/null +++ b/contrib/include/wx/applet/window.h @@ -0,0 +1,114 @@ +/**************************************************************************** +* +* 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: Header file for the wxHtmlAppletWindow class +* +****************************************************************************/ + +#ifndef __WX_APPLET_WINDOW_H +#define __WX_APPLET_WINDOW_H + +#include "wx/html/htmlwin.h" + +/*--------------------------- Class Definitions ---------------------------*/ + +// Declare a linked list of wxApplet pointers +class wxApplet; +WX_DECLARE_LIST(wxApplet, wxAppletList); + +/**************************************************************************** +MEMBERS: +appletModules - List of register applet modules +appletList - List of all active applets instances +cookies - Hash table for managing cookies + +REMARKS: +Defines the class for wxAppletWindow. This class is derived from the +wxHtmlWindow class and extends it with functionality to handle embedded +wxApplet's on the HTML pages. +****************************************************************************/ +class wxHtmlAppletWindow : public wxHtmlWindow { +private: + DECLARE_CLASS(wxHtmlAppletWindow); + DECLARE_EVENT_TABLE(); + +protected: + wxAppletList m_AppletList; + wxHashTable m_Cookies; + +public: + // Constructor + wxHtmlAppletWindow( + wxWindow *parent, + wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHW_SCROLLBAR_AUTO, + const wxString& name = "htmlAppletWindow"); + + // Destructor + ~wxHtmlAppletWindow(); + + // Create an instance of an applet based on it's class name + wxApplet *CreateApplet( + const wxString& className, + const wxSize& size); + + // Find an instance of an applet based on it's class name + wxApplet *FindApplet(const wxString& className); + + // Remove an applet from the window. Called during applet destruction + bool RemoveApplet(const wxApplet *applet); + + // Load a new URL page + bool LoadPage(const wxString& hRef); + + // Called when users clicked on hypertext link. + void OnLinkClicked(const wxHtmlLinkInfo& link); + + // Handles forward navigation within the HTML stack + bool HistoryForward(); + + // Handles backwards navigation within the HTML stack + bool HistoryBack(); + + // Broadcast a message to all applets on the page + void SendMessage(wxEvent& msg); + + // Register a cookie of data in the applet manager + bool RegisterCookie(const wxString& name,wxObject *cookie); + + // UnRegister a cookie of data in the applet manager + bool UnRegisterCookie(const wxString& name); + + // Find a cookie of data given it's public name + wxObject *FindCookie(const wxString& name); + }; + +#endif // __WX_APPLET_WINDOW_H + -- 2.45.2