--- /dev/null
+/****************************************************************************
+*
+* wxWindows HTML Applet Package
+*
+* Copyright (C) 1991-2001 SciTech Software, Inc.
+* All rights reserved.
+*
+* ========================================================================
+*
+* The contents of this file are subject to the wxWindows License
+* Version 3.0 (the "License"); you may not use this file except in
+* compliance with the License. You may obtain a copy of the License at
+* http://www.wxwindows.org/licence3.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* ========================================================================
+*
+* Language: ANSI C++
+* Environment: Any
+*
+* Description: Header file for the wxQlet class
+*
+****************************************************************************/
+
+#ifndef __WX_PLUGIN_H
+#define __WX_PLUGIN_H
+
+// Forward declaration
+class wxHtmlAppletWindow;
+
+/*--------------------------- Class Definitions ---------------------------*/
+
+/****************************************************************************
+REMARKS:
+Defines the abstract base class for wxQlet objects.
+****************************************************************************/
+class wxPlugIn : public wxObject {
+private:
+ DECLARE_ABSTRACT_CLASS(wxPlugIn);
+
+ wxHtmlAppletWindow *m_parent;
+public:
+ // Constructor (called during dynamic creation)
+ wxPlugIn() { m_parent = NULL; };
+
+ // Psuedo virtual constructor
+ virtual bool Create(wxHtmlAppletWindow *parent);
+
+ // Virtual destructor
+ virtual ~wxPlugIn();
+ };
+#endif // __WX_PLUGIN_H
+
// Forward declare
class wxApplet;
+class wxQlet;
class wxLoadPageEvent;
class wxPageLoadedEvent;
class wxIncludePrep;
const wxHtmlTag ¶ms,
const wxSize& size);
+ // Create an instance of an Qlet based on it's class name
+ bool CreatePlugIn(const wxString& classId );
+
// Find an instance of an applet based on it's class name
wxApplet *FindApplet(const wxString& className);
};
+/****************************************************************************
+REMARKS:
+Defines the class for wxHtmlAppletCell
+***************************************************************************/
+class wxHtmlAppletCell : public wxHtmlCell
+{
+public:
+ wxHtmlAppletCell(wxWindow *wnd, int w = 0);
+ ~wxHtmlAppletCell() { m_Wnd->Destroy(); }
+ virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
+ virtual void DrawInvisible(wxDC& dc, int x, int y);
+ virtual void Layout(int w);
+
+protected:
+ wxWindow* m_Wnd;
+ // width float is used in adjustWidth (it is in percents)
+};
+
#endif // __WX_APPLET_WINDOW_H
#include "wx/spawnbrowser.h"
#include "wx/html/forcelnk.h"
+// crt
+#include <process.h> // spawnl()
+
// Include private headers
#include "wx/applet/applet.h"
#include "wx/applet/window.h"
#include "wx/applet/loadpage.h"
+#include "wx/applet/plugin.h"
// Preprocessor Stuff
#include "wx/applet/prepinclude.h"
// Set up docroot
m_DocRoot = docroot;
+ // Set the key_type for applets
+ m_AppletList = wxAppletList(wxKEY_STRING);
+
// Add HTML preprocessors
// deleting preprocessors is done by the code within the window
delete applet;
return NULL;
}
- m_AppletList.Append(iName,applet);
+ else {
+ // do some fixups on the size if its screwed up
+ wxSize nsize = applet->GetBestSize();
+ if (nsize.x < size.x) nsize.x = size.x;
+ if (nsize.y < size.y) nsize.y = size.y;
+ applet->SetSize(nsize);
+ }
+
+ m_AppletList.Append(iName,(wxObject*)applet);
return applet;
}
+/****************************************************************************
+PARAMETERS:
+classId - Name of the Plugin class to create an object for
+
+RETURNS:
+Pointer to the wxplugIn created, or NULL if unable to create the PlugIn.
+
+REMARKS:
+This function is used to create new wxPlugIn objects dynamically based on the
+class name as a string. This allows instances of wxPlugIn classes to be
+created dynamically based on string values embedded in the custom tags of an
+HTML page.
+****************************************************************************/
+bool wxHtmlAppletWindow::CreatePlugIn(
+ const wxString& classId )
+{
+ // Dynamically create the class instance at runtime
+ wxClassInfo *info = wxClassInfo::FindClass(classId.c_str());
+ if (!info)
+ return false;
+ wxObject *obj = info->CreateObject();
+ if (!obj)
+ return false;
+ wxPlugIn *plugIn = wxDynamicCast(obj,wxPlugIn);
+ if (!plugIn)
+ return false;
+ if (!plugIn->Create(this)) {
+ delete plugIn;
+ return false;
+ }
+ return true;
+}
+
/****************************************************************************
PARAMETERS:
appletName - Name of the applet class to find
REMARKS:
Remove an applet from the manager. Called during applet destruction
****************************************************************************/
+#include "scitech"
bool wxHtmlAppletWindow::LoadPage(
const wxString& link)
{
- wxString href(link);
+ wxString href(link);
+
+ // TODO: technically we allow no relative paths
- // Check for abs path. If it is not then tack on the path
- // supplied at creation.
- if (!wxIsAbsolutePath(href))
- href = m_DocRoot + href;
+ // Check to see if it is a real url, if not it is a file
+ if (link.Mid(0, 5).CmpNoCase("http:") != 0) {
+
+ // Check for abs path. If it is not then tack on the path
+ // supplied at creation.
+ // TODO: Abs paths are only used in testing (remove this)
+ if (link.GetChar(1) != ':')
+ href = m_DocRoot + href;
+ }
- // TODO: This needs to be made platform inde if possible.
if (link.GetChar(0) == '?'){
wxString cmd = link.BeforeFirst('=');
wxString cmdValue = link.AfterFirst('=');
+
+ // Launches the default Internet browser for the system.
if(!(cmd.CmpNoCase("?EXTERNAL"))){
return wxSpawnBrowser(this, cmdValue.c_str());
}
+
+ // Launches an external program on the system.
if (!(cmd.CmpNoCase("?EXECUTE"))){
- wxProcess *child = new AppletProcess(this);
- wxExecute(cmdValue, false, child);
- return true;
+ int code = spawnl( P_NOWAIT, cmdValue , NULL );
+ return (!code);
}
+
+ // Looks for a href in a variable stored as a cookie. The href can be
+ // changed on the fly.
if (!(cmd.CmpNoCase("?VIRTUAL"))){
VirtualData& temp = *((VirtualData*)FindCookie(cmdValue));
if (&temp) {
return true;
}
}
+
+ // This launches a qlet - It is like an applet but is more generic in that it
+ // can be of any wxWin type so it then has the freedom to do more stuff.
+ if (!(cmd.CmpNoCase("?WXAPPLET"))){
+ if (!cmdValue.IsNull()){
+ if (!CreatePlugIn(cmdValue)){
+#ifdef CHECKED
+ wxLogError(_T("Launch Applet ERROR: '%s' does not exist."), cmdValue.c_str());
+#endif
+ }
+ }
+ return true;
+ }
}
// Inform all the applets that the new page is being loaded
wnd = m_WParser->GetWindow();
if ((appletWindow = wxDynamicCast(wnd,wxHtmlAppletWindow)) != NULL){
- tag.ScanParam("WIDTH", "%i", &width);
- tag.ScanParam("HEIGHT", "%i", &height);
+ wxSize size = wxDefaultSize;
+ int al;
+ if (tag.HasParam("WIDTH")) {
+ tag.GetParamAsInt("WIDTH", &width);
+ size.SetWidth(width);
+ }
+
+ if (tag.HasParam("HEIGHT")) {
+ tag.GetParamAsInt("HEIGHT", &height);
+ size.SetHeight(height);
+ }
+
+ al = wxHTML_ALIGN_BOTTOM;
+ if (tag.HasParam(wxT("ALIGN"))) {
+ wxString alstr = tag.GetParam(wxT("ALIGN"));
+ alstr.MakeUpper(); // for the case alignment was in ".."
+ if (alstr == wxT("TEXTTOP") || alstr == wxT("TOP"))
+ al = wxHTML_ALIGN_TOP;
+ else if ((alstr == wxT("CENTER")) || (alstr == wxT("ABSCENTER")))
+ al = wxHTML_ALIGN_CENTER;
+ }
+
if (tag.HasParam("CLASSID")){
classId = tag.GetParam("CLASSID");
if ( classId.IsNull() || classId.Len() == 0 ){
name = classId;
// We got all the params and can now create the applet
- if ((applet = appletWindow->CreateApplet(classId, name, tag , wxSize(width, height))) != NULL){
+ if ((applet = appletWindow->CreateApplet(classId, name, tag , size)) != NULL){
applet->Show(true);
- m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(applet,0));
+ m_WParser->OpenContainer()->InsertCell(new wxHtmlAppletCell(applet,al));
}
else
wxMessageBox("wxApplet error: Could not create:" + classId + "," + name);
TAGS_MODULE_ADD(wxApplet)
TAGS_MODULE_END(wxApplet)
+/*********************************************************************************
+wxHtmlAppletCell
+*********************************************************************************/
+wxHtmlAppletCell::wxHtmlAppletCell(wxWindow *wnd, int align) : wxHtmlCell()
+{
+ int sx, sy;
+ m_Wnd = wnd;
+ m_Wnd->GetSize(&sx, &sy);
+ m_Width = sx, m_Height = sy;
+
+ switch (align) {
+ case wxHTML_ALIGN_TOP :
+ m_Descent = m_Height;
+ break;
+ case wxHTML_ALIGN_CENTER :
+ m_Descent = m_Height / 2;
+ break;
+ case wxHTML_ALIGN_BOTTOM :
+ default :
+ m_Descent = 0;
+ break;
+ }
+
+ SetCanLiveOnPagebreak(FALSE);
+}
+
+
+void wxHtmlAppletCell::Draw(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(view_y1), int WXUNUSED(view_y2))
+{
+ int absx = 0, absy = 0, stx, sty;
+ wxHtmlCell *c = this;
+
+ while (c)
+ {
+ absx += c->GetPosX();
+ absy += c->GetPosY();
+ c = c->GetParent();
+ }
+
+ ((wxScrolledWindow*)(m_Wnd->GetParent()))->GetViewStart(&stx, &sty);
+ m_Wnd->Move(absx - wxHTML_SCROLL_STEP * stx, absy - wxHTML_SCROLL_STEP * sty);
+}
+
+
+
+void wxHtmlAppletCell::DrawInvisible(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y))
+{
+ int absx = 0, absy = 0, stx, sty;
+ wxHtmlCell *c = this;
+
+ while (c)
+ {
+ absx += c->GetPosX();
+ absy += c->GetPosY();
+ c = c->GetParent();
+ }
+
+ ((wxScrolledWindow*)(m_Wnd->GetParent()))->GetViewStart(&stx, &sty);
+ m_Wnd->Move(absx - wxHTML_SCROLL_STEP * stx, absy - wxHTML_SCROLL_STEP * sty);
+}
+
+
+
+void wxHtmlAppletCell::Layout(int w)
+{
+ int sx, sy;
+ m_Wnd->GetSize(&sx, &sy);
+ m_Width = sx, m_Height = sy;
+
+ wxHtmlCell::Layout(w);
+}
+
+
+
+
// This is our little forcelink hack.
FORCE_LINK(loadpage)
--- /dev/null
+/****************************************************************************
+*
+* wxWindows HTML Applet Package
+*
+* Copyright (C) 1991-2001 SciTech Software, Inc.
+* All rights reserved.
+*
+* ========================================================================
+*
+* The contents of this file are subject to the wxWindows License
+* Version 3.0 (the "License"); you may not use this file except in
+* compliance with the License. You may obtain a copy of the License at
+* http://www.wxwindows.org/licence3.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* ========================================================================
+*
+* Language: ANSI C++
+* Environment: Any
+*
+* Description: Main wxPlugIn class implementation
+*
+****************************************************************************/
+
+// For compilers that support precompilation
+#include "wx/wxprec.h"
+
+// Include private headers
+#include "wx/applet/plugin.h"
+#include "wx/applet/window.h"
+
+/*------------------------- Implementation --------------------------------*/
+
+// Implement the abstract class functions
+IMPLEMENT_ABSTRACT_CLASS(wxPlugIn, wxObject);
+
+/****************************************************************************
+REMARKS:
+Psuedo virtual constructor for the wxPlugIn class.
+****************************************************************************/
+bool wxPlugIn::Create(
+ wxHtmlAppletWindow *parent)
+{
+ m_parent = parent;
+ return true;
+}
+
+/****************************************************************************
+REMARKS:
+Destructor for the wxPlugIn class.
+****************************************************************************/
+wxPlugIn::~wxPlugIn()
+{
+}
+
+
{
int b;
char ft[] = "<!--#if ";
-
+ char ftnot[] = "<!--#if NOT ";
+ char ftnot2[] = "<!--#if !";
+
+
// make a copy so we can replace text as we go without affecting the original
wxString output = text;
while ((b = ReverseFind(output.Lower(), ft)) != -1) {
- // Loop until every #echo directive is found
+ // Loop until every #if directive is found
// We search from the end of the string so that #if statements will properly recurse
// and we avoid the hassle of matching statements with the correct <!--#endif-->
- int end, c, n;
+ bool notval = false;
+ int off = 0;
+ int end, c, n;
wxString usecode, code;
wxString cname;
wxString tag;
code = wxString("");
+ if (output.Mid(b, strlen(ftnot) ).CmpNoCase(ftnot) == 0 ) {
+ notval = true;
+ off = 4;
+ }
+ else if (output.Mid(b, strlen(ftnot2) ).CmpNoCase(ftnot2) == 0 ) {
+ notval = true;
+ off = 1;
+ }
+
// grab the tag and get the name of the variable
end = (output.Mid(b)).Find("-->");
if (end == -1) {
n = c;
// find the classname
- c = (tag.Mid(8, n-8)).Find(" ");
- if (c == -1) n -= 8;
+ c = (tag.Mid(8+off, n-(8+off))).Find(" ");
+ if (c == -1) n -= (8+off);
else n = c;
- cname = tag.Mid(8, n);
+ cname = tag.Mid(8+off, n);
cname.Trim(false);
c = cname.Find("\"");
// Grab the value from the variable class identified by cname
value = wxIfElseVariable::FindValue(cname);
+ if (notval) value = !value;
// Find the end of the tag (<!--#endif-->) and copy it all into the variable code
end = ((output.Mid(b)).Lower()).Find("<!--#endif-->");
// remove the #include tag
output.Remove(i, n+21+3);
- wxFSFile * file = fs->OpenFile(fname);
+ wxFSFile * file = fs->OpenFile(DOC_ROOT + fname);
if (!file) {
#ifdef CHECKED
- wxMessageBox(wxString("wxHTML #include error: File not Found ") + fname + wxString("."),"Error",wxICON_ERROR);
+ wxMessageBox(wxString("wxHTML #include error: File not Found ") + DOC_ROOT + fname + wxString("."),"Error",wxICON_ERROR);
#endif
delete file;
continue;
wxZipFSHandler::~wxZipFSHandler()
{
- if (m_Archive)
+ if (m_Archive)
unzClose((unzFile)m_Archive);
if (m_DirsFound)
delete m_DirsFound;
bool wxZipFSHandler::CanOpen(const wxString& location)
{
wxString p = GetProtocol(location);
- return (p == wxT("zip")) &&
+ return (p == wxT("zip")) &&
(GetProtocol(GetLeftLocation(location)) == wxT("file"));
}
wxString left = GetLeftLocation(location);
wxInputStream *s;
- if (GetProtocol(left) != wxT("file"))
+ if (GetProtocol(left) != wxT("file"))
{
wxLogError(_("ZIP handler currently supports only local files!"));
return NULL;
}
+ if (right.GetChar(0) == wxT('/')) right = right.Mid(1);
+
s = new wxZipInputStream(left, right);
- if (s && (s->LastError() == wxStream_NOERROR))
+ if (s && (s->LastError() == wxStream_NOERROR))
{
return new wxFSFile(s,
left + wxT("#zip:") + right,
{
wxString right = GetRightLocation(spec);
wxString left = GetLeftLocation(spec);
-
+
if (right.Last() == wxT('/')) right.RemoveLast();
- if (m_Archive)
+ if (m_Archive)
{
unzClose((unzFile)m_Archive);
m_Archive = NULL;
return wxEmptyString;
}
- switch (flags)
+ switch (flags)
{
- case wxFILE:
+ case wxFILE:
m_AllowDirs = FALSE, m_AllowFiles = TRUE; break;
- case wxDIR:
+ case wxDIR:
m_AllowDirs = TRUE, m_AllowFiles = FALSE; break;
- default:
+ default:
m_AllowDirs = m_AllowFiles = TRUE; break;
}
m_Pattern = right.AfterLast(wxT('/'));
m_BaseDir = right.BeforeLast(wxT('/'));
- if (m_Archive)
+ if (m_Archive)
{
- if (unzGoToFirstFile((unzFile)m_Archive) != UNZ_OK)
+ if (unzGoToFirstFile((unzFile)m_Archive) != UNZ_OK)
{
unzClose((unzFile)m_Archive);
- m_Archive = NULL;
+ m_Archive = NULL;
}
- else
+ else
{
if (m_AllowDirs)
{
if (m_AllowDirs)
{
- dir = namestr.BeforeLast(wxT('/'));
+ dir = namestr.BeforeLast(wxT('/'));
while (!dir.IsEmpty())
{
long key = 0;
wxMatchWild(m_Pattern, filename, FALSE))
match = m_ZipFile + wxT("#zip:") + dir + wxT("/") + filename;
}
- else
+ else
break; // already tranversed
}
}
if (m_AllowFiles && !filename.IsEmpty() && m_BaseDir == dir &&
wxMatchWild(m_Pattern, filename, FALSE))
match = m_ZipFile + wxT("#zip:") + namestr;
-
- if (unzGoToNextFile((unzFile)m_Archive) != UNZ_OK)
+
+ if (unzGoToNextFile((unzFile)m_Archive) != UNZ_OK)
{
unzClose((unzFile)m_Archive);
m_Archive = NULL;
break;
}
}
-
+
return match;
}
-#endif
+#endif
//wxUSE_FILESYSTEM && wxUSE_FS_ZIP && wxUSE_ZIPSTREAM