*** empty log message ***
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2963 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
@@ -533,6 +533,11 @@
|
||||
*/
|
||||
#define wxUSE_MINIFRAME 0
|
||||
|
||||
/*
|
||||
* wxHTML
|
||||
*/
|
||||
#define wxUSE_HTML 0
|
||||
|
||||
/*
|
||||
* Disable this if your compiler can't cope
|
||||
* with omission of prototype parameters.
|
||||
|
16
configure.in
@@ -292,6 +292,7 @@ if test $DEBUG_CONFIGURE = 1; then
|
||||
DEFAULT_wxUSE_STARTUP_TIPS=no
|
||||
DEFAULT_wxUSE_PROGRESSDLG=no
|
||||
DEFAULT_wxUSE_MINIFRAME=no
|
||||
DEFAULT_wxUSE_HTML=no
|
||||
DEFAULT_wxUSE_VALIDATORS=yes
|
||||
|
||||
DEFAULT_wxUSE_ACCEL=no
|
||||
@@ -391,6 +392,7 @@ else
|
||||
DEFAULT_wxUSE_STARTUP_TIPS=yes
|
||||
DEFAULT_wxUSE_PROGRESSDLG=yes
|
||||
DEFAULT_wxUSE_MINIFRAME=yes
|
||||
DEFAULT_wxUSE_HTML=no
|
||||
DEFAULT_wxUSE_VALIDATORS=yes
|
||||
|
||||
DEFAULT_wxUSE_ACCEL=yes
|
||||
@@ -675,6 +677,7 @@ WX_ARG_ENABLE(textdlg, [ --enable-textdlg use wxTextDialog], wxUSE_T
|
||||
WX_ARG_ENABLE(tipdlg, [ --enable-tipdlg use startup tips], wxUSE_STARTUP_TIPS)
|
||||
WX_ARG_ENABLE(progressdlg, [ --enable-progressdlg use wxProgressDialog], wxUSE_PROGRESSDLG)
|
||||
WX_ARG_ENABLE(miniframe, [ --enable-miniframe use wxMiniFrame class], wxUSE_MINIFRAME)
|
||||
WX_ARG_ENABLE(html, [ --enable-html use wxHTML sub-library], wxUSE_HTML)
|
||||
WX_ARG_ENABLE(tooltips, [ --enable-tooltips use wxToolTip class], wxUSE_TOOLTIPS)
|
||||
WX_ARG_ENABLE(splines, [ --enable-splines use spline drawing code], wxUSE_SPLINES)
|
||||
WX_ARG_ENABLE(validators, [ --enable-validators use wxValidator and derived classes], wxUSE_VALIDATORS)
|
||||
@@ -1993,6 +1996,11 @@ if test "$wxUSE_MINIFRAME" = "yes"; then
|
||||
SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS minifram"
|
||||
fi
|
||||
|
||||
if test "$wxUSE_HTML" = "yes"; then
|
||||
AC_DEFINE(wxUSE_HTML)
|
||||
SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS html"
|
||||
fi
|
||||
|
||||
if test "$wxUSE_VALIDATORS" = "yes"; then
|
||||
AC_DEFINE(wxUSE_VALIDATORS)
|
||||
SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS validate"
|
||||
@@ -2178,6 +2186,14 @@ dnl samples/Makefile samples/minimal/Makefile
|
||||
samples/validate/Makefile
|
||||
samples/wxpoem/Makefile
|
||||
samples/wxsocket/Makefile
|
||||
samples/html/Makefile
|
||||
samples/html/about/Makefile
|
||||
samples/html/help/Makefile
|
||||
samples/html/test/Makefile
|
||||
samples/html/printing/Makefile
|
||||
samples/html/widget/Makefile
|
||||
samples/html/virtual/Makefile
|
||||
samples/html/zip/Makefile
|
||||
],
|
||||
[
|
||||
chmod +x wx-config
|
||||
|
58
include/wx/busyinfo.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: busyinfo.h
|
||||
// Purpose: Information window (when app is busy)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __INFOWIN_H__
|
||||
#define __INFOWIN_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/dialog.h>
|
||||
|
||||
|
||||
|
||||
|
||||
class wxInfoFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
wxInfoFrame(wxWindow *parent, const wxString& message);
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxBusyInfo
|
||||
// Displays progress information
|
||||
// Can be used in exactly same way as wxBusyCursor
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxBusyInfo : public wxObject
|
||||
{
|
||||
public:
|
||||
wxBusyInfo(const wxString& message);
|
||||
~wxBusyInfo();
|
||||
|
||||
private:
|
||||
wxInfoFrame *m_InfoFrame;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
194
include/wx/filesys.h
Normal file
@@ -0,0 +1,194 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: filesys.h
|
||||
// Purpose: class for opening files - virtual file system
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __FILESYS_H__
|
||||
#define __FILESYS_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include <wx/stream.h>
|
||||
#include <wx/mimetype.h>
|
||||
#include <wx/url.h>
|
||||
|
||||
|
||||
class wxFSFile;
|
||||
class wxFileSystemHandler;
|
||||
class wxFileSystem;
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxFSFile
|
||||
// This class is a file opened using wxFileSystem. It consists of
|
||||
// input stream, location, mime type & optional anchor
|
||||
// (in 'index.htm#chapter2', 'chapter2' is anchor)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxFSFile : public wxObject
|
||||
{
|
||||
private:
|
||||
wxInputStream *m_Stream;
|
||||
wxString m_Location;
|
||||
wxString m_MimeType;
|
||||
wxString m_Anchor;
|
||||
|
||||
public:
|
||||
wxFSFile(wxInputStream *stream, const wxString& loc, const wxString& mimetype, const wxString& anchor)
|
||||
{
|
||||
m_Stream = stream;
|
||||
m_Location = loc;
|
||||
m_MimeType = mimetype; m_MimeType.MakeLower();
|
||||
m_Anchor = anchor;
|
||||
}
|
||||
virtual ~wxFSFile()
|
||||
{
|
||||
if (m_Stream) delete m_Stream;
|
||||
}
|
||||
|
||||
wxInputStream *GetStream() const {return m_Stream;}
|
||||
// returns stream. This doesn't _create_ stream, it only returns
|
||||
// pointer to it!!
|
||||
|
||||
const wxString& GetMimeType() const {return m_MimeType;}
|
||||
// returns file's mime type
|
||||
|
||||
const wxString& GetLocation() const {return m_Location;}
|
||||
// returns the original location (aka filename) of the file
|
||||
|
||||
const wxString& GetAnchor() const {return m_Anchor;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxFileSystemHandler
|
||||
// This class is FS handler for wxFileSystem. It provides
|
||||
// interface to access certain
|
||||
// kinds of files (HTPP, FTP, local, tar.gz etc..)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxFileSystemHandler : public wxObject
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS(wxFileSystemHandler)
|
||||
|
||||
public:
|
||||
wxFileSystemHandler() : wxObject() {}
|
||||
|
||||
virtual bool CanOpen(const wxString& location) = 0;
|
||||
// returns TRUE if this handler is able to open given location
|
||||
|
||||
virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location) = 0;
|
||||
// opens given file and returns pointer to input stream.
|
||||
// Returns NULL if opening failed.
|
||||
// The location is always absolute path.
|
||||
|
||||
protected:
|
||||
wxString GetProtocol(const wxString& location) const;
|
||||
// returns protocol ("file", "http", "tar" etc.) The last (most right)
|
||||
// protocol is used:
|
||||
// {it returns "tar" for "file:subdir/archive.tar.gz#tar:/README.txt"}
|
||||
|
||||
wxString GetLeftLocation(const wxString& location) const;
|
||||
// returns left part of address:
|
||||
// {it returns "file:subdir/archive.tar.gz" for "file:subdir/archive.tar.gz#tar:/README.txt"}
|
||||
|
||||
wxString GetAnchor(const wxString& location) const;
|
||||
// returns anchor part of address:
|
||||
// {it returns "anchor" for "file:subdir/archive.tar.gz#tar:/README.txt#anchor"}
|
||||
// NOTE: anchor is NOT a part of GetLeftLocation()'s return value
|
||||
|
||||
wxString GetRightLocation(const wxString& location) const;
|
||||
// returns right part of address:
|
||||
// {it returns "/README.txt" for "file:subdir/archive.tar.gz#tar:/README.txt"}
|
||||
|
||||
wxString GetMimeTypeFromExt(const wxString& location);
|
||||
// Returns MIME type of the file - w/o need to open it
|
||||
// (default behaviour is that it returns type based on extension)
|
||||
|
||||
private:
|
||||
static wxMimeTypesManager m_MimeMng;
|
||||
// MIME manager
|
||||
// (it's static and thus shared by all instances and derived classes)
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxFileSystem
|
||||
// This class provides simple interface for opening various
|
||||
// kinds of files (HTPP, FTP, local, tar.gz etc..)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxFileSystem : public wxObject
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxFileSystem)
|
||||
|
||||
private:
|
||||
wxString m_Path;
|
||||
// the path (location) we are currently in
|
||||
// this is path, not file!
|
||||
// (so if you opened test/demo.htm, it is
|
||||
// "test/", not "test/demo.htm")
|
||||
wxString m_LastName;
|
||||
// name of last opened file (full path)
|
||||
static wxList m_Handlers;
|
||||
// list of FS handlers
|
||||
|
||||
public:
|
||||
wxFileSystem() : wxObject() {m_Path = m_LastName = wxEmptyString; m_Handlers.DeleteContents(TRUE);}
|
||||
|
||||
void ChangePathTo(const wxString& location, bool is_dir = FALSE);
|
||||
// sets the current location. Every call to OpenFile is
|
||||
// relative to this location.
|
||||
// NOTE !!
|
||||
// unless is_dir = TRUE 'location' is *not* the directory but
|
||||
// file contained in this directory
|
||||
// (so ChangePathTo("dir/subdir/xh.htm") sets m_Path to "dir/subdir/")
|
||||
|
||||
wxString GetPath() const {return m_Path;}
|
||||
|
||||
wxFSFile* OpenFile(const wxString& location);
|
||||
// opens given file and returns pointer to input stream.
|
||||
// Returns NULL if opening failed.
|
||||
// It first tries to open the file in relative scope
|
||||
// (based on ChangePathTo()'s value) and then as an absolute
|
||||
// path.
|
||||
|
||||
static void AddHandler(wxFileSystemHandler *handler);
|
||||
// Adds FS handler.
|
||||
// In fact, this class is only front-end to the FS hanlers :-)
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
|
||||
'location' syntax:
|
||||
|
||||
To determine FS type, we're using standard KDE notation:
|
||||
file:/absolute/path/file.htm
|
||||
file:relative_path/xxxxx.html
|
||||
/some/path/x.file ('file:' is default)
|
||||
http://www.gnome.org
|
||||
file:subdir/archive.tar.gz#tar:/README.txt
|
||||
|
||||
special characters :
|
||||
':' - FS identificator is before this char
|
||||
'#' - separator. It can be either HTML anchor ("index.html#news")
|
||||
(in case there is no ':' in the string to the right from it)
|
||||
or FS separator
|
||||
(example : http://www.wxhtml.org/wxhtml-0.1.tar.gz#tar:/include/wxhtml/filesys.h"
|
||||
this would access tgz archive stored on web)
|
||||
'/' - directory (path) separator. It is used to determine upper-level path.
|
||||
HEY! Don't use \ even if you're on Windows!
|
||||
|
||||
*/
|
||||
|
||||
#endif // __FILESYS_H__
|
55
include/wx/fs_inet.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: fs_inet.h
|
||||
// Purpose: HTTP and FTP file system
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
|
||||
REMARKS :
|
||||
|
||||
This FS creates local cache (in /tmp directory). The cache is freed
|
||||
on program exit.
|
||||
|
||||
Size of cache is limited to cca 1000 items (due to GetTempFileName
|
||||
limitation)
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/filesys.h>
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxInternetFSHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxInternetFSHandler : public wxFileSystemHandler
|
||||
{
|
||||
private:
|
||||
wxHashTable m_Cache;
|
||||
|
||||
public:
|
||||
virtual bool CanOpen(const wxString& location);
|
||||
virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
|
||||
~wxInternetFSHandler();
|
||||
};
|
||||
|
||||
|
41
include/wx/fs_zip.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: fs_zip.h
|
||||
// Purpose: ZIP file system
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/filesys.h>
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxZipFSHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxZipFSHandler : public wxFileSystemHandler
|
||||
{
|
||||
public:
|
||||
virtual bool CanOpen(const wxString& location);
|
||||
virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
|
||||
~wxZipFSHandler();
|
||||
};
|
||||
|
||||
|
||||
|
59
include/wx/html/forcelink.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: forcelink.h
|
||||
// Purpose: see bellow
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
|
||||
DESCRPITON:
|
||||
|
||||
mod_*.cpp files contain handlers for tags. These files are modules - they contain
|
||||
one wxTagModule class and it's OnInit() method is called from wxApp's init method.
|
||||
The module is called even if you only link it into the executable, so everything
|
||||
seems wonderful.
|
||||
|
||||
The problem is that we have these modules in LIBRARY and mod_*.cpp files contain
|
||||
no method nor class which is known out of the module. So the linker won't
|
||||
link these .o/.obj files into executable because it detected that it is not used
|
||||
by the program.
|
||||
|
||||
To workaround this I introduced set of macros FORCE_LINK_ME and FORCE_LINK. These
|
||||
macros are generic and are not limited to mod_*.cpp files. You may find them quite
|
||||
useful somewhere else...
|
||||
|
||||
How to use them:
|
||||
let's suppose you want to always link file foo.cpp and that you have module
|
||||
always.cpp that is certainly always linked (e.g. the one with main() function
|
||||
or htmlwin.cpp in wxHtml library).
|
||||
|
||||
Place FORCE_LINK_ME(foo) somewhere in foo.cpp and FORCE_LINK(foo) somewhere
|
||||
in always.cpp
|
||||
See mod_*.cpp and htmlwin.cpp for example :-)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __FORCELINK_H__
|
||||
#define __FORCELINK_H__
|
||||
|
||||
|
||||
|
||||
// This must be part of the module you want to force:
|
||||
#define FORCE_LINK_ME(module_name) \
|
||||
int _link_dummy_func_##module_name () \
|
||||
{ \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
|
||||
// And this must be somewhere where it certainly will be linked:
|
||||
#define FORCE_LINK(module_name) \
|
||||
extern int _link_dummy_func_##module_name (); \
|
||||
static int _link_dummy_var_##module_name = \
|
||||
_link_dummy_func_##module_name ();
|
||||
|
||||
|
||||
#endif // __FORCELINK_H__
|
292
include/wx/html/htmlcell.h
Normal file
@@ -0,0 +1,292 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlcell.h
|
||||
// Purpose: wxHtmlCell class is used by wxHtmlWindow/wxHtmlWinParser
|
||||
// as a basic visual element of HTML page
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLCELL_H__
|
||||
#define __HTMLCELL_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
|
||||
#include <wx/html/htmltag.h>
|
||||
#include <wx/html/htmldefs.h>
|
||||
#include <wx/window.h>
|
||||
|
||||
class wxHtmlCell;
|
||||
class wxHtmlContainerCell;
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlCell
|
||||
// Internal data structure. It represents fragments of parsed HTML
|
||||
// page - a word, picture, table, horizontal line and so on.
|
||||
// It is used by wxHtmlWindow to represent HTML page in memory.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class WXDLLEXPORT wxHtmlCell : public wxObject
|
||||
{
|
||||
protected:
|
||||
wxHtmlCell *m_Next;
|
||||
// pointer to the next cell
|
||||
wxHtmlContainerCell *m_Parent;
|
||||
// pointer to parent cell
|
||||
long m_Width, m_Height, m_Descent;
|
||||
// dimensions of fragment
|
||||
// m_Descent is used to position text&images..
|
||||
long m_PosX, m_PosY;
|
||||
// position where the fragment is drawn
|
||||
wxString m_Link;
|
||||
// destination address if this fragment is hypertext link, "" otherwise
|
||||
|
||||
public:
|
||||
wxHtmlCell() : wxObject() {m_Next = NULL; m_Parent = NULL; m_Width = m_Height = m_Descent = 0;};
|
||||
virtual ~wxHtmlCell() {if (m_Next) delete m_Next;};
|
||||
|
||||
void SetParent(wxHtmlContainerCell *p) {m_Parent = p;}
|
||||
wxHtmlContainerCell *GetParent() const {return m_Parent;}
|
||||
|
||||
int GetPosX() const {return m_PosX;}
|
||||
int GetPosY() const {return m_PosY;}
|
||||
int GetWidth() const {return m_Width;}
|
||||
int GetHeight() const {return m_Height;}
|
||||
int GetDescent() const {return m_Descent;}
|
||||
virtual wxString GetLink(int x = 0, int y = 0) const {return m_Link;}
|
||||
// returns the link associated with this cell. The position is position within
|
||||
// the cell so it varies from 0 to m_Width, from 0 to m_Height
|
||||
wxHtmlCell *GetNext() const {return m_Next;}
|
||||
// members access methods
|
||||
|
||||
virtual void SetPos(int x, int y) {m_PosX = x, m_PosY = y;}
|
||||
void SetLink(const wxString& link) {m_Link = link;}
|
||||
void SetNext(wxHtmlCell *cell) {m_Next = cell;}
|
||||
// members writin methods
|
||||
|
||||
virtual void Layout(int w) {SetPos(0, 0); if (m_Next) m_Next -> Layout(w);};
|
||||
// 1. adjust cell's width according to the fact that maximal possible width is w.
|
||||
// (this has sense when working with horizontal lines, tables etc.)
|
||||
// 2. prepare layout (=fill-in m_PosX, m_PosY (and sometime m_Height) members)
|
||||
// = place items to fit window, according to the width w
|
||||
|
||||
virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2) {if (m_Next) m_Next -> Draw(dc, x, y, view_y1, view_y2);}
|
||||
// renders the cell
|
||||
|
||||
virtual void DrawInvisible(wxDC& dc, int x, int y) {if (m_Next) m_Next -> DrawInvisible(dc, x, y);};
|
||||
// proceed drawing actions in case the cell is not visible (scrolled out of screen).
|
||||
// This is needed to change fonts, colors and so on
|
||||
|
||||
virtual const wxHtmlCell* Find(int condition, const void* param) const {if (m_Next) return m_Next -> Find(condition, param); else return NULL;}
|
||||
// This method returns pointer to the FIRST cell for that
|
||||
// the condition
|
||||
// is true. It first checks if the condition is true for this
|
||||
// cell and then calls m_Next -> Find(). (Note: it checks
|
||||
// all subcells if the cell is container)
|
||||
// Condition is unique condition identifier (see htmldefs.h)
|
||||
// (user-defined condition IDs should start from 10000)
|
||||
// and param is optional parameter
|
||||
// Example : m_Cell -> Find(HTML_COND_ISANCHOR, "news");
|
||||
// returns pointer to anchor news
|
||||
|
||||
virtual void OnMouseClick(wxWindow *parent, int x, int y, bool left, bool middle, bool right);
|
||||
// This function is called when mouse button is clicked over the cell.
|
||||
// left, middle, right are flags indicating whether the button was or wasn't
|
||||
// pressed.
|
||||
// Parent is pointer to wxHtmlWindow that generated the event
|
||||
// HINT: if this handling is not enough for you you should use
|
||||
// wxHtmlBinderCell
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// Inherited cells:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlWordCell
|
||||
// Single word in input stream.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlWordCell : public wxHtmlCell
|
||||
{
|
||||
protected:
|
||||
wxString m_Word;
|
||||
|
||||
public:
|
||||
wxHtmlWordCell(const wxString& word, wxDC& dc);
|
||||
void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlContainerCell
|
||||
// Container - it contains other cells. Basic of layout algorithm.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlContainerCell : public wxHtmlCell
|
||||
{
|
||||
protected:
|
||||
int m_IndentLeft, m_IndentRight, m_IndentTop, m_IndentBottom;
|
||||
// indentation of subcells. There is always m_Indent pixels
|
||||
// big space between given border of the container and the subcells
|
||||
// it m_Indent < 0 it is in PERCENTS, otherwise it is in pixels
|
||||
int m_MinHeight, m_MinHeightAlign;
|
||||
// minimal height.
|
||||
int m_MaxLineWidth;
|
||||
// maximal widht of line. Filled during Layout()
|
||||
wxHtmlCell *m_Cells, *m_LastCell;
|
||||
// internal cells, m_Cells points to the first of them, m_LastCell to the last one.
|
||||
// (LastCell is needed only to speed-up InsertCell)
|
||||
int m_AlignHor, m_AlignVer;
|
||||
// alignment horizontal and vertical (left, center, right)
|
||||
int m_WidthFloat, m_WidthFloatUnits;
|
||||
// width float is used in adjustWidth
|
||||
bool m_UseBkColour;
|
||||
wxColour m_BkColour;
|
||||
// background color of this container
|
||||
bool m_UseBorder;
|
||||
wxColour m_BorderColour1, m_BorderColour2;
|
||||
// borders color of this container
|
||||
|
||||
public:
|
||||
wxHtmlContainerCell(wxHtmlContainerCell *parent);
|
||||
~wxHtmlContainerCell() {if (m_Cells) delete m_Cells;}
|
||||
|
||||
virtual void Layout(int w);
|
||||
virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
virtual void DrawInvisible(wxDC& dc, int x, int y);
|
||||
|
||||
void InsertCell(wxHtmlCell *cell);
|
||||
// insert cell at the end of m_Cells list
|
||||
void SetAlignHor(int al) {m_AlignHor = al;}
|
||||
int GetAlignHor() const {return m_AlignHor;}
|
||||
void SetAlignVer(int al) {m_AlignVer = al;}
|
||||
// sets horizontal/vertical alignment
|
||||
int GetAlignVer() const {return m_AlignVer;}
|
||||
void SetIndent(int i, int what, int units = HTML_UNITS_PIXELS);
|
||||
// sets left-border indentation. units is one of HTML_UNITS_* constants
|
||||
// what is combination of HTML_INDENT_*
|
||||
int GetIndent(int ind) const;
|
||||
// returns the indentation. ind is one of HTML_INDENT_* constants
|
||||
int GetIndentUnits(int ind) const;
|
||||
// returns type of value returned by GetIndent(ind)
|
||||
void SetAlign(const wxHtmlTag& tag);
|
||||
// sets alignment info based on given tag's params
|
||||
void SetWidthFloat(int w, int units) {m_WidthFloat = w; m_WidthFloatUnits = units;}
|
||||
void SetWidthFloat(const wxHtmlTag& tag);
|
||||
// sets floating width adjustment
|
||||
// (examples : 32 percent of parent container,
|
||||
// -15 pixels percent (this means 100 % - 15 pixels)
|
||||
void SetMinHeight(int h, int align = HTML_ALIGN_TOP) {m_MinHeight = h; m_MinHeightAlign = align;}
|
||||
// sets minimal height of this container.
|
||||
int GetMaxLineWidth() const {return m_MaxLineWidth;}
|
||||
// returns maximal line width in this container.
|
||||
// Call to this method is valid only after calling
|
||||
// Layout()
|
||||
void SetBackgroundColour(const wxColour& clr) {m_UseBkColour = TRUE; m_BkColour = clr;}
|
||||
void SetBorder(const wxColour& clr1, const wxColour& clr2) {m_UseBorder = TRUE; m_BorderColour1 = clr1, m_BorderColour2 = clr2;}
|
||||
virtual wxString GetLink(int x = 0, int y = 0) const;
|
||||
virtual const wxHtmlCell* Find(int condition, const void* param) const;
|
||||
virtual void OnMouseClick(wxWindow *parent, int x, int y, bool left, bool middle, bool right);
|
||||
|
||||
wxHtmlCell* GetFirstCell() {return m_Cells;}
|
||||
// returns pointer to the first cell in container or NULL
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlColourCell
|
||||
// Color changer.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlColourCell : public wxHtmlCell
|
||||
{
|
||||
public:
|
||||
wxColour m_Colour;
|
||||
unsigned m_Flags;
|
||||
|
||||
wxHtmlColourCell(wxColour clr, int flags = HTML_CLR_FOREGROUND) : wxHtmlCell() {m_Colour = clr; m_Flags = flags;}
|
||||
virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
virtual void DrawInvisible(wxDC& dc, int x, int y);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFontCell
|
||||
// Sets actual font used for text rendering
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlFontCell : public wxHtmlCell
|
||||
{
|
||||
public:
|
||||
wxFont *m_Font;
|
||||
|
||||
wxHtmlFontCell(wxFont *font) : wxHtmlCell() {m_Font = font;};
|
||||
virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
virtual void DrawInvisible(wxDC& dc, int x, int y);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlwidgetCell
|
||||
// This cell is connected with wxWindow object
|
||||
// You can use it to insert windows into HTML page
|
||||
// (buttons, input boxes etc.)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlWidgetCell : public wxHtmlCell
|
||||
{
|
||||
protected:
|
||||
wxWindow* m_Wnd;
|
||||
int m_WidthFloat;
|
||||
// width float is used in adjustWidth (it is in percents)
|
||||
|
||||
public:
|
||||
wxHtmlWidgetCell(wxWindow *wnd, int w = 0);
|
||||
// !!! wnd must have correct parent!
|
||||
// if w != 0 then the m_Wnd has 'floating' width - it adjust
|
||||
// it's width according to parent container's width
|
||||
// (w is percent of parent's width)
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLCELL_H__
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
94
include/wx/html/htmldefs.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmldefs.h
|
||||
// Purpose: constants for wxhtml library
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLDEFS_H__
|
||||
#define __HTMLDEFS_H__
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// ALIGNMENTS
|
||||
// Describes alignment of text etc. in containers
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_ALIGN_LEFT 0x0000
|
||||
#define HTML_ALIGN_RIGHT 0x0002
|
||||
|
||||
#define HTML_ALIGN_TOP 0x0004
|
||||
#define HTML_ALIGN_BOTTOM 0x0008
|
||||
|
||||
#define HTML_ALIGN_CENTER 0x0001
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// COLOR MODES
|
||||
// Used by wxHtmlColourCell to determine clr of what is changing
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_CLR_FOREGROUND 0x0001
|
||||
#define HTML_CLR_BACKGROUND 0x0002
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// UNITS
|
||||
// Used to specify units
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_UNITS_PIXELS 0x0001
|
||||
#define HTML_UNITS_PERCENT 0x0002
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// INDENTS
|
||||
// Used to specify indetation relatives
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_INDENT_LEFT 0x0010
|
||||
#define HTML_INDENT_RIGHT 0x0020
|
||||
#define HTML_INDENT_TOP 0x0040
|
||||
#define HTML_INDENT_BOTTOM 0x0080
|
||||
|
||||
#define HTML_INDENT_HORIZONTAL HTML_INDENT_LEFT | HTML_INDENT_RIGHT
|
||||
#define HTML_INDENT_VERTICAL HTML_INDENT_TOP | HTML_INDENT_BOTTOM
|
||||
#define HTML_INDENT_ALL HTML_INDENT_VERTICAL | HTML_INDENT_HORIZONTAL
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// FIND CONDITIONS
|
||||
// Identifiers of wxHtmlCell's Find() conditions
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_COND_ISANCHOR 1
|
||||
// Finds the anchor of 'param' name (pointer to wxString).
|
||||
|
||||
#define HTML_COND_USER 10000
|
||||
// User-defined conditions should start from this number
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// INTERNALS
|
||||
// wxHTML internal constants
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
#define HTML_SCROLL_STEP 16
|
||||
/* size of one scroll step of wxHtmlWindow in pixels */
|
||||
#define HTML_BUFLEN 1024
|
||||
/* size of temporary buffer used during parsing */
|
||||
#define HTML_REALLOC_STEP 32
|
||||
/* steps of array reallocation */
|
||||
|
||||
#endif
|
||||
#endif
|
70
include/wx/html/htmlfilter.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlfilter.h
|
||||
// Purpose: filters
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLFILTER_H__
|
||||
#define __HTMLFILTER_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/filesys.h>
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilter
|
||||
// This class is input filter. It can "translate" files
|
||||
// in non-HTML format to HTML format
|
||||
// interface to access certain
|
||||
// kinds of files (HTPP, FTP, local, tar.gz etc..)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlFilter : public wxObject
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS(wxHtmlFilter)
|
||||
|
||||
public:
|
||||
wxHtmlFilter() : wxObject() {}
|
||||
|
||||
virtual bool CanRead(const wxFSFile& file) = 0;
|
||||
// returns TRUE if this filter is able to open&read given file
|
||||
|
||||
virtual wxString ReadFile(const wxFSFile& file) = 0;
|
||||
// reads given file and returns HTML document.
|
||||
// Returns empty string if opening failed
|
||||
};
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterPlainText
|
||||
// This filter is used as default filter if no other can
|
||||
// be used (= uknown type of file). It is used by
|
||||
// wxHtmlWindow itself.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class WXDLLEXPORT wxHtmlFilterPlainText : public wxHtmlFilter
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterPlainText)
|
||||
|
||||
public:
|
||||
virtual bool CanRead(const wxFSFile& file);
|
||||
virtual wxString ReadFile(const wxFSFile& file);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLFILTER_H__
|
||||
|
||||
#endif
|
223
include/wx/html/htmlhelp.h
Normal file
@@ -0,0 +1,223 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlhelp.h
|
||||
// Purpose: Help controller
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLHELP_H__
|
||||
#define __HTMLHELP_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/window.h>
|
||||
#include <wx/config.h>
|
||||
#include <wx/splitter.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// helper classes & structs - please ignore 'em
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
class WXDLLEXPORT HtmlBookRecord : public wxObject
|
||||
{
|
||||
public:
|
||||
wxString m_BasePath;
|
||||
wxString m_Title;
|
||||
wxString m_Start;
|
||||
|
||||
HtmlBookRecord(const wxString& basepath, const wxString& title, const wxString& start) {m_BasePath = basepath; m_Title = title; m_Start = start;}
|
||||
wxString GetTitle() const {return m_Title;}
|
||||
wxString GetStart() const {return m_Start;}
|
||||
wxString GetBasePath() const {return m_BasePath;}
|
||||
};
|
||||
|
||||
|
||||
#undef WXDLLEXPORTLOCAL
|
||||
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||
// ?? Don't know why - but Allen Van Sickel reported it to fix problems with DLL
|
||||
WX_DECLARE_OBJARRAY(HtmlBookRecord, HtmlBookRecArray);
|
||||
|
||||
#undef WXDLLEXPORTLOCAL
|
||||
#define WXDLLEXPORTLOCAL
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
short int m_Level;
|
||||
int m_ID;
|
||||
char* m_Name;
|
||||
char* m_Page;
|
||||
HtmlBookRecord *m_Book;
|
||||
} HtmlContentsItem;
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlHelpController
|
||||
// This class ensures dislaying help.
|
||||
// See documentation for details on its philosophy.
|
||||
//
|
||||
// WARNING!!
|
||||
// This class is not derived from wxHelpController and is not
|
||||
// compatible with it!
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class WXDLLEXPORT wxHtmlHelpController : public wxEvtHandler
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlHelpController)
|
||||
|
||||
protected:
|
||||
wxConfigBase *m_Config;
|
||||
wxString m_ConfigRoot;
|
||||
// configuration file/registry used to store custom settings
|
||||
wxString m_TitleFormat;
|
||||
// title of the help frame
|
||||
wxString m_TempPath;
|
||||
|
||||
wxFrame *m_Frame;
|
||||
wxHtmlWindow *m_HtmlWin;
|
||||
wxSplitterWindow *m_Splitter;
|
||||
wxNotebook *m_NavigPan;
|
||||
wxTreeCtrl *m_ContentsBox;
|
||||
wxImageList *m_ContentsImageList;
|
||||
wxListBox *m_IndexBox;
|
||||
wxTextCtrl *m_SearchText;
|
||||
wxButton *m_SearchButton;
|
||||
wxListBox *m_SearchList;
|
||||
// ...pointers to parts of help window
|
||||
|
||||
struct {
|
||||
long x, y, w, h;
|
||||
long sashpos;
|
||||
bool navig_on;
|
||||
} m_Cfg;
|
||||
// settings (window size, position, sash pos etc..)
|
||||
|
||||
HtmlBookRecArray m_BookRecords;
|
||||
// each book has one record in this array
|
||||
HtmlContentsItem* m_Contents;
|
||||
int m_ContentsCnt;
|
||||
// list of all available books and pages.
|
||||
HtmlContentsItem* m_Index;
|
||||
int m_IndexCnt;
|
||||
// list of index items
|
||||
|
||||
public:
|
||||
wxHtmlHelpController();
|
||||
~wxHtmlHelpController();
|
||||
|
||||
void SetTitleFormat(const wxString& format) {m_TitleFormat = format;}
|
||||
// Sets format of title of the frame. Must contain exactly one "%s"
|
||||
// (for title of displayed HTML page)
|
||||
|
||||
void SetTempDir(const wxString& path);
|
||||
// Sets directory where temporary files are stored.
|
||||
// These temp files are index & contents file in binary (much faster to read)
|
||||
// form. These files are NOT deleted on program's exit.
|
||||
|
||||
bool AddBook(const wxString& book, bool show_wait_msg = FALSE);
|
||||
// Adds new book. 'book' is location of .htb file (stands for "html book").
|
||||
// See documentation for details on its format.
|
||||
// Returns success.
|
||||
// If show_wait_msg == true then message window with "loading book..." is displayed
|
||||
|
||||
void Display(const wxString& x);
|
||||
// Displays page x. If not found it will offect the user a choice of searching
|
||||
// books.
|
||||
// Looking for the page runs in these steps:
|
||||
// 1. try to locate file named x (if x is for example "doc/howto.htm")
|
||||
// 2. try to open starting page of book x
|
||||
// 3. try to find x in contents (if x is for example "How To ...")
|
||||
// 4. try to find x in index (if x is for example "How To ...")
|
||||
// 5. offer searching and if the user agree, run KeywordSearch
|
||||
void Display(const int id);
|
||||
// Alternative version that works with numeric ID.
|
||||
// (uses extension to MS format, <param name="ID" value=id>, see docs)
|
||||
|
||||
void DisplayContents();
|
||||
// Displays help window and focuses contents.
|
||||
|
||||
void DisplayIndex();
|
||||
// Displays help window and focuses index.
|
||||
|
||||
bool KeywordSearch(const wxString& keyword);
|
||||
// Searches for keyword. Returns TRUE and display page if found, return
|
||||
// FALSE otherwise
|
||||
// Syntax of keyword is Altavista-like:
|
||||
// * words are separated by spaces
|
||||
// (but "\"hello world\"" is only one world "hello world")
|
||||
// * word may be pretended by + or -
|
||||
// (+ : page must contain the word ; - : page can't contain the word)
|
||||
// * if there is no + or - before the word, + is default
|
||||
|
||||
void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString) {m_Config = config; m_ConfigRoot = rootpath;}
|
||||
// Assigns config object to the controller. This config is then
|
||||
// used in subsequent calls to Read/WriteCustomization of both help
|
||||
// controller and it's wxHtmlWindow
|
||||
|
||||
void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
|
||||
// saves custom settings into cfg config. it will use the path 'path'
|
||||
// if given, otherwise it will save info into currently selected path.
|
||||
// saved values : things set by SetFonts, SetBorders.
|
||||
void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
|
||||
// ...
|
||||
|
||||
protected:
|
||||
virtual void CreateHelpWindow();
|
||||
// Creates frame & html window and sets m_Frame and other variables;
|
||||
// Do nothing if the window already exists
|
||||
void RefreshLists();
|
||||
// Refreshes Contents and Index tabs
|
||||
void CreateContents();
|
||||
// Adds items to m_Contents tree control
|
||||
void CreateIndex();
|
||||
// Adds items to m_IndexList
|
||||
|
||||
void LoadMSProject(HtmlBookRecord *book, wxFileSystem& fsys, const wxString& indexfile, const wxString& contentsfile, bool show_wait_msg);
|
||||
// Imports .hhp files (MS HTML Help Workshop)
|
||||
void LoadCachedBook(HtmlBookRecord *book, wxInputStream *f);
|
||||
// Reads binary book
|
||||
void SaveCachedBook(HtmlBookRecord *book, wxOutputStream *f);
|
||||
// Writes binary book
|
||||
|
||||
void OnToolbar(wxCommandEvent& event);
|
||||
void OnContentsSel(wxTreeEvent& event);
|
||||
void OnIndexSel(wxCommandEvent& event);
|
||||
void OnSearchSel(wxCommandEvent& event);
|
||||
void OnSearch(wxCommandEvent& event);
|
||||
void OnCloseWindow(wxCloseEvent& event);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLHELP_H__
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
176
include/wx/html/htmlparser.h
Normal file
@@ -0,0 +1,176 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlparser.h
|
||||
// Purpose: wxHtmlParser class (generic parser)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLPARSER_H__
|
||||
#define __HTMLPARSER_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/html/htmltag.h>
|
||||
#include <wx/filesys.h>
|
||||
|
||||
class wxHtmlParser;
|
||||
class wxHtmlTagHandler;
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlParser
|
||||
// This class handles generic parsing of HTML document : it scans
|
||||
// the document and divide it into blocks of tags (where one block
|
||||
// consists of starting and ending tag and of text between these
|
||||
// 2 tags.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlParser : public wxObject
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS(wxHtmlParser)
|
||||
|
||||
protected:
|
||||
wxString m_Source;
|
||||
// source being parsed
|
||||
wxHtmlTagsCache *m_Cache;
|
||||
// tags cache, used during parsing.
|
||||
wxHashTable m_HandlersHash;
|
||||
wxList m_HandlersList;
|
||||
// handlers that handle particular tags. The table is accessed by
|
||||
// key = tag's name.
|
||||
// This attribute MUST be filled by derived class otherwise it would
|
||||
// be empty and no tags would be recognized
|
||||
// (see wxHtmlWinParser for details about filling it)
|
||||
// m_HandlersHash is for random access based on knowledge of tag name (BR, P, etc.)
|
||||
// it may (and often does) contain more references to one object
|
||||
// m_HandlersList is list of all handlers and it is guaranteed to contain
|
||||
// only one reference to each handler instance.
|
||||
wxFileSystem *m_FS;
|
||||
// class for opening files (file system)
|
||||
|
||||
public:
|
||||
wxHtmlParser() : wxObject(), m_HandlersHash(wxKEY_STRING) {m_FS = NULL; m_Cache = NULL;}
|
||||
virtual ~wxHtmlParser();
|
||||
|
||||
void SetFS(wxFileSystem *fs) {m_FS = fs;}
|
||||
// Sets the class which will be used for opening files
|
||||
wxFileSystem* GetFS() const {return m_FS;}
|
||||
|
||||
wxObject* Parse(const wxString& source);
|
||||
// You can simply call this method when you need parsed output.
|
||||
// This method does these things:
|
||||
// 1. call InitParser(source);
|
||||
// 2. call DoParsing();
|
||||
// 3. call GetProduct(); (it's return value is then returned)
|
||||
// 4. call DoneParser();
|
||||
|
||||
virtual void InitParser(const wxString& source);
|
||||
// Sets the source. This must be called before running Parse() method.
|
||||
virtual void DoneParser();
|
||||
// This must be called after Parse().
|
||||
|
||||
void DoParsing(int begin_pos, int end_pos);
|
||||
inline void DoParsing() {DoParsing(0, m_Source.Length());};
|
||||
// Parses the m_Source from begin_pos to end_pos-1.
|
||||
// (in noparams version it parses whole m_Source)
|
||||
|
||||
virtual wxObject* GetProduct() = 0;
|
||||
// Returns product of parsing
|
||||
// Returned value is result of parsing of the part. The type of this result
|
||||
// depends on internal representation in derived parser
|
||||
// (see wxHtmlWinParser for details).
|
||||
|
||||
virtual void AddTagHandler(wxHtmlTagHandler *handler);
|
||||
// adds handler to the list & hash table of handlers.
|
||||
|
||||
wxString* GetSource() {return &m_Source;}
|
||||
|
||||
virtual wxList* GetTempData() {return NULL;}
|
||||
// this method returns list of wxObjects that represents
|
||||
// all data allocated by the parser. These can't be freeded
|
||||
// by destructor because they must be valid as long as
|
||||
// GetProduct's return value is valid - the caller must
|
||||
// explicitly call delete MyParser -> GetTempData() to free
|
||||
// the memory
|
||||
// (this method always sets the list to delete its contents)
|
||||
|
||||
protected:
|
||||
|
||||
virtual void AddText(const char* txt) = 0;
|
||||
// Adds text to the output.
|
||||
// This is called from Parse() and must be overriden in derived classes.
|
||||
// txt is not guaranteed to be only one word. It is largest continuous part of text
|
||||
// (= not broken by tags)
|
||||
// NOTE : using char* because of speed improvements
|
||||
|
||||
virtual void AddTag(const wxHtmlTag& tag);
|
||||
// Adds tag and proceeds it. Parse() may (and usually is) called from this method.
|
||||
// This is called from Parse() and may be overriden.
|
||||
// Default behavior is that it looks for proper handler in m_Handlers. The tag is
|
||||
// ignored if no hander is found.
|
||||
// Derived class is *responsible* for filling in m_Handlers table.
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlTagHandler
|
||||
// This class (and derived classes) cooperates with wxHtmlParser.
|
||||
// Each recognized tag is passed to handler which is capable
|
||||
// of handling it. Each tag is handled in 3 steps:
|
||||
// 1. Handler will modifies state of parser
|
||||
// (using it's public methods)
|
||||
// 2. Parser parses source between starting and ending tag
|
||||
// 3. Handler restores original state of the parser
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlTagHandler : public wxObject
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS(wxHtmlTagHandler)
|
||||
|
||||
protected:
|
||||
wxHtmlParser *m_Parser;
|
||||
|
||||
public:
|
||||
wxHtmlTagHandler() : wxObject () {m_Parser = NULL;};
|
||||
|
||||
virtual void SetParser(wxHtmlParser *parser) {m_Parser = parser;}
|
||||
// Sets the parser.
|
||||
// NOTE : each _instance_ of handler is guaranteed to be called
|
||||
// only by one parser. This means you don't have to care about
|
||||
// reentrancy.
|
||||
|
||||
virtual wxString GetSupportedTags() = 0;
|
||||
// Returns list of supported tags. The list is in uppercase and
|
||||
// tags are delimited by ','.
|
||||
// Example : "I,B,FONT,P"
|
||||
// is capable of handling italic, bold, font and paragraph tags
|
||||
|
||||
virtual bool HandleTag(const wxHtmlTag& tag) = 0;
|
||||
// This is hadling core method. It does all the Steps 1-3.
|
||||
// To process step 2, you can call ParseInner()
|
||||
// returned value : TRUE if it called ParseInner(),
|
||||
// FALSE etherwise
|
||||
|
||||
protected:
|
||||
void ParseInner(const wxHtmlTag& tag) {m_Parser -> DoParsing(tag.GetBeginPos(), tag.GetEndPos1());}
|
||||
// parses input between beginning and ending tag.
|
||||
// m_Parser must be set.
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLPARSER_H__
|
||||
|
||||
#endif
|
135
include/wx/html/htmltag.h
Normal file
@@ -0,0 +1,135 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmltag.h
|
||||
// Purpose: wxHtmlTag class (represents single tag)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLTAG_H__
|
||||
#define __HTMLTAG_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlTagsCache
|
||||
// !! INTERNAL STRUCTURE !! Do not use in your program!
|
||||
// This structure contains information on positions of tags
|
||||
// in the string being parsed
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
typedef struct {
|
||||
int Key;
|
||||
// this is "pos" value passed to wxHtmlTag's constructor.
|
||||
// it is position of '<' character of the tag
|
||||
int End1, End2;
|
||||
// end positions for the tag:
|
||||
// end1 is '<' of ending tag,
|
||||
// end2 is '>' or both are
|
||||
// -1 if there is no ending tag for this one...
|
||||
// or -2 if this is ending tag </...>
|
||||
char *Name;
|
||||
// name of this tag
|
||||
} sCacheItem;
|
||||
|
||||
|
||||
|
||||
class wxHtmlTagsCache : public wxObject
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache)
|
||||
|
||||
private:
|
||||
sCacheItem *m_Cache;
|
||||
int m_CacheSize;
|
||||
int m_CachePos;
|
||||
|
||||
public:
|
||||
wxHtmlTagsCache() : wxObject() {m_CacheSize = 0; m_Cache = NULL;}
|
||||
wxHtmlTagsCache(const wxString& source);
|
||||
~wxHtmlTagsCache() {free(m_Cache);}
|
||||
|
||||
void QueryTag(int at, int* end1, int* end2);
|
||||
// Finds parameters for tag starting at at and fills the variables
|
||||
};
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlTag
|
||||
// This represents single tag. It is used as internal structure
|
||||
// by wxHtmlParser.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlTag : public wxObject
|
||||
{
|
||||
DECLARE_CLASS(wxHtmlTag)
|
||||
|
||||
private:
|
||||
wxString m_Name, m_Params;
|
||||
int m_Begin, m_End1, m_End2;
|
||||
bool m_Ending;
|
||||
|
||||
public:
|
||||
wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCache* cache);
|
||||
// constructs wxHtmlTag object based on HTML tag.
|
||||
// The tag begins (with '<' character) at position pos in source
|
||||
// end_pos is position where parsing ends (usually end of document)
|
||||
|
||||
inline wxString GetName() const {return m_Name;};
|
||||
// Returns tag's name in uppercase.
|
||||
|
||||
bool HasParam(const wxString& par) const;
|
||||
// Returns TRUE if the tag has given parameter. Parameter
|
||||
// should always be in uppercase.
|
||||
// Example : <IMG SRC="test.jpg"> HasParam("SRC") returns TRUE
|
||||
|
||||
wxString GetParam(const wxString& par, bool with_commas = FALSE) const;
|
||||
// Returns value of the param. Value is in uppercase unless it is
|
||||
// enclosed with "
|
||||
// Example : <P align=right> GetParam("ALIGN") returns (RIGHT)
|
||||
// <P IMG SRC="WhaT.jpg"> GetParam("SRC") returns (WhaT.jpg)
|
||||
// (or ("WhaT.jpg") if with_commas == TRUE)
|
||||
|
||||
void ScanParam(const wxString& par, char *format, ...) const;
|
||||
// Scans param like scanf() functions family do.
|
||||
// Example : ScanParam("COLOR", "\"#%X\"", &clr);
|
||||
// This is always with with_commas=FALSE
|
||||
|
||||
inline const wxString& GetAllParams() const {return m_Params;};
|
||||
// Returns string containing all params.
|
||||
|
||||
inline bool IsEnding() const {return m_Ending;};
|
||||
// return TRUE if this is ending tag (</something>) or FALSE
|
||||
// if it isn't (<something>)
|
||||
|
||||
inline bool HasEnding() const {return m_End1 >= 0;};
|
||||
// return TRUE if this is ending tag (</something>) or FALSE
|
||||
// if it isn't (<something>)
|
||||
|
||||
inline int GetBeginPos() const {return m_Begin;};
|
||||
// returns beginning position of _internal_ block of text
|
||||
// See explanation (returned value is marked with *):
|
||||
// bla bla bla <MYTAG>* bla bla intenal text</MYTAG> bla bla
|
||||
inline int GetEndPos1() const {return m_End1;};
|
||||
// returns ending position of _internal_ block of text.
|
||||
// bla bla bla <MYTAG> bla bla intenal text*</MYTAG> bla bla
|
||||
inline int GetEndPos2() const {return m_End2;};
|
||||
// returns end position 2 :
|
||||
// bla bla bla <MYTAG> bla bla internal text</MYTAG>* bla bla
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLTAG_H__
|
||||
|
||||
#endif
|
220
include/wx/html/htmlwin.h
Normal file
@@ -0,0 +1,220 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlwin.h
|
||||
// Purpose: wxHtmlWindow class for parsing & displaying HTML
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLWIN_H__
|
||||
#define __HTMLWIN_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/window.h>
|
||||
#include <wx/config.h>
|
||||
#include <wx/treectrl.h>
|
||||
#include <wx/html/htmlwinparser.h>
|
||||
#include <wx/html/htmlcell.h>
|
||||
#include <wx/filesys.h>
|
||||
#include <wx/html/htmlfilter.h>
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlWindow
|
||||
// (This is probably the only class you will directly use.)
|
||||
// Purpose of this class is to display HTML page (either local
|
||||
// file or downloaded via HTTP protocol) in a window. Width
|
||||
// of window is constant - given in constructor - virtual height
|
||||
// is changed dynamicly depending on page size.
|
||||
// Once the window is created you can set it's content by calling
|
||||
// SetPage(text) or LoadPage(filename).
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// item of history list
|
||||
class WXDLLEXPORT HtmlHistoryItem : public wxObject
|
||||
{
|
||||
private:
|
||||
wxString m_Page;
|
||||
wxString m_Anchor;
|
||||
int m_Pos;
|
||||
|
||||
public:
|
||||
HtmlHistoryItem(const wxString& p, const wxString& a) {m_Page = p, m_Anchor = a, m_Pos = 0;}
|
||||
int GetPos() const {return m_Pos;}
|
||||
void SetPos(int p) {m_Pos = p;}
|
||||
const wxString& GetPage() const {return m_Page;}
|
||||
const wxString& GetAnchor() const {return m_Anchor;}
|
||||
};
|
||||
|
||||
#undef WXDLLEXPORTLOCAL
|
||||
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||
// ?? Don't know why - but Allen Van Sickel reported it to fix problems with DLL
|
||||
|
||||
WX_DECLARE_OBJARRAY(HtmlHistoryItem, HtmlHistoryArray);
|
||||
|
||||
#undef WXDLLEXPORTLOCAL
|
||||
#define WXDLLEXPORTLOCAL
|
||||
|
||||
|
||||
class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlWindow)
|
||||
|
||||
protected:
|
||||
wxHtmlContainerCell *m_Cell;
|
||||
// This is pointer to the first cell in parsed data.
|
||||
// (Note: the first cell is usually top one = all other cells are sub-cells of this one)
|
||||
wxHtmlWinParser *m_Parser;
|
||||
// parser which is used to parse HTML input.
|
||||
// Each wxHtmlWindow has it's own parser because sharing one global
|
||||
// parser would be problematic (because of reentrancy)
|
||||
wxString m_OpenedPage;
|
||||
// contains name of actualy opened page or empty string if no page opened
|
||||
wxString m_OpenedAnchor;
|
||||
// contains name of current anchor within m_OpenedPage
|
||||
wxFileSystem* m_FS;
|
||||
// class for opening files (file system)
|
||||
|
||||
wxFrame *m_RelatedFrame;
|
||||
wxString m_TitleFormat;
|
||||
int m_RelatedStatusBar;
|
||||
// frame in which page title should be displayed & number of it's statusbar
|
||||
// reserved for usage with this html window
|
||||
|
||||
int m_Borders;
|
||||
// borders (free space between text and window borders)
|
||||
// defaults to 10 pixels.
|
||||
|
||||
bool m_Scrollable;
|
||||
// TRUE if you can scroll the window.
|
||||
// If it is FALSE you can't scroll the window even if it's contents is larger
|
||||
// than window.
|
||||
|
||||
|
||||
private:
|
||||
bool m_tmpMouseMoved;
|
||||
// a flag indicated if mouse moved
|
||||
// (if TRUE we will try to change cursor in last call to OnIdle)
|
||||
bool m_tmpCanDraw;
|
||||
// if FALSE contents of the window is not redrawn
|
||||
// (in order to avoid ugly bliking)
|
||||
|
||||
static wxList m_Filters;
|
||||
// list of HTML filters
|
||||
static wxHtmlFilterPlainText m_DefaultFilter;
|
||||
// this filter is used when no filter is able to read some file
|
||||
|
||||
HtmlHistoryArray m_History;
|
||||
int m_HistoryPos;
|
||||
// browser history
|
||||
bool m_HistoryOn;
|
||||
// if this FLAG is false, items are not added to history
|
||||
|
||||
public:
|
||||
wxHtmlWindow() : wxScrolledWindow() {};
|
||||
wxHtmlWindow(wxWindow *parent, wxWindowID id = -1,
|
||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
||||
const wxString& name = "htmlWindow", bool scrollable = TRUE);
|
||||
~wxHtmlWindow();
|
||||
|
||||
bool SetPage(const wxString& source);
|
||||
// Set HTML page and display it. !! source is HTML document itself,
|
||||
// it is NOT address/filename of HTML document. If you want to
|
||||
// specify document location, use LoadPage() istead
|
||||
// Return value : FALSE if an error occured, TRUE otherwise
|
||||
|
||||
bool LoadPage(const wxString& location);
|
||||
// Load HTML page from given location. Location can be either
|
||||
// a) /usr/wxGTK2/docs/html/wx.htm
|
||||
// b) http://www.somewhere.uk/document.htm
|
||||
// c) ftp://ftp.somesite.cz/pub/something.htm
|
||||
// In case there is no prefix (http:,ftp:), the method
|
||||
// will try to find it itself (1. local file, then http or ftp)
|
||||
// After the page is loaded, the method calls SetPage() to display it.
|
||||
// Note : you can also use path relative to previously loaded page
|
||||
// Return value : same as SetPage
|
||||
|
||||
wxString GetOpenedPage() const {return m_OpenedPage;}
|
||||
// Returns full location of opened page
|
||||
|
||||
void SetRelatedFrame(wxFrame* frame, const wxString& format);
|
||||
// sets frame in which page title will be displayed. Format is format of
|
||||
// frame title, e.g. "HtmlHelp : %s". It must contain exactly one %s
|
||||
wxFrame* GetRelatedFrame() const {return m_RelatedFrame;}
|
||||
|
||||
void SetRelatedStatusBar(int bar);
|
||||
// after(!) calling SetRelatedFrame, this sets statusbar slot where messages
|
||||
// will be displayed. Default is -1 = no messages.
|
||||
|
||||
void SetFonts(wxString normal_face, int normal_italic_mode, wxString fixed_face, int fixed_italic_mode, int *sizes);
|
||||
// sets fonts to be used when displaying HTML page.
|
||||
// *_italic_mode can be either wxSLANT or wxITALIC
|
||||
|
||||
void SetTitle(const wxString& title);
|
||||
// Sets the title of the window
|
||||
// (depending on the information passed to SetRelatedFrame() method)
|
||||
|
||||
void SetBorders(int b) {m_Borders = b;}
|
||||
// Sets space between text and window borders.
|
||||
|
||||
virtual void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
|
||||
// saves custom settings into cfg config. it will use the path 'path'
|
||||
// if given, otherwise it will save info into currently selected path.
|
||||
// saved values : things set by SetFonts, SetBorders.
|
||||
virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
|
||||
// ...
|
||||
|
||||
bool HistoryBack();
|
||||
bool HistoryForward();
|
||||
// Goes to previous/next page (in browsing history)
|
||||
// Returns TRUE if successful, FALSE otherwise
|
||||
void HistoryClear();
|
||||
// Resets history
|
||||
|
||||
wxHtmlContainerCell* GetInternalRepresentation() const {return m_Cell;}
|
||||
// Returns pointer to conteiners/cells structure.
|
||||
// It should be used ONLY when printing
|
||||
|
||||
static void AddFilter(wxHtmlFilter *filter);
|
||||
// Adds input filter
|
||||
|
||||
virtual void OnLinkClicked(const wxString& link);
|
||||
// called when users clicked on hypertext link. Default behavior is to
|
||||
// call LoadPage(loc)
|
||||
|
||||
protected:
|
||||
bool ScrollToAnchor(const wxString& anchor);
|
||||
// Scrolls to anchor of this name. (Anchor is #news
|
||||
// or #features etc. it is part of address sometimes:
|
||||
// http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html#news)
|
||||
// Return value : TRUE if anchor exists, FALSE otherwise
|
||||
|
||||
void CreateLayout();
|
||||
// prepare layout (= fill m_PosX, m_PosY for fragments) based on actual size of
|
||||
// window. This method also setup scrollbars
|
||||
|
||||
void OnDraw(wxDC& dc);
|
||||
void OnSize(wxSizeEvent& event);
|
||||
void OnMouseEvent(wxMouseEvent& event);
|
||||
void OnIdle(wxIdleEvent& event);
|
||||
void OnKeyDown(wxKeyEvent& event);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLWIN_H__
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
219
include/wx/html/htmlwinparser.h
Normal file
@@ -0,0 +1,219 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlwinparser.h
|
||||
// Purpose: wxHtmlWinParser class (parser to be used with wxHtmlWindow)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifndef __HTMLWINPARSER_H__
|
||||
#define __HTMLWINPARSER_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/module.h>
|
||||
#include <wx/html/htmlparser.h>
|
||||
#include <wx/html/htmlcell.h>
|
||||
|
||||
class wxHtmlWinParser;
|
||||
class wxHtmlWinTagHandler;
|
||||
class wxHtmlTagsModule;
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlWinParser
|
||||
// This class is derived from wxHtmlParser and its mail goal
|
||||
// is to parse HTML input so that it can be displayed in
|
||||
// wxHtmlWindow. It uses special wxHtmlWinTagHandler.
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlWinParser)
|
||||
|
||||
friend class wxHtmlWindow;
|
||||
|
||||
private:
|
||||
wxWindow *m_Window;
|
||||
// window we're parsing for
|
||||
wxDC *m_DC;
|
||||
// Device Context we're parsing for
|
||||
static wxList m_Modules;
|
||||
// list of tags modules (see wxHtmlTagsModule for details)
|
||||
// This list is used to initialize m_Handlers member.
|
||||
|
||||
wxHtmlContainerCell *m_Container;
|
||||
// actual container. See Open/CloseContainer for details.
|
||||
|
||||
int m_FontBold, m_FontItalic, m_FontUnderlined, m_FontFixed; // this is not TRUE,FALSE but 1,0, we need it for indexing
|
||||
int m_FontSize; /* -2 to +4, 0 is default */
|
||||
wxColour m_LinkColor;
|
||||
wxColour m_ActualColor;
|
||||
// basic font parameters.
|
||||
wxString m_Link;
|
||||
// actual hypertext link or empty string
|
||||
bool m_UseLink;
|
||||
// TRUE if m_Link is not empty
|
||||
long m_CharHeight, m_CharWidth;
|
||||
// average height of normal-sized text
|
||||
int m_Align;
|
||||
// actual alignment
|
||||
|
||||
wxFont *m_FontsTable[2][2][2][2][7];
|
||||
// table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off
|
||||
// state of these flags (from left to right):
|
||||
// [bold][italic][underlined][fixed_size]
|
||||
// last index is font size : from 0 to 7 (remapped from html sizes -2 to +4)
|
||||
// Note : this table covers all possible combinations of fonts, but not
|
||||
// all of them are used, so many items in table are usually NULL.
|
||||
int m_FontsSizes[7];
|
||||
wxString m_FontFaceFixed, m_FontFaceNormal;
|
||||
int m_ItalicModeFixed, m_ItalicModeNormal;
|
||||
// html font sizes and faces of fixed and proportional fonts
|
||||
|
||||
public:
|
||||
wxHtmlWinParser() : wxHtmlParser() {wxHtmlWinParser(NULL);}
|
||||
wxHtmlWinParser(wxWindow *wnd);
|
||||
|
||||
virtual void InitParser(const wxString& source);
|
||||
virtual void DoneParser();
|
||||
virtual wxObject* GetProduct();
|
||||
|
||||
virtual void SetDC(wxDC *dc) {m_DC = dc;}
|
||||
// Set's the DC used for parsing. If SetDC() is not called,
|
||||
// parsing won't proceed
|
||||
wxDC *GetDC() {return m_DC;}
|
||||
int GetCharHeight() const {return m_CharHeight;}
|
||||
int GetCharWidth() const {return m_CharWidth;}
|
||||
// NOTE : these functions do _not_ return _actual_
|
||||
// height/width. They return h/w of default font
|
||||
// for this DC. If you want actual values, call
|
||||
// GetDC() -> GetChar...()
|
||||
wxWindow *GetWindow() {return m_Window;}
|
||||
// returns associated wxWindow
|
||||
|
||||
void SetFonts(wxString normal_face, int normal_italic_mode, wxString fixed_face, int fixed_italic_mode, int *sizes);
|
||||
// sets fonts to be used when displaying HTML page.
|
||||
// *_italic_mode can be either wxSLANT or wxITALIC
|
||||
|
||||
virtual wxList* GetTempData();
|
||||
|
||||
static void AddModule(wxHtmlTagsModule *module);
|
||||
// Adds tags module. see wxHtmlTagsModule for details.
|
||||
|
||||
// parsing-related methods. These methods are called by tag handlers:
|
||||
wxHtmlContainerCell *GetContainer() const {return m_Container;}
|
||||
// Returns pointer to actual container. Common use in tag handler is :
|
||||
// m_WParser -> GetContainer() -> InsertCell(new ...);
|
||||
wxHtmlContainerCell *OpenContainer();
|
||||
// opens new container. This container is sub-container of opened
|
||||
// container. Sets GetContainer to newly created container
|
||||
// and returns it.
|
||||
wxHtmlContainerCell *SetContainer(wxHtmlContainerCell *c);
|
||||
// works like OpenContainer except that new container is not created
|
||||
// but c is used. You can use this to directly set actual container
|
||||
wxHtmlContainerCell *CloseContainer();
|
||||
// closes the container and sets actual Container to upper-level
|
||||
// container
|
||||
|
||||
int GetFontSize() const {return m_FontSize;}
|
||||
void SetFontSize(int s) {m_FontSize = s;}
|
||||
int GetFontBold() const {return m_FontBold;}
|
||||
void SetFontBold(int x) {m_FontBold = x;}
|
||||
int GetFontItalic() const {return m_FontItalic;}
|
||||
void SetFontItalic(int x) {m_FontItalic = x;}
|
||||
int GetFontUnderlined() const {return m_FontUnderlined;}
|
||||
void SetFontUnderlined(int x) {m_FontUnderlined = x;}
|
||||
int GetFontFixed() const {return m_FontFixed;}
|
||||
void SetFontFixed(int x) {m_FontFixed = x;}
|
||||
|
||||
int GetAlign() const {return m_Align;}
|
||||
void SetAlign(int a) {m_Align = a;}
|
||||
const wxColour& GetLinkColor() const {return m_LinkColor;}
|
||||
void SetLinkColor(const wxColour& clr) {m_LinkColor = clr;}
|
||||
const wxColour& GetActualColor() const {return m_ActualColor;}
|
||||
void SetActualColor(const wxColour& clr) {m_ActualColor = clr;}
|
||||
const wxString& GetLink() const {return m_Link;}
|
||||
void SetLink(const wxString& link) {m_Link = link; m_UseLink = link.Length() > 0;}
|
||||
|
||||
virtual wxFont* CreateCurrentFont();
|
||||
// creates font depending on m_Font* members.
|
||||
// (note : it calls wxHtmlWindow's CreateCurrentFont...)
|
||||
|
||||
protected:
|
||||
virtual void AddText(const char *txt);
|
||||
|
||||
private:
|
||||
bool m_tmpLastWasSpace;
|
||||
// temporary variable used by AddText
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlWinTagHandler
|
||||
// This is basicly wxHtmlTagHandler except
|
||||
// it is extended with protected member m_Parser pointing to
|
||||
// the wxHtmlWinParser object
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlWinTagHandler : public wxHtmlTagHandler
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS(wxHtmlWinTagHandler)
|
||||
|
||||
protected:
|
||||
wxHtmlWinParser *m_WParser;
|
||||
// same as m_Parser, but overcasted
|
||||
|
||||
public:
|
||||
wxHtmlWinTagHandler() : wxHtmlTagHandler() {};
|
||||
|
||||
virtual void SetParser(wxHtmlParser *parser) {wxHtmlTagHandler::SetParser(parser); m_WParser = (wxHtmlWinParser*) parser;};
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlTagsModule
|
||||
// This is basic of dynamic tag handlers binding.
|
||||
// The class provides methods for filling parser's handlers
|
||||
// hash table.
|
||||
// (See documentation for details)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxHtmlTagsModule : public wxModule
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlTagsModule)
|
||||
|
||||
public:
|
||||
wxHtmlTagsModule() : wxModule() {};
|
||||
|
||||
virtual bool OnInit();
|
||||
virtual void OnExit();
|
||||
|
||||
virtual void FillHandlersTable(wxHtmlWinParser *parser) {}
|
||||
// This is called by wxHtmlWinParser.
|
||||
// The method must simply call parser->AddTagHandler(new <handler_class_name>);
|
||||
// for each handler
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // __HTMLWINPARSER_H__
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
102
include/wx/html/mod_templ.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mod_templ.h
|
||||
// Purpose: wxHtml tags module generic "template"
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
|
||||
DESCRIPTION:
|
||||
This is set of macros for easier writing of tag handlers. How to use it?
|
||||
See mod_fonts.cpp for example...
|
||||
|
||||
Attention! This is quite strange C++ bastard. Before using it,
|
||||
I STRONGLY recommend reading and understanding these macros!!
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MOD_TEMPL_H__
|
||||
#define __MOD_TEMPL_H__
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#include <wx/html/htmlwinparser.h>
|
||||
|
||||
|
||||
#define TAG_HANDLER_BEGIN(name,tags) \
|
||||
class HTML_Handler_##name : public wxHtmlWinTagHandler \
|
||||
{ \
|
||||
public: \
|
||||
wxString GetSupportedTags() {return tags;}
|
||||
|
||||
|
||||
|
||||
#define TAG_HANDLER_VARS \
|
||||
private:
|
||||
|
||||
#define TAG_HANDLER_CONSTR(name) \
|
||||
public: \
|
||||
HTML_Handler_##name () : wxHtmlWinTagHandler()
|
||||
|
||||
|
||||
#define TAG_HANDLER_PROC(varib) \
|
||||
public: \
|
||||
bool HandleTag(const wxHtmlTag& varib)
|
||||
|
||||
|
||||
|
||||
#define TAG_HANDLER_END(name) \
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#define TAGS_MODULE_BEGIN(name) \
|
||||
class HTML_Module##name : public wxHtmlTagsModule \
|
||||
{ \
|
||||
DECLARE_DYNAMIC_CLASS(HTML_Module##name ) \
|
||||
public: \
|
||||
void FillHandlersTable(wxHtmlWinParser *parser) \
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
#define TAGS_MODULE_ADD(handler) \
|
||||
parser -> AddTagHandler(new HTML_Handler_##handler);
|
||||
|
||||
|
||||
|
||||
|
||||
#define TAGS_MODULE_END(name) \
|
||||
} \
|
||||
}; \
|
||||
IMPLEMENT_DYNAMIC_CLASS(HTML_Module##name , wxHtmlTagsModule)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
BIN
include/wx/html/msw/back.bmp
Normal file
After Width: | Height: | Size: 202 B |
BIN
include/wx/html/msw/book.ico
Normal file
After Width: | Height: | Size: 318 B |
BIN
include/wx/html/msw/folder.ico
Normal file
After Width: | Height: | Size: 318 B |
BIN
include/wx/html/msw/forward.bmp
Normal file
After Width: | Height: | Size: 202 B |
BIN
include/wx/html/msw/page.ico
Normal file
After Width: | Height: | Size: 318 B |
BIN
include/wx/html/msw/panel.bmp
Normal file
After Width: | Height: | Size: 710 B |
16
include/wx/html/msw/wxhtml.rc
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
//
|
||||
// This file contains bitmaps used
|
||||
// by wxHtmlHelpController
|
||||
// Include it in your .rc file if you're using wxHTML help system
|
||||
// (#include "wx/html/msw/wxhtml.rc")
|
||||
//
|
||||
|
||||
back BITMAP "wx/html/msw/back.bmp"
|
||||
forward BITMAP "wx/html/msw/forward.bmp"
|
||||
panel BITMAP "wx/html/msw/panel.bmp"
|
||||
|
||||
book ICON "wx/html/msw/book.ico"
|
||||
folder ICON "wx/html/msw/folder.ico"
|
||||
page ICON "wx/html/msw/page.ico"
|
||||
|
7
include/wx/html/version.h
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
#define wxHTML_VERSION_MAJOR 0
|
||||
#define wxHTML_VERSION_MINOR 2
|
||||
#define wxHTML_VERSION_REL 3
|
||||
|
||||
#define wxHTML_VERSION (wxHTML_VERSION_MAJOR * 1000 + wxHTML_VERSION_MINOR * 100 + wxHTML_VERSION_REL)
|
||||
|
@@ -198,6 +198,8 @@
|
||||
// wxWindow::SetToolTip() method
|
||||
#define wxUSE_SOCKETS 0
|
||||
// Set to 1 to use socket classes
|
||||
#define wxUSE_HTML 0
|
||||
// Set to 1 to use wxHTML sub-library
|
||||
|
||||
/*
|
||||
* Finer detail
|
||||
|
27
include/wx/wxhtml.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wxhtml.h
|
||||
// Purpose: wxHTML library for wxWindows
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __WXHTML_H__
|
||||
#define __WXHTML_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/html/version.h>
|
||||
#include <wx/html/htmldefs.h>
|
||||
#include <wx/html/htmltag.h>
|
||||
#include <wx/html/htmlcell.h>
|
||||
#include <wx/html/htmlparser.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <wx/html/htmlwinparser.h>
|
||||
#include <wx/filesys.h>
|
||||
#include <wx/html/htmlhelp.h>
|
||||
|
||||
#endif // __WXHTML_H__
|
70
include/wx/zipstream.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: zipstream.h
|
||||
// Purpose: wxZipInputStream for reading files from ZIP archive
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __ZIPSTREAM_H__
|
||||
#define __ZIPSTREAM_H__
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
#if wxUSE_ZLIB && wxUSE_STREAMS
|
||||
|
||||
#include <wx/stream.h>
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxZipInputStream
|
||||
// This class is input stream from ZIP archive. The archive
|
||||
// must be local file (accessible via FILE*)
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class WXDLLEXPORT wxZipInputStream : public wxInputStream
|
||||
{
|
||||
private:
|
||||
size_t m_Size;
|
||||
off_t m_Pos;
|
||||
void *m_Archive;
|
||||
// this void* is handle of archive .
|
||||
// I'm sorry it is void and not proper type but I don't want
|
||||
// to make unzip.h header public.
|
||||
|
||||
public:
|
||||
wxZipInputStream(const wxString& archive, const wxString& file);
|
||||
// archive is name of .zip archive, file is name of file to be extracted.
|
||||
// Remember that archive must be local file accesible via fopen, fread functions!
|
||||
~wxZipInputStream();
|
||||
|
||||
protected:
|
||||
virtual size_t StreamSize() const {return m_Size;}
|
||||
virtual size_t OnSysRead(void *buffer, size_t bufsize);
|
||||
virtual off_t OnSysSeek(off_t seek, wxSeekMode mode);
|
||||
virtual off_t OnSysTell() const {return m_Pos;}
|
||||
};
|
||||
|
||||
|
||||
#endif // if use_zlib && use_streams
|
||||
|
||||
#endif // __ZIPSTREAM_H__
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
8
samples/html/Makefile.am
Normal file
@@ -0,0 +1,8 @@
|
||||
## Purpose: The automake makefile for wxHTML samples
|
||||
## Author: VS
|
||||
## Version: $Id$
|
||||
##
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = about help printing test virtual widget zip
|
||||
|
9
samples/html/about/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = about
|
||||
|
||||
about_SOURCES = about.cpp
|
174
samples/html/about/about.cpp
Normal file
@@ -0,0 +1,174 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: test.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "test.cpp"
|
||||
#pragma interface "test.cpp"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/image.h>
|
||||
#include <wx/wxhtml.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Minimal_Quit = 1,
|
||||
Minimal_About,
|
||||
Minimal_Back,
|
||||
Minimal_Forward,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Minimal_Text = 1000,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Minimal_About, MyFrame::OnAbout)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
// `Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
// Create the main application window
|
||||
MyFrame *frame = new MyFrame("wxHtmlWindow testing application",
|
||||
wxPoint(50, 50), wxSize(150, 50));
|
||||
|
||||
// Show it and tell the application that it's our main window
|
||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
||||
frame->Show(TRUE);
|
||||
SetTopWindow(frame);
|
||||
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
|
||||
menuFile->Append(Minimal_About, "&About");
|
||||
menuFile->Append(Minimal_Quit, "E&xit");
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append(menuFile, "&File");
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxHtmlWindow *html;
|
||||
wxDialog dlg(this, -1, "About", wxDefaultPosition, wxSize(400, 230), wxDIALOG_MODAL | wxDEFAULT_DIALOG_STYLE);
|
||||
|
||||
html = new wxHtmlWindow(&dlg, -1, wxPoint(10, 10), wxSize(380, 160), "htmlWindow", FALSE);
|
||||
html -> SetBorders(0);
|
||||
html -> LoadPage("data/about.htm");
|
||||
wxButton *bu1 = new wxButton(&dlg, wxID_OK, "OK", wxPoint(250, 185), wxSize(100, 30));
|
||||
bu1 -> SetDefault();
|
||||
dlg.ShowModal();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
2
samples/html/about/about.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
|
17
samples/html/about/data/about.htm
Normal file
@@ -0,0 +1,17 @@
|
||||
<html><body bgcolor="#FFFFFF"><table cellspacing=3 cellpadding=4 width="100%">
|
||||
<tr><td bgcolor="#101010">
|
||||
<center><font size=+2 color="#FFFFFF"><b>
|
||||
<br>wxHTML Library Sample 0.2.0<br>
|
||||
</b></font></center>
|
||||
<tr><td bgcolor="#73A183">
|
||||
<b><font size=+1>Copyright (C) 1999 Vaclav Slavik</font></b><p>
|
||||
<font size=-1>
|
||||
<table cellpadding=0 cellspacing=0 width="100%">
|
||||
<tr><td width="65%">
|
||||
Vaclav Slavik (slavik2@czn.cz)<br>Someone Else (selse@hell.org)<p>
|
||||
<td valign=top><img src="logo.png">
|
||||
</table>
|
||||
<font size=-2>
|
||||
The wxHTML library is available at <font color="#0000FF">http://www.ms.mff.cuni.cz/~vsla8348/wxhtml</font><br>
|
||||
The library is licenced under wxWindows Library Licence, Version 3.
|
||||
</font></font></table></body></html>
|
BIN
samples/html/about/data/logo.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
9
samples/html/help/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = help
|
||||
|
||||
help_SOURCES = help.cpp
|
85
samples/html/help/help.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: test.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/image.h>
|
||||
#include <wx/wxhtml.h>
|
||||
#if (( wxVERSION_NUMBER < 2100 ) || (( wxVERSION_NUMBER == 2100 ) && (wxBETA_NUMBER <= 4)))
|
||||
#include <wx/imaggif.h>
|
||||
#endif
|
||||
#include <wx/config.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
private:
|
||||
wxHtmlHelpController help;
|
||||
wxConfig* config;
|
||||
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
bool OnInit();
|
||||
int OnExit();
|
||||
};
|
||||
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
config = new wxConfig("wxHTMLhelp");
|
||||
#if wxUSE_LIBPNG
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
#endif
|
||||
#if wxUSE_LIBJPEG
|
||||
wxImage::AddHandler(new wxJPEGHandler);
|
||||
#endif
|
||||
|
||||
help.UseConfig(config);
|
||||
help.SetTempDir("tmp");
|
||||
help.AddBook("helpfiles/testing.hhp");
|
||||
help.Display("Main page");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int MyApp::OnExit()
|
||||
{
|
||||
delete config;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
2
samples/html/help/help.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
#include "wx/html/msw/wxhtml.rc"
|
24
samples/html/help/helpfiles/Index.hhk
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1">
|
||||
<!-- Sitemap 1.0 -->
|
||||
</HEAD><BODY>
|
||||
<UL>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="1">
|
||||
<param name="Name" value="Book 1">
|
||||
<param name="Local" value="book1.htm">
|
||||
</OBJECT>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="main">
|
||||
<param name="Name" value="Untitled: d:\HELPS\testing\main.htm">
|
||||
<param name="Local" value="main.htm">
|
||||
</OBJECT>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="2">
|
||||
<param name="Name" value="Book 1">
|
||||
<param name="Local" value="book2.htm">
|
||||
</OBJECT>
|
||||
</UL>
|
||||
</BODY></HTML>
|
4
samples/html/help/helpfiles/book1.htm
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><title>Book 1</title><body>
|
||||
<h2>Book 1.</h2>
|
||||
How do you enjoy <i> book one</i>??
|
||||
</body></html>
|
5
samples/html/help/helpfiles/book2.htm
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><title>Book 1</title><body>
|
||||
<h2>Book 2.</h2>
|
||||
How do you enjoy <i> book two</i>??
|
||||
<p>Please click <a href="page2-b.htm">HERE</a>
|
||||
</body></html>
|
33
samples/html/help/helpfiles/contents.hhc
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1">
|
||||
<!-- Sitemap 1.0 -->
|
||||
</HEAD><BODY>
|
||||
<OBJECT type="text/site properties">
|
||||
<param name="ImageType" value="Folder">
|
||||
</OBJECT>
|
||||
<UL>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="Main page">
|
||||
<param name="Local" value="main.htm">
|
||||
</OBJECT>
|
||||
<UL>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="Book 1">
|
||||
<param name="Local" value="book1.htm">
|
||||
</OBJECT>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="Book 2">
|
||||
<param name="ID" value=34>
|
||||
<param name="Local" value="book2.htm">
|
||||
</OBJECT>
|
||||
<UL>
|
||||
<LI> <OBJECT type="text/sitemap">
|
||||
<param name="Name" value="sub book">
|
||||
<param name="Local" value="page2-b.htm">
|
||||
</OBJECT>
|
||||
</UL>
|
||||
</UL>
|
||||
</UL>
|
||||
</BODY></HTML>
|
5
samples/html/help/helpfiles/main.htm
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>
|
||||
<h2>This is main page.</h2>
|
||||
<a href="book1.htm">Book 1</a><br>
|
||||
<a href="book2.htm">Book 2</a><br>
|
||||
</body></html>
|
5
samples/html/help/helpfiles/page2-b.htm
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>
|
||||
<font color="#FF0000" size=+4 face="Tahoma">
|
||||
Hello, you're on sub page of page 2 !!!
|
||||
</font>
|
||||
</body></html>
|
15
samples/html/help/helpfiles/testing.hhp
Normal file
@@ -0,0 +1,15 @@
|
||||
[OPTIONS]
|
||||
Compatibility=1.1
|
||||
Compiled file=testing.chm
|
||||
Contents file=contents.hhc
|
||||
Display compile progress=No
|
||||
Index file=Index.hhk
|
||||
Language=0x405 <20>esky
|
||||
Title=Testing HELPFILE :-)
|
||||
Default topic=main.htm
|
||||
|
||||
[FILES]
|
||||
main.htm
|
||||
book1.htm
|
||||
book2.htm
|
||||
page2-b.htm
|
9
samples/html/printing/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = printing
|
||||
|
||||
printing_SOURCES = printing.cpp
|
BIN
samples/html/printing/mondrian.ico
Normal file
After Width: | Height: | Size: 766 B |
44
samples/html/printing/mondrian.xpm
Normal file
@@ -0,0 +1,44 @@
|
||||
/* XPM */
|
||||
static char *mondrian_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"32 32 6 1",
|
||||
" c Black",
|
||||
". c Blue",
|
||||
"X c #00bf00",
|
||||
"o c Red",
|
||||
"O c Yellow",
|
||||
"+ c Gray100",
|
||||
/* pixels */
|
||||
" ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" "
|
||||
};
|
BIN
samples/html/printing/pic.png
Normal file
After Width: | Height: | Size: 31 KiB |
312
samples/html/printing/printing.cpp
Normal file
@@ -0,0 +1,312 @@
|
||||
/*
|
||||
* File: printing.cc
|
||||
* Purpose: Printing demo for wxWindows class library
|
||||
* Author: Julian Smart
|
||||
* modified by Vaclav Slavik (wxHTML stuffs)
|
||||
* Created: 1995
|
||||
* Updated:
|
||||
* Copyright: (c) 1995, AIAI, University of Edinburgh
|
||||
*/
|
||||
|
||||
/* static const char sccsid[] = "%W% %G%"; */
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#if !wxUSE_PRINTING_ARCHITECTURE
|
||||
#error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile this demo.
|
||||
#endif
|
||||
|
||||
// Set this to 1 if you want to test PostScript printing under MSW.
|
||||
// However, you'll also need to edit src/msw/makefile.nt.
|
||||
|
||||
//!!! DON'T DO THAT! This is wxHTML sample now
|
||||
#define wxTEST_POSTSCRIPT_IN_MSW 0
|
||||
|
||||
#include <ctype.h>
|
||||
#include "wx/metafile.h"
|
||||
#include "wx/print.h"
|
||||
#include "wx/printdlg.h"
|
||||
|
||||
#include "wx/accel.h"
|
||||
|
||||
#if wxTEST_POSTSCRIPT_IN_MSW
|
||||
#include "wx/generic/printps.h"
|
||||
#include "wx/generic/prntdlgg.h"
|
||||
#endif
|
||||
|
||||
#include <wx/wxhtml.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include "printing.h"
|
||||
|
||||
#ifndef __WXMSW__
|
||||
#include "mondrian.xpm"
|
||||
#endif
|
||||
|
||||
// Global print data, to remember settings during the session
|
||||
wxPrintData *g_printData = (wxPrintData*) NULL ;
|
||||
|
||||
// Global page setup data
|
||||
wxPageSetupData* g_pageSetupData = (wxPageSetupData*) NULL;
|
||||
|
||||
|
||||
// Declare a frame
|
||||
MyFrame *frame = (MyFrame *) NULL;
|
||||
wxHtmlWindow *html = NULL;
|
||||
int orientation = wxPORTRAIT;
|
||||
|
||||
// Main proc
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
|
||||
MyApp::MyApp()
|
||||
{
|
||||
}
|
||||
|
||||
// The `main program' equivalent, creating the windows and returning the
|
||||
// main frame
|
||||
bool MyApp::OnInit(void)
|
||||
{
|
||||
g_printData = new wxPrintData;
|
||||
g_pageSetupData = new wxPageSetupDialogData;
|
||||
|
||||
// Create the main frame window
|
||||
frame = new MyFrame((wxFrame *) NULL, (char *) "wxWindows Printing Demo", wxPoint(0, 0), wxSize(600, 400));
|
||||
|
||||
// Give it a status line
|
||||
frame->CreateStatusBar(2);
|
||||
|
||||
// Load icon and bitmap
|
||||
frame->SetIcon( wxICON( mondrian) );
|
||||
|
||||
// Make a menubar
|
||||
wxMenu *file_menu = new wxMenu;
|
||||
|
||||
file_menu->Append(WXPRINT_PRINT, "&Print...", "Print");
|
||||
file_menu->Append(WXPRINT_PRINT_SETUP, "Print &Setup...", "Setup printer properties");
|
||||
file_menu->Append(WXPRINT_PAGE_SETUP, "Page Set&up...", "Page setup");
|
||||
file_menu->Append(WXPRINT_PREVIEW, "Print Pre&view", "Preview");
|
||||
|
||||
// Accelerators
|
||||
wxAcceleratorEntry entries[1];
|
||||
entries[0].Set(wxACCEL_CTRL, (int) 'V', WXPRINT_PREVIEW);
|
||||
wxAcceleratorTable accel(1, entries);
|
||||
frame->SetAcceleratorTable(accel);
|
||||
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(WXPRINT_QUIT, "E&xit", "Exit program");
|
||||
|
||||
wxMenu *help_menu = new wxMenu;
|
||||
help_menu->Append(WXPRINT_ABOUT, "&About", "About this demo");
|
||||
|
||||
wxMenuBar *menu_bar = new wxMenuBar;
|
||||
|
||||
menu_bar->Append(file_menu, "&File");
|
||||
menu_bar->Append(help_menu, "&Help");
|
||||
|
||||
// Associate the menu bar with the frame
|
||||
frame->SetMenuBar(menu_bar);
|
||||
|
||||
frame->Centre(wxBOTH);
|
||||
frame->Show(TRUE);
|
||||
|
||||
frame->SetStatusText("Printing demo");
|
||||
|
||||
SetTopWindow(frame);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int MyApp::OnExit()
|
||||
{
|
||||
delete g_printData;
|
||||
delete g_pageSetupData;
|
||||
return 1;
|
||||
}
|
||||
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(WXPRINT_QUIT, MyFrame::OnExit)
|
||||
EVT_MENU(WXPRINT_PRINT, MyFrame::OnPrint)
|
||||
EVT_MENU(WXPRINT_PREVIEW, MyFrame::OnPrintPreview)
|
||||
EVT_MENU(WXPRINT_PRINT_SETUP, MyFrame::OnPrintSetup)
|
||||
EVT_MENU(WXPRINT_PAGE_SETUP, MyFrame::OnPageSetup)
|
||||
EVT_MENU(WXPRINT_ABOUT, MyFrame::OnPrintAbout)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Define my frame constructor
|
||||
MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
|
||||
wxFrame(frame, -1, title, pos, size)
|
||||
{
|
||||
html = new wxHtmlWindow(this);
|
||||
html -> LoadPage("test.htm");
|
||||
}
|
||||
|
||||
void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxPrinter printer;
|
||||
MyPrintout printout("My printout");
|
||||
if (!printer.Print(this, &printout, TRUE))
|
||||
wxMessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wxOK);
|
||||
}
|
||||
|
||||
void MyFrame::OnPrintPreview(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxPrintData printData;
|
||||
printData.SetOrientation(orientation);
|
||||
|
||||
// Pass two printout objects: for preview, and possible printing.
|
||||
wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout, & printData);
|
||||
if (!preview->Ok())
|
||||
{
|
||||
delete preview;
|
||||
wxMessageBox("There was a problem previewing.\nPerhaps your current printer is not set correctly?", "Previewing", wxOK);
|
||||
return;
|
||||
}
|
||||
|
||||
wxPreviewFrame *frame = new wxPreviewFrame(preview, this, "Demo Print Preview", wxPoint(100, 100), wxSize(600, 650));
|
||||
frame->Centre(wxBOTH);
|
||||
frame->Initialize();
|
||||
frame->Show(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnPrintSetup(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxPrintDialogData printDialogData(* g_printData);
|
||||
wxPrintDialog printerDialog(this, & printDialogData);
|
||||
|
||||
printerDialog.GetPrintDialogData().SetSetupDialog(TRUE);
|
||||
printerDialog.ShowModal();
|
||||
|
||||
(*g_printData) = printerDialog.GetPrintDialogData().GetPrintData();
|
||||
}
|
||||
|
||||
void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
(*g_pageSetupData) = * g_printData;
|
||||
|
||||
wxPageSetupDialog pageSetupDialog(this, g_pageSetupData);
|
||||
pageSetupDialog.ShowModal();
|
||||
|
||||
(*g_printData) = pageSetupDialog.GetPageSetupData().GetPrintData();
|
||||
(*g_pageSetupData) = pageSetupDialog.GetPageSetupData();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MyFrame::OnPrintAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
(void)wxMessageBox("wxWindows printing demo\nAuthor: Julian Smart julian.smart@ukonline.co.uk\n\nModified by Vaclav Slavik to show wxHtml features",
|
||||
"About wxWindows printing demo", wxOK|wxCENTRE);
|
||||
}
|
||||
|
||||
|
||||
bool MyPrintout::OnPrintPage(int page)
|
||||
{
|
||||
wxDC *dc = GetDC();
|
||||
if (dc)
|
||||
{
|
||||
if (page == 1)
|
||||
DrawPageOne(dc);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool MyPrintout::OnBeginDocument(int startPage, int endPage)
|
||||
{
|
||||
if (!wxPrintout::OnBeginDocument(startPage, endPage))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void MyPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
|
||||
{
|
||||
*minPage = 1;
|
||||
*maxPage = 1;
|
||||
*selPageFrom = 1;
|
||||
*selPageTo = 1;
|
||||
}
|
||||
|
||||
bool MyPrintout::HasPage(int pageNum)
|
||||
{
|
||||
return (pageNum == 1);
|
||||
}
|
||||
|
||||
|
||||
void MyPrintout::DrawPageOne(wxDC *dc)
|
||||
{
|
||||
int leftMargin = 20;
|
||||
int topMargin = 40;
|
||||
|
||||
/* You might use THIS code to set the printer DC to ROUGHLY reflect
|
||||
* the screen text size. This page also draws lines of actual length 5cm
|
||||
* on the page.
|
||||
*/
|
||||
// Get the logical pixels per inch of screen and printer
|
||||
int ppiScreenX, ppiScreenY;
|
||||
GetPPIScreen(&ppiScreenX, &ppiScreenY);
|
||||
int ppiPrinterX, ppiPrinterY;
|
||||
GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
|
||||
|
||||
// Here we obtain internal cell representation of HTML document:
|
||||
wxHtmlContainerCell *cell = html -> GetInternalRepresentation();
|
||||
|
||||
// Now we have to check in case our real page size is reduced
|
||||
// (e.g. because we're drawing to a print preview memory DC)
|
||||
int pageWidth, pageHeight;
|
||||
int w, h;
|
||||
dc->GetSize(&w, &h);
|
||||
GetPageSizePixels(&pageWidth, &pageHeight);
|
||||
|
||||
// Now we must scale it somehow. The best would be to suppose that html window
|
||||
// width is equal to page width:
|
||||
|
||||
float scale = (float)((float)(pageWidth - 0 * leftMargin)/((float)cell -> GetMaxLineWidth() + 2 * leftMargin));
|
||||
|
||||
// If printer pageWidth == current DC width, then this doesn't
|
||||
// change. But w might be the preview bitmap width, so scale down.
|
||||
float overallScale = scale * (float)(w/(float)pageWidth);
|
||||
dc->SetUserScale(overallScale, overallScale);
|
||||
|
||||
// Calculate conversion factor for converting millimetres into
|
||||
// logical units.
|
||||
// There are approx. 25.1 mm to the inch. There are ppi
|
||||
// device units to the inch. Therefore 1 mm corresponds to
|
||||
// ppi/25.1 device units. We also divide by the
|
||||
// screen-to-printer scaling factor, because we need to
|
||||
// unscale to pass logical units to DrawLine.
|
||||
|
||||
dc->SetBackgroundMode(wxTRANSPARENT);
|
||||
|
||||
// TESTING
|
||||
|
||||
int pageWidthMM, pageHeightMM;
|
||||
GetPageSizeMM(&pageWidthMM, &pageHeightMM);
|
||||
|
||||
|
||||
// This is all the printing :
|
||||
cell -> Draw(*dc, leftMargin, topMargin, 0, cell -> GetHeight());
|
||||
}
|
||||
|
||||
|
||||
|
76
samples/html/printing/printing.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* File: printing.h
|
||||
* Purpose: Printing demo for wxWindows class library
|
||||
* Author: Julian Smart
|
||||
* Created: 1995
|
||||
* Updated:
|
||||
* Copyright: (c) 1995, AIAI, University of Edinburgh
|
||||
*/
|
||||
|
||||
/* sccsid[] = "%W% %G%" */
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// Define a new application
|
||||
class MyApp: public wxApp
|
||||
{
|
||||
public:
|
||||
MyApp() ;
|
||||
bool OnInit();
|
||||
int OnExit();
|
||||
};
|
||||
|
||||
DECLARE_APP(MyApp)
|
||||
|
||||
class MyCanvas;
|
||||
|
||||
// Define a new canvas and frame
|
||||
class MyFrame: public wxFrame
|
||||
{
|
||||
public:
|
||||
MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
void OnPrint(wxCommandEvent& event);
|
||||
void OnPrintPreview(wxCommandEvent& event);
|
||||
void OnPrintSetup(wxCommandEvent& event);
|
||||
void OnPageSetup(wxCommandEvent& event);
|
||||
#if defined(__WXMSW__) && wxTEST_POSTSCRIPT_IN_MSW
|
||||
void OnPrintPS(wxCommandEvent& event);
|
||||
void OnPrintPreviewPS(wxCommandEvent& event);
|
||||
void OnPrintSetupPS(wxCommandEvent& event);
|
||||
void OnPageSetupPS(wxCommandEvent& event);
|
||||
#endif
|
||||
|
||||
void OnExit(wxCommandEvent& event);
|
||||
void OnPrintAbout(wxCommandEvent& event);
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
class MyPrintout: public wxPrintout
|
||||
{
|
||||
public:
|
||||
MyPrintout(char *title = "My printout"):wxPrintout(title) {}
|
||||
bool OnPrintPage(int page);
|
||||
bool HasPage(int page);
|
||||
bool OnBeginDocument(int startPage, int endPage);
|
||||
void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
|
||||
|
||||
void DrawPageOne(wxDC *dc);
|
||||
};
|
||||
|
||||
#define WXPRINT_QUIT 100
|
||||
#define WXPRINT_PRINT 101
|
||||
#define WXPRINT_PRINT_SETUP 102
|
||||
#define WXPRINT_PAGE_SETUP 103
|
||||
#define WXPRINT_PREVIEW 104
|
||||
|
||||
#define WXPRINT_PRINT_PS 105
|
||||
#define WXPRINT_PRINT_SETUP_PS 106
|
||||
#define WXPRINT_PAGE_SETUP_PS 107
|
||||
#define WXPRINT_PREVIEW_PS 108
|
||||
|
||||
#define WXPRINT_ABOUT 109
|
||||
|
3
samples/html/printing/printing.rc
Normal file
@@ -0,0 +1,3 @@
|
||||
mondrian ICON "mondrian.ico"
|
||||
#include "wx/msw/wx.rc"
|
||||
|
126
samples/html/printing/test.htm
Normal file
@@ -0,0 +1,126 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<META NAME="GENERATOR" CONTENT="Mozilla/4.06 [en] (X11; I; Linux 2.0.35 i686) [Netscape]">
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
This is - - default text, now switching to
|
||||
<CENTER>
|
||||
<P>center, now still ctr, now exiting</CENTER>
|
||||
|
||||
<P>exited!.<A HREF="#downtown">[link to down]</A>
|
||||
<P>Hello, this *is* default charset (helvetica, probably) and it is displayed
|
||||
with one <FONT COLOR="#FF0000">COLOR CHANGE</FONT>. Of course we
|
||||
can have as many color changes as we can, what about this <FONT COLOR="#FF0000">M</FONT><FONT COLOR="#FFFF00">A</FONT><FONT COLOR="#33FF33">D</FONT><B><FONT COLOR="#FFFFFF"><FONT SIZE=+1>N</FONT></FONT></B>E<FONT COLOR="#999999">S</FONT><FONT COLOR="#CC33CC">S?</FONT>
|
||||
<P><FONT COLOR="#000000">There was a space above.</FONT>
|
||||
<BR>
|
||||
<HR WIDTH="100%">This was a line. <TT>(BTW we are in <B>fixed</B> font
|
||||
/ <I><U>typewriter</U> font</I> right now :-)</TT>
|
||||
<BR>This is in <B>BOLD</B> face. This is <I>ITALIC.</I> This is <B><I><U>E
|
||||
V E R Y T H I N G</U></I></B>.
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<CENTER>
|
||||
<P>Right now, <FONT COLOR="#0000FF"><FONT SIZE=+4>centered REALLY Big Text</FONT></FONT>,
|
||||
how do you like (space) it?</CENTER>
|
||||
|
||||
<DIV ALIGN=right>RIGHT: <FONT SIZE=-2>text-2, </FONT><FONT SIZE=-1>text-1,
|
||||
</FONT>text+0,
|
||||
<FONT SIZE=+1>text+1,
|
||||
</FONT><FONT COLOR="#FF0000"><FONT SIZE=+2>text+2,
|
||||
</FONT></FONT><FONT SIZE=+3>text+3,
|
||||
</FONT><FONT SIZE=+4>text+4</FONT>
|
||||
<BR><U><FONT SIZE=+1>we are right now</FONT></U></DIV>
|
||||
|
||||
<CENTER><U><FONT SIZE=+1>we are center now</FONT></U></CENTER>
|
||||
<U><FONT SIZE=+1>we are left now.</FONT></U>
|
||||
<P><I><FONT COLOR="#3366FF">Blue italic text is displayed there....</FONT></I>
|
||||
<H1>
|
||||
|
||||
<HR ALIGN=LEFT SIZE=10 WIDTH="50%">This is heading one.</H1>
|
||||
this is normal
|
||||
<CENTER>
|
||||
<H1>
|
||||
This is <FONT COLOR="#33FF33">CENTERED</FONT> heading one</H1></CENTER>
|
||||
<IMG SRC="pic.png" ALT="Testing image image" >and this is text......
|
||||
<BR>
|
||||
<UL>
|
||||
<LI>
|
||||
item 1</LI>
|
||||
|
||||
<LI>
|
||||
item 2</LI>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
nested item</LI>
|
||||
|
||||
<LI>
|
||||
nested item 2</LI>
|
||||
</UL>
|
||||
|
||||
<LI>
|
||||
item 3</LI>
|
||||
</UL>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
item one</LI>
|
||||
|
||||
<LI>
|
||||
item two</LI>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
nsted item</LI>
|
||||
</OL>
|
||||
|
||||
<LI>
|
||||
last numbered item</LI>
|
||||
</OL>
|
||||
|
||||
<H1>
|
||||
Heading 1</H1>
|
||||
<I>Italic text now...</I>
|
||||
<H2>
|
||||
<I>Heading 2</I></H2>
|
||||
<I>and now?</I>
|
||||
<H3>
|
||||
Heading 3</H3>
|
||||
|
||||
<H4>
|
||||
Heading 4</H4>
|
||||
|
||||
<H5>
|
||||
Heading 5</H5>
|
||||
|
||||
<H6>
|
||||
Heading 6</H6>
|
||||
And this is normal text, once again :-)
|
||||
<P>And yes, we're in <FONT SIZE=+4>HTML DOCUMENT, </FONT><FONT SIZE=+1>so
|
||||
what about some nice <A HREF="fft.html">hypertext link</A>??</FONT>
|
||||
<P>hello?
|
||||
<CENTER>
|
||||
<P>This is <A NAME="downtown"></A>centered paragraph</CENTER>
|
||||
|
||||
<P>Now, you will see some PRE text:
|
||||
<PRE>// This is sample C++ code:
|
||||
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
printf("Go away, man!\n");
|
||||
i = 666;
|
||||
printf("\n\n\nCRASH\n DOWN NOW. . . \n");
|
||||
}</PRE>
|
||||
|
||||
<H3>
|
||||
WWW</H3>
|
||||
<A HREF="http://www.kde.org">This is WWW link to KDE site!</A>
|
||||
<BR><A HREF="http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html">(one
|
||||
folder up)</A>
|
||||
</BODY>
|
||||
</HTML>
|
9
samples/html/test/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = test
|
||||
|
||||
test_SOURCES = test.cpp
|
2474
samples/html/test/f.html
Normal file
144
samples/html/test/fft.html
Normal file
@@ -0,0 +1,144 @@
|
||||
<head>
|
||||
<META >
|
||||
<META NAME="Author" CONTENT="Vaclav Slavik">
|
||||
<META NAME="Keywords" CONTENT="wxWindows,HTML widget,HTML,free,Unix,Linux,Windows,cross-platform,wxHTML,LGPL">
|
||||
<TITLE>wxHTML : wxWindows HTML library</TITLE>
|
||||
</head>
|
||||
|
||||
<body TEXT="#000000" BGCOLOR="#8D99BC" LINK="#51188E" VLINK="#51188E" ALINK="#FF0000">
|
||||
|
||||
<!-- TITLE BAR -->
|
||||
|
||||
<center>
|
||||
<img src="pic/logo.png">
|
||||
<p>
|
||||
[ Intro & News ]
|
||||
<a href="features.html.iso-8859-1">[ Features ]</a>
|
||||
<a href="downloads.html.iso-8859-1">[ Download ]</a>
|
||||
<a href="licence.html.iso-8859-1">[ Licence ]</a>
|
||||
<a href="screenshots.html.iso-8859-1">[ Screenshots ]</a>
|
||||
<a href="links.html.iso-8859-1">[ Links & Apps ]</a>
|
||||
</center>
|
||||
|
||||
|
||||
<!-- PAGE -->
|
||||
|
||||
|
||||
<!-- HEADLINE -->
|
||||
|
||||
<p align=center><b><font color="#9B3030">
|
||||
|
||||
<center><table bgcolor="#00000" width="60%" cellpadding=1>
|
||||
<tr><td>
|
||||
<table width="100%" cellspacing=1 cellpadding=0><tr><td bgcolor="#7783A2" valign=center><font color="#FFFFFF" size=+2><center>
|
||||
|
||||
Latest release 0.2.3
|
||||
|
||||
</center></font>
|
||||
</table>
|
||||
</table></center>
|
||||
|
||||
</font></b></p>
|
||||
|
||||
<center></center>
|
||||
<div align=right><font size=-1>
|
||||
<!-- begin include -->
|
||||
2811<!-- end --> visitors since January 99
|
||||
|
||||
|
||||
<br>Last updated on : June 13, 1999
|
||||
|
||||
|
||||
</font></div>
|
||||
<p>
|
||||
|
||||
<table width="100%" cellspacing=0 cellpadding=6 border><tr><td width="30%" bgcolor="#7783A2" valign=top>
|
||||
|
||||
|
||||
<!-- NEWS -->
|
||||
|
||||
<h2><u>News</u></h2>
|
||||
|
||||
<ul>
|
||||
<li><b><font color="#9B3030">13/06/1999</font> - CVS available! </b><br>
|
||||
Thanks to Russell Smith, development version of wxHTML is available through CVS.
|
||||
See Download page for details!
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><b><font color="#9B3030">13/06/1999</font> - 0.2.3 release </b><br>
|
||||
Only minor changes and bugfixes.
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><b><font color="#9B3030">16/05/1999</font> - New release </b><br>
|
||||
Well, 0.2.1 is out. It contains some bug fixes (mainly related to Visual C++)
|
||||
and new help controller that works with MS HTML Help Workshop projects as
|
||||
it's native format. Patch from previous version is only 30kB so don't hesitate
|
||||
to download it!
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><b><font color="#9B3030">02/05/1999</font> - Beta release 0.2 is out!</b><br>
|
||||
Ok, it's here, download it! Help controller is included (and broken under
|
||||
MSW/Mingw32 - I'll fix it asap. If anyone can help with it, please do so...)
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- INTRO -->
|
||||
|
||||
<td valign=top>
|
||||
<h2><u>Intro</u></h2>
|
||||
|
||||
I started work on this library in January, 1999.
|
||||
<br>The main goal was to provide light-weight HTML viewer for
|
||||
<a href="http://web.ukonline.co.uk/julian.smart/wxwin">wxWindows 2</a> toolkit.
|
||||
This viewer was expected to be used as help/documentation browser rather than full-featured web browser.
|
||||
|
||||
<p>This library is released under <b><font color="#330000"><a href="licence.html.iso-8859-1">
|
||||
wxWindows Library Licence, Version 3</a></font>.</b> It is basically
|
||||
GNU Library General Public Licence except that it makes using
|
||||
wxHTML in commercial products much easier.
|
||||
|
||||
<p>The library should work on all platforms supported by wxWindows - it
|
||||
is written as poor wxWindows-only code, without line of platform-specific
|
||||
code (as I hope :-). It is known to compile under these enviromnets:
|
||||
|
||||
<ul>
|
||||
<li>EGCS under Linux
|
||||
<li>Cygwin b20 or Mingw32 under Windows 95
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- AUTHOR -->
|
||||
|
||||
<h2><u>Author(s)</u></h2>
|
||||
<i>wxHTML (and this page) is copyrighted by Vaclav Slavik. Parts of wxHTML are copyrighted by other
|
||||
autors - all of them are listed in <a href="#contrib">contributors</a> section.
|
||||
</i>
|
||||
<p>
|
||||
Feel free to send your suggestions, comments, bug reports to me. My
|
||||
e-mail address is
|
||||
|
||||
<br><A HREF="mailto:slavik2@czn.cz">slavik2@czn.cz</A>
|
||||
<br>or
|
||||
<br><A HREF="mailto:vsla8348@ss1000.ms.mff.cuni.cz">vsla8348@ss1000.ms.mff.cuni.cz</A>
|
||||
<p align=right>Vaclav Slavik
|
||||
|
||||
|
||||
<a name="contrib"><h2><u>Contributors</u></h2></a>
|
||||
<ul>
|
||||
<li><b><u>Guillermo Rodriguez Garcia</u></b> (<a href="mailto:guille@iies.es">guille@iies.es</a>)
|
||||
<br>contributed GIF reading routines
|
||||
</ul>
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
BIN
samples/html/test/pic.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
samples/html/test/pic2.bmp
Normal file
After Width: | Height: | Size: 23 KiB |
116
samples/html/test/tables.htm
Normal file
@@ -0,0 +1,116 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<META NAME="GENERATOR" CONTENT="Mozilla/4.06 [en] (X11; I; Linux 2.0.35 i686) [Netscape]">
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EF" VLINK="#51188E" ALINK="#FF0000">
|
||||
|
||||
<H3>
|
||||
This is TABLES
|
||||
tests page...</H3>
|
||||
|
||||
|
||||
(yes, really, see bellow:)
|
||||
<BR>Click <a href="test.htm">here</a> to go to original testing page...
|
||||
<BR>Click <a href="../../docs/html/man.htm">here</a> to go to manuals...
|
||||
<BR>
|
||||
<CENTER><TABLE CELLSPACING=5 BORDER COLS=2 WIDTH="40%" NOSAVE >
|
||||
<TR ALIGN=CENTER NOSAVE>
|
||||
<TD WIDTH="40%" NOSAVE>Top left
|
||||
<BR>(two lines expression)
|
||||
<P>paragraph done</TD>
|
||||
|
||||
<TD NOSAVE>Top right</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>Bottom left</TD>
|
||||
|
||||
<TD>Bottom right</TD>
|
||||
</TR>
|
||||
</TABLE></CENTER>
|
||||
|
||||
<P>Subsampling is shown there:
|
||||
<BR>
|
||||
<TABLE BORDER COLS=2 WIDTH="100%" NOSAVE >
|
||||
<TR NOSAVE>
|
||||
<TD VALIGN=BOTTOM NOSAVE>
|
||||
<TABLE BORDER COLS=2 WIDTH="50%" NOSAVE >
|
||||
<TR ALIGN=CENTER BGCOLOR="#3366FF" NOSAVE>
|
||||
<TD>a</TD>
|
||||
|
||||
<TD WIDTH="10%" NOSAVE>b</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD>c</TD>
|
||||
|
||||
<TD NOSAVE>d</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
</TD>
|
||||
|
||||
<TD VALIGN=BOTTOM NOSAVE>2</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD>3 dflkj lkjfl dkjldkfjl flk jflkf lkjflkj ljlf ajlfj alff h khg hgj
|
||||
gjg jg gjhfg fg gjh gjf jgf jgj f gjfgj kfajg </TD>
|
||||
|
||||
<TD ALIGN=CENTER VALIGN=BOTTOM BGCOLOR="#FFFF99" NOSAVE>4
|
||||
<BR>gh
|
||||
<BR>gfh
|
||||
<BR>gh
|
||||
<BR>hg
|
||||
<BR>5</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<P>This is "default" table - with no sizes givev:
|
||||
<BR>
|
||||
<TABLE BORDER COLS=4 WIDTH="100%" NOSAVE >
|
||||
<TR NOSAVE>
|
||||
<TD>Hello</TD>
|
||||
|
||||
<TD NOSAVE>lkfdsjlk fj dlfj lkfj lkjflk jlfk lk fjlk elwkf lkejflek f jlekjflkj
|
||||
ljlk lk jlkf lefjl j flkj ljl lf lfj lfjl lj lwe lekf;eh kfejh lkh kjh
|
||||
kjhkj hkj hkj lkh kjh kjlh kj</TD>
|
||||
|
||||
<TD>shortebn formo lr lk</TD>
|
||||
|
||||
<TD>djsf lkjlf poer oi pjr po kpk </TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>a</TD>
|
||||
|
||||
<TD>b</TD>
|
||||
|
||||
<TD>c</TD>
|
||||
|
||||
<TD>d</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD>1</TD>
|
||||
|
||||
<TD>2</TD>
|
||||
|
||||
<TD COLSPAN="2" ROWSPAN="2" NOSAVE>3</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>A</TD>
|
||||
|
||||
<TD>B</Td>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
203
samples/html/test/test.cpp
Normal file
@@ -0,0 +1,203 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: test.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "test.cpp"
|
||||
#pragma interface "test.cpp"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/image.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnBack(wxCommandEvent& event);
|
||||
void OnForward(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Minimal_Quit = 1,
|
||||
Minimal_About,
|
||||
Minimal_Back,
|
||||
Minimal_Forward,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Minimal_Text = 1000,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Minimal_About, MyFrame::OnAbout)
|
||||
EVT_MENU(Minimal_Back, MyFrame::OnBack)
|
||||
EVT_MENU(Minimal_Forward, MyFrame::OnForward)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
// `Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
wxLogDebug("[starting testing app]");
|
||||
#if wxUSE_LIBPNG
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
#endif
|
||||
#if wxUSE_LIBJPEG
|
||||
wxImage::AddHandler(new wxJPEGHandler);
|
||||
#endif
|
||||
// Create the main application window
|
||||
MyFrame *frame = new MyFrame("wxHtmlWindow testing application",
|
||||
wxPoint(50, 50), wxSize(640, 480));
|
||||
|
||||
// Show it and tell the application that it's our main window
|
||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
||||
frame->Show(TRUE);
|
||||
SetTopWindow(frame);
|
||||
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWindow *html;
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
wxMenu *menuNav = new wxMenu;
|
||||
|
||||
menuFile->Append(Minimal_About, "&Load wxWindows manual page");
|
||||
menuFile->AppendSeparator();
|
||||
menuFile->Append(Minimal_Quit, "E&xit");
|
||||
menuNav->Append(Minimal_Back, "Go &BACK");
|
||||
menuNav->Append(Minimal_Forward, "Go &FORWARD");
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append(menuFile, "&File");
|
||||
menuBar->Append(menuNav, "&Navigate");
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
CreateStatusBar(1);
|
||||
|
||||
{
|
||||
wxConfig *cfg = new wxConfig("wxHtmlTest");
|
||||
html = new wxHtmlWindow(this);
|
||||
html -> SetRelatedFrame(this, "HTML : %s");
|
||||
html -> SetRelatedStatusBar(0);
|
||||
html -> ReadCustomization(cfg);
|
||||
delete cfg;
|
||||
html -> LoadPage("test.htm");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
wxLogDebug("about to save config...");
|
||||
wxConfig *cfg = new wxConfig("wxHtmlTest");
|
||||
html -> WriteCustomization(cfg);
|
||||
delete cfg;
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
html -> LoadPage("fft.html");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MyFrame::OnBack(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryBack()) wxMessageBox("You reached prehistory era!");
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnForward(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryForward()) wxMessageBox("No more items in history!");
|
||||
}
|
266
samples/html/test/test.htm
Normal file
@@ -0,0 +1,266 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<META NAME="GENERATOR" CONTENT="Mozilla/4.06 [en] (X11; I; Linux 2.0.35 i686) [Netscape]">
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#006600" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
|
||||
<b><a href="tables.htm">click here to go to tables test page!</a></b>
|
||||
|
||||
<p>
|
||||
This is - - default text, now switching to
|
||||
<CENTER>
|
||||
<P>center, now still ctr, now exiting</CENTER>
|
||||
exited!.<A HREF="#downtown">[link to down]</A>
|
||||
<P>Hello, this *is* default charset (helvetica, probably) and it is displayed
|
||||
with one <FONT COLOR="#FF0000">COLOR CHANGE</FONT>. Of course we
|
||||
can have as many color changes as we can, what about this <FONT COLOR="#FF0000">M</FONT><FONT COLOR="#FFFF00">A</FONT><FONT COLOR="#33FF33">D</FONT><B><FONT COLOR="#FFFFFF"><FONT SIZE=+1>N</FONT></FONT></B>E<FONT COLOR="#999999">S</FONT><FONT COLOR="#CC33CC">S?</FONT>
|
||||
<P><FONT COLOR="#000000">There was a space above.</FONT>
|
||||
<BR>
|
||||
<HR WIDTH="100%">This was a line. <TT>(BTW we are in <B>fixed</B> font
|
||||
/ <I><U>typewriter</U> font</I> right now :-)</TT>
|
||||
<BR>This is in <B>BOLD</B> face. This is <I>ITALIC.</I> This is <B><I><U>E
|
||||
V E R Y T H I N G</U></I></B>.
|
||||
<BR>
|
||||
<P><BR>
|
||||
<CENTER>
|
||||
<P>Right now, <FONT COLOR="#0000FF"><FONT SIZE=+4>centered REALLY Big Text</FONT></FONT>,
|
||||
how do you like (space) it?</CENTER>
|
||||
|
||||
<DIV ALIGN=right>RIGHT: <FONT SIZE=-2>text-2, </FONT><FONT SIZE=-1>text-1,
|
||||
</FONT>text+0,
|
||||
<FONT SIZE=+1>text+1,
|
||||
</FONT><FONT COLOR="#FF0000"><FONT SIZE=+2>text+2,
|
||||
</FONT></FONT><FONT SIZE=+3>text+3,
|
||||
</FONT><FONT SIZE=+4>text+4</FONT>
|
||||
<BR><U><FONT SIZE=+1>we are right now</FONT></U></DIV>
|
||||
|
||||
<CENTER><U><FONT SIZE=+1>we are center now</FONT></U></CENTER>
|
||||
<U><FONT SIZE=+1>we are left now.</FONT></U>
|
||||
<P><I><FONT COLOR="#3366FF">Blue italic text is displayed there....</FONT></I>
|
||||
<H1>
|
||||
|
||||
<HR ALIGN=LEFT SIZE=10 WIDTH="50%">This is heading one.</H1>
|
||||
this is normal
|
||||
<CENTER>
|
||||
<H1>
|
||||
This is <FONT COLOR="#33FF33">CENTERED</FONT> heading one</H1></CENTER>
|
||||
<FONT COLOR="#FFFF00">Yes, hmmmmmmmmm........, right now, <TT>we should
|
||||
display some tiny nice image</TT>, he?</FONT>
|
||||
<BR><IMG SRC="pic.png" ALT="Testing image image" ><IMG SRC="pic2.bmp">and this is text......
|
||||
<P><IMG SRC="pic.png" ALT="Testing image image" HEIGHT=200 WIDTH=327 ALIGN=CENTER>and
|
||||
this is text......
|
||||
<BR><A HREF="pic.png"><IMG SRC="pic.png" ALT="Testing image image" HEIGHT=160 WIDTH=100 ALIGN=TEXTTOP></A> (try clicking on the image :-) and
|
||||
this is text......
|
||||
<BR>
|
||||
<BR>
|
||||
<UL>
|
||||
<LI>
|
||||
item 1</LI>
|
||||
|
||||
<LI>
|
||||
item 2</LI>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
nested item</LI>
|
||||
|
||||
<LI>
|
||||
nested item 2</LI>
|
||||
</UL>
|
||||
|
||||
<LI>
|
||||
item 3</LI>
|
||||
</UL>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
item one</LI>
|
||||
|
||||
<LI>
|
||||
item two</LI>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
nsted item</LI>
|
||||
</OL>
|
||||
|
||||
<LI>
|
||||
last numbered item</LI>
|
||||
</OL>
|
||||
|
||||
<H1>
|
||||
Heading 1</H1>
|
||||
<I>Italic text now...</I>
|
||||
<H2>
|
||||
<I>Heading 2</I></H2>
|
||||
<I>and now?</I>
|
||||
<H3>
|
||||
Heading 3</H3>
|
||||
|
||||
<H4>
|
||||
Heading 4</H4>
|
||||
|
||||
<H5>
|
||||
Heading 5</H5>
|
||||
|
||||
<H6>
|
||||
Heading 6</H6>
|
||||
And this is normal text, once again :-)
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
<P>And yes, we're in <FONT SIZE=+4>HTML DOCUMENT, </FONT><FONT SIZE=+1>so
|
||||
what about some nice <A HREF="fft.html">hypertext link</A>??</FONT>
|
||||
<P>hello?
|
||||
<BR>
|
||||
<P><BR>
|
||||
<CENTER>
|
||||
<P>This is <A NAME="downtown"></a>centered paragraph</CENTER>
|
||||
|
||||
<P>This is new par?
|
||||
<P><B>We switched to BOLD</B>
|
||||
<P><B>This is new paragraph</B> Bold is off now.
|
||||
<P>new par
|
||||
<P> -----------
|
||||
<P><FONT SIZE=-2>Hello</FONT>
|
||||
<OL><FONT SIZE=-2>this is standalone :-)</FONT>
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item number one. iti lkdjfdl kjd lk jlkjdl kjlk jlf
|
||||
jflkj d lfkjlkf jl jflkj flkwe lkhelf ;fk;fl kw;lfke ;ffj lkjflk wj lfjl
|
||||
fkw ;k;ekf;lkfe ;kf;lk; ;j ;lrj;wfj;f ;eljfw; lfj;ewlfj dagdja gdj chga
|
||||
kjegiquw iuqdb qiud iquwd hurray googoo.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO two two two two two two twotwo TWO two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO</FONT></LI>
|
||||
|
||||
<BLOCKQUOTE><FONT SIZE=+0><B>(blockquote)</B>two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO</FONT>
|
||||
<BLOCKQUOTE><FONT SIZE=+0>two two two two two two twotwo TWO two two two</FONT></BLOCKQUOTE>
|
||||
<FONT SIZE=+0>two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO</FONT></BLOCKQUOTE>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO</FONT>
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item nyumber 3.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item number one. iti lkdjfdl kjd lk jlkjdl kjlk jlf
|
||||
jflkj d lfkjlkf jl jflkj flkwe lkhelf ;fk;fl kw;lfke ;ffj lkjflk wj lfjl
|
||||
fkw ;k;ekf;lkfe ;kf;lk; ;j ;lrj;wfj;f ;eljfw; lfj;ewlfj dagdja gdj chga
|
||||
kjegiquw iuqdb qiud iquwd hurray googoo.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO two two two two two two twotwo TWO two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO two two two two two two twotwo TWO two
|
||||
two two two two two twotwo TWO two two two two two two twotwo TWO two two
|
||||
two two two two twotwo TWO two two two two two two twotwo TWO two two two
|
||||
two two two twotwo TWO two two two two two two twotwo TWO two two two two
|
||||
two two twotwo TWO two two two two two two twotwo TWO</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item nyumber 3.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item number one. iti lkdjfdl kjd lk jlkjdl kjlk jlf
|
||||
jflkj d lfkjlkf jl jflkj flkwe lkhelf ;fk;fl kw;lfke ;ffj lkjflk wj lfjl
|
||||
fkw ;k;ekf;lkfe ;kf;lk; ;j ;lrj;wfj;f ;eljfw; lfj;ewlfj dagdja gdj chga
|
||||
kjegiquw iuqdb qiud iquwd hurray googoo.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO two two two two two two twotwo TWO two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO two two two two two two twotwo TWO two
|
||||
two two two two two twotwo TWO two two two two two two twotwo TWO two two
|
||||
two two two two twotwo TWO two two two two two two twotwo TWO two two two
|
||||
two two two twotwo TWO two two two two two two twotwo TWO two two two two
|
||||
two two twotwo TWO two two two two two two twotwo TWO</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item nyumber 3.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item number one. iti lkdjfdl kjd lk jlkjdl kjlk jlf
|
||||
jflkj d lfkjlkf jl jflkj flkwe lkhelf ;fk;fl kw;lfke ;ffj lkjflk wj lfjl
|
||||
fkw ;k;ekf;lkfe ;kf;lk; ;j ;lrj;wfj;f ;eljfw; lfj;ewlfj dagdja gdj chga
|
||||
kjegiquw iuqdb qiud iquwd hurray googoo.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO two two two two two two twotwo TWO two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO two two two two two two twotwo TWO two
|
||||
two two two two two twotwo TWO two two two two two two twotwo TWO two two
|
||||
two two two two twotwo TWO two two two two two two twotwo TWO two two two
|
||||
two two two twotwo TWO two two two two two two twotwo TWO two two two two
|
||||
two two twotwo TWO two two two two two two twotwo TWO</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item nyumber 3.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item number one. iti lkdjfdl kjd lk jlkjdl kjlk jlf
|
||||
jflkj d lfkjlkf jl jflkj flkwe lkhelf ;fk;fl kw;lfke ;ffj lkjflk wj lfjl
|
||||
fkw ;k;ekf;lkfe ;kf;lk; ;j ;lrj;wfj;f ;eljfw; lfj;ewlfj dagdja gdj chga
|
||||
kjegiquw iuqdb qiud iquwd hurray googoo.</FONT></LI>
|
||||
|
||||
<LI>
|
||||
<FONT SIZE=-2>two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO two two two two two two twotwo TWO two two two two two two twotwo
|
||||
TWO two two two two two two twotwo TWO two two two two two two twotwo TWO
|
||||
two two two two two two twotwo TWO two two two two two two twotwo TWO</FONT></LI>
|
||||
|
||||
<P><BR><FONT SIZE=-2>two two two two two two twotwo TWO two two two two
|
||||
two two twotwo TWO two two two two two two twotwo TWO two two two two two
|
||||
two twotwo TWO</FONT>
|
||||
<P><FONT SIZE=-2>two two two two two two twotwo TWO two two two two two
|
||||
two twotwo TWO two two two two two two twotwo TWO two two two two two two
|
||||
twotwo TWO</FONT>
|
||||
<LI>
|
||||
<FONT SIZE=-2>This is item nyumber 3.</FONT></LI>
|
||||
</OL>
|
||||
Now, you will see some PRE text:<p>
|
||||
<PRE>// This is sample C++ code:
|
||||
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
printf("Go away, man!\n");
|
||||
i = 666;
|
||||
printf("\n\n\nCRASH\n DOWN NOW. . . \n");
|
||||
}</PRE>
|
||||
|
||||
<H3>WWW</H3>
|
||||
<A HREF="http://www.kde.org">This is WWW link to KDE site!</A>
|
||||
<BR>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<A HREF="http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html">(one folder up)</A>
|
||||
<BR>
|
||||
|
||||
...
|
||||
<BR>
|
||||
...
|
||||
<BR>
|
||||
Link to normal text file : <a href="test.cpp">test.cpp</a>
|
||||
<BR>
|
||||
And link to BINARY : <a href="test">Unix</a> or <a href="test.exe">Windows</a>
|
||||
<BR>
|
||||
<a href="http://www.tue.nl">ANOTHER LINK(www.tue.nl)</a>
|
||||
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
2
samples/html/test/test.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
|
9
samples/html/virtual/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = virtual
|
||||
|
||||
virtual_SOURCES = virtual.cpp
|
12
samples/html/virtual/start.htm
Normal file
@@ -0,0 +1,12 @@
|
||||
<html>
|
||||
<head><title>VFS Demo</title></head>
|
||||
<body>
|
||||
<h3>Virtual File Systems demonstration</h3>
|
||||
|
||||
Hello. This sample demonstrates VFS. Try the link (and have a look
|
||||
at status bar before clicking on them)
|
||||
<p>
|
||||
<a href="myVFS:node"><b>Enter top level Node...</b></a>
|
||||
|
||||
</body>
|
||||
</html>
|
231
samples/html/virtual/virtual.cpp
Normal file
@@ -0,0 +1,231 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: virtua;.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
// demonstrates virtual file systems feature
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "test.cpp"
|
||||
#pragma interface "test.cpp"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
|
||||
// new handler class:
|
||||
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/mstream.h>
|
||||
|
||||
|
||||
|
||||
class MyVFS : public wxFileSystemHandler
|
||||
{
|
||||
public:
|
||||
MyVFS() : wxFileSystemHandler() {}
|
||||
|
||||
wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
|
||||
bool CanOpen(const wxString& location);
|
||||
};
|
||||
|
||||
|
||||
bool MyVFS::CanOpen(const wxString& location)
|
||||
{
|
||||
return (GetProtocol(location) == "myVFS");
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxFSFile* MyVFS::OpenFile(wxFileSystem& fs, const wxString& location)
|
||||
{
|
||||
wxFSFile *f;
|
||||
wxInputStream *str;
|
||||
char *buf = (char*)malloc(1024);
|
||||
|
||||
sprintf(buf, "<html><body><h2><i>You're in Node <u>%s</u></i></h2><p>"
|
||||
"Where do you want to go?<br><blockquote>"
|
||||
"<a href=\"%s-1\">sub-1</a><br>"
|
||||
"<a href=\"%s-2\">sub-2</a><br>"
|
||||
"<a href=\"%s-3\">sub-3</a><br>"
|
||||
"</blockquote></body></html>",
|
||||
location.GetData(), location.GetData(), location.GetData(), location.GetData());
|
||||
str = new wxMemoryInputStream(buf, strlen(buf));
|
||||
f = new wxFSFile(str, location, "text/html", wxEmptyString);
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnBack(wxCommandEvent& event);
|
||||
void OnForward(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Minimal_Quit = 1,
|
||||
Minimal_About,
|
||||
Minimal_Back,
|
||||
Minimal_Forward,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Minimal_Text = 1000,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Minimal_About, MyFrame::OnAbout)
|
||||
EVT_MENU(Minimal_Back, MyFrame::OnBack)
|
||||
EVT_MENU(Minimal_Forward, MyFrame::OnForward)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// `Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
// Create the main application window
|
||||
MyFrame *frame = new MyFrame("wxHtmlWindow testing application",
|
||||
wxPoint(50, 50), wxSize(640, 480));
|
||||
|
||||
// Show it and tell the application that it's our main window
|
||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
||||
frame->Show(TRUE);
|
||||
SetTopWindow(frame);
|
||||
wxFileSystem::AddHandler(new MyVFS);
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWindow *html;
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
wxMenu *menuNav = new wxMenu;
|
||||
|
||||
menuFile->Append(Minimal_Quit, "E&xit");
|
||||
menuNav->Append(Minimal_Back, "Go &BACK");
|
||||
menuNav->Append(Minimal_Forward, "Go &FORWARD");
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append(menuFile, "&File");
|
||||
menuBar->Append(menuNav, "&Navigate");
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
CreateStatusBar(1);
|
||||
|
||||
html = new wxHtmlWindow(this);
|
||||
html -> SetRelatedFrame(this, "VFS Demo: '%s'");
|
||||
html -> SetRelatedStatusBar(1);
|
||||
html -> LoadPage("start.htm");
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MyFrame::OnBack(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryBack()) wxMessageBox("You reached prehistory era!");
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnForward(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryForward()) wxMessageBox("No more items in history!");
|
||||
}
|
2
samples/html/virtual/virtual.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
|
9
samples/html/widget/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = widget
|
||||
|
||||
widget_SOURCES = widget.cpp
|
20
samples/html/widget/start.htm
Normal file
@@ -0,0 +1,20 @@
|
||||
<html>
|
||||
<head><title>Binder demo</title></head>
|
||||
<body>
|
||||
<h3>wxHtmlBinderCell demonstration</h3>
|
||||
|
||||
There is binded window somewhere around. Enjoy it.
|
||||
|
||||
<hr>
|
||||
<center>
|
||||
<mybind name="experimental binded window :-)" x=300 y=500>
|
||||
</center>
|
||||
<hr>
|
||||
|
||||
<mybind name="(small one)" x=150 y=30>
|
||||
<hr>
|
||||
|
||||
<mybind name="a widget with floating width, hurray :-)" float=y x="50" y=50>
|
||||
|
||||
</body>
|
||||
</html>
|
244
samples/html/widget/widget.cpp
Normal file
@@ -0,0 +1,244 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: virtua;.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
// demonstrates virtual file systems feature
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "test.cpp"
|
||||
#pragma interface "test.cpp"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
TAG HANDER FOR 'MYBIND' TAG
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#include <wx/html/mod_templ.h>
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(MYBIND, "MYBIND")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
wxWindow *wnd;
|
||||
int ax, ay;
|
||||
int fl = 0;
|
||||
|
||||
tag.ScanParam("X", "%i", &ax);
|
||||
tag.ScanParam("Y", "%i", &ay);
|
||||
if (tag.HasParam("FLOAT")) fl = ax;
|
||||
|
||||
wnd = new wxTextCtrl( m_WParser -> GetWindow(), -1, tag.GetParam("NAME"),
|
||||
wxPoint(0,0), wxSize(ax, ay), wxTE_MULTILINE );
|
||||
wnd -> Show(TRUE);
|
||||
|
||||
m_WParser -> OpenContainer() -> InsertCell(new wxHtmlWidgetCell(wnd, fl));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(MYBIND)
|
||||
|
||||
|
||||
|
||||
TAGS_MODULE_BEGIN(MyBind)
|
||||
|
||||
TAGS_MODULE_ADD(MYBIND)
|
||||
|
||||
TAGS_MODULE_END(MyBind)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnBack(wxCommandEvent& event);
|
||||
void OnForward(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Minimal_Quit = 1,
|
||||
Minimal_About,
|
||||
Minimal_Back,
|
||||
Minimal_Forward,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Minimal_Text = 1000,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Minimal_About, MyFrame::OnAbout)
|
||||
EVT_MENU(Minimal_Back, MyFrame::OnBack)
|
||||
EVT_MENU(Minimal_Forward, MyFrame::OnForward)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// `Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
// Create the main application window
|
||||
MyFrame *frame = new MyFrame("wxHtmlWindow testing application",
|
||||
wxPoint(50, 50), wxSize(640, 480));
|
||||
|
||||
// Show it and tell the application that it's our main window
|
||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
||||
frame->Show(TRUE);
|
||||
SetTopWindow(frame);
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWindow *html;
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
wxMenu *menuNav = new wxMenu;
|
||||
|
||||
menuFile->Append(Minimal_Quit, "E&xit");
|
||||
menuNav->Append(Minimal_Back, "Go &BACK");
|
||||
menuNav->Append(Minimal_Forward, "Go &FORWARD");
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append(menuFile, "&File");
|
||||
menuBar->Append(menuNav, "&Navigate");
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
CreateStatusBar(1);
|
||||
|
||||
html = new wxHtmlWindow(this);
|
||||
html -> SetRelatedFrame(this, "VFS Demo: '%s'");
|
||||
html -> SetRelatedStatusBar(1);
|
||||
html -> LoadPage("start.htm");
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MyFrame::OnBack(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryBack()) wxMessageBox("You reached prehistory era!");
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnForward(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryForward()) wxMessageBox("No more items in history!");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
2
samples/html/widget/widget.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
|
9
samples/html/zip/Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
AUTOMAKE_OPTIONS = 1.3 no-dependencies
|
||||
|
||||
SUFFIXES = .cpp
|
||||
|
||||
DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
|
||||
noinst_PROGRAMS = zip
|
||||
|
||||
zip_SOURCES = zip.cpp
|
BIN
samples/html/zip/pages.zip
Normal file
9
samples/html/zip/start.htm
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body>
|
||||
<h1>ZIP archive</h1>
|
||||
<h3>feature demo</h3>
|
||||
<p>
|
||||
Click on this <a href="pages.zip#zip:test.htm">link</a> to load page stored in ZIP
|
||||
archive (<a href="pages.zip">pages.zip</a>). Enjoy it!
|
||||
|
||||
|
||||
</body></html>
|
195
samples/html/zip/zip.cpp
Normal file
@@ -0,0 +1,195 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: test.cpp
|
||||
// Purpose: wxHtml testing example
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "test.cpp"
|
||||
#pragma interface "test.cpp"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/image.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <wx/fs_zip.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Define a new application type, each program should derive a class from wxApp
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
// override base class virtuals
|
||||
// ----------------------------
|
||||
|
||||
// this one is called on application startup and is a good place for the app
|
||||
// initialization (doing it here and not in the ctor allows to have an error
|
||||
// return: if OnInit() returns false, the application terminates)
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
// Define a new frame type: this is going to be our main frame
|
||||
class MyFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers (these functions should _not_ be virtual)
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnBack(wxCommandEvent& event);
|
||||
void OnForward(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Minimal_Quit = 1,
|
||||
Minimal_About,
|
||||
Minimal_Back,
|
||||
Minimal_Forward,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Minimal_Text = 1000,
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Minimal_About, MyFrame::OnAbout)
|
||||
EVT_MENU(Minimal_Back, MyFrame::OnBack)
|
||||
EVT_MENU(Minimal_Forward, MyFrame::OnForward)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
// `Main program' equivalent: the program execution "starts" here
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
#if wxUSE_LIBPNG
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
#endif
|
||||
#if wxUSE_LIBJPEG
|
||||
wxImage::AddHandler(new wxJPEGHandler);
|
||||
#endif
|
||||
|
||||
wxFileSystem::AddHandler(new wxZipFSHandler);
|
||||
|
||||
// Create the main application window
|
||||
MyFrame *frame = new MyFrame("wxHtmlWindow testing application",
|
||||
wxPoint(50, 50), wxSize(640, 480));
|
||||
|
||||
// Show it and tell the application that it's our main window
|
||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
||||
frame->Show(TRUE);
|
||||
SetTopWindow(frame);
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWindow *html;
|
||||
|
||||
// frame constructor
|
||||
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
|
||||
{
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
wxMenu *menuNav = new wxMenu;
|
||||
|
||||
menuFile->Append(Minimal_Quit, "E&xit");
|
||||
menuNav->Append(Minimal_Back, "Go &BACK");
|
||||
menuNav->Append(Minimal_Forward, "Go &FORWARD");
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
menuBar->Append(menuFile, "&File");
|
||||
menuBar->Append(menuNav, "&Navigate");
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
CreateStatusBar(1);
|
||||
|
||||
{
|
||||
html = new wxHtmlWindow(this);
|
||||
html -> SetRelatedFrame(this, "HTML : %s");
|
||||
html -> SetRelatedStatusBar(0);
|
||||
html -> LoadPage("start.htm");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MyFrame::OnBack(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryBack()) wxMessageBox("You reached prehistory era!");
|
||||
}
|
||||
|
||||
|
||||
void MyFrame::OnForward(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if (!html -> HistoryForward()) wxMessageBox("No more items in history!");
|
||||
}
|
2
samples/html/zip/zip.rc
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "wx/msw/wx.rc"
|
||||
|
294
src/common/filesys.cpp
Normal file
@@ -0,0 +1,294 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: filesys.cpp
|
||||
// Purpose: wxFileSystem class - interface for opening files
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/url.h>
|
||||
#include <wx/module.h>
|
||||
#include <wx/filesys.h>
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxFileSystemHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxFileSystemHandler, wxObject)
|
||||
|
||||
wxMimeTypesManager wxFileSystemHandler::m_MimeMng;
|
||||
|
||||
|
||||
wxString wxFileSystemHandler::GetMimeTypeFromExt(const wxString& location)
|
||||
{
|
||||
wxString ext = wxEmptyString, mime = wxEmptyString;
|
||||
wxString loc = GetRightLocation(location);
|
||||
char c;
|
||||
int l = loc.Length(), l2;
|
||||
wxFileType *ft;
|
||||
|
||||
l2 = l;
|
||||
for (int i = l-1; i >= 0; i--) {
|
||||
c = loc[i];
|
||||
if (c == '#') l2 = i + 1;
|
||||
if (c == '.') {ext = loc.Right(l2-i-1); break;}
|
||||
if ((c == '/') || (c == '\\') || (c == ':')) {return wxEmptyString;}
|
||||
}
|
||||
ft = m_MimeMng.GetFileTypeFromExtension(ext);
|
||||
if (ft && (ft -> GetMimeType(&mime))) return mime;
|
||||
else return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxFileSystemHandler::GetProtocol(const wxString& location) const
|
||||
{
|
||||
wxString s = wxEmptyString;
|
||||
int i, l = location.Length();
|
||||
bool fnd;
|
||||
|
||||
fnd = FALSE;
|
||||
for (i = l-1; (i >= 0) && ((location[i] != '#') || (!fnd)); i--) {
|
||||
if ((location[i] == ':') && (i != 1 /*win: C:\path*/)) fnd = TRUE;
|
||||
}
|
||||
if (!fnd) return "file";
|
||||
for (++i; (i < l) && (location[i] != ':'); i++) s << location[i];
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxFileSystemHandler::GetLeftLocation(const wxString& location) const
|
||||
{
|
||||
int i;
|
||||
bool fnd;
|
||||
|
||||
fnd = FALSE;
|
||||
for (i = location.Length()-1; i >= 0; i--) {
|
||||
if ((location[i] == ':') && (i != 1 /*win: C:\path*/)) fnd = TRUE;
|
||||
else if (fnd && (location[i] == '#')) return location.Left(i);
|
||||
}
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxFileSystemHandler::GetRightLocation(const wxString& location) const
|
||||
{
|
||||
int i, l = location.Length();
|
||||
int l2 = l + 1;
|
||||
for (i = l-1; (i >= 0) && ((location[i] != ':') || (i == 1) || (location[i-2] == ':')); i--) {if (location[i] == '#') l2 = i + 1;}
|
||||
if (i == 0) return wxEmptyString;
|
||||
else return location.Mid(i + 1, l2 - i - 2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxFileSystemHandler::GetAnchor(const wxString& location) const
|
||||
{
|
||||
char c;
|
||||
int l = location.Length();
|
||||
|
||||
for (int i = l-1; i >= 0; i--) {
|
||||
c = location[i];
|
||||
if (c == '#') return location.Right(l-i-1);
|
||||
else if ((c == '.') || (c == '/') || (c == '\\') || (c == ':')) return wxEmptyString;
|
||||
}
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxLocalFSHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxLocalFSHandler : public wxFileSystemHandler
|
||||
{
|
||||
public:
|
||||
virtual bool CanOpen(const wxString& location);
|
||||
virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location);
|
||||
};
|
||||
|
||||
|
||||
|
||||
bool wxLocalFSHandler::CanOpen(const wxString& location)
|
||||
{
|
||||
return GetProtocol(location) == "file";
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxFSFile* wxLocalFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
|
||||
{
|
||||
wxString right = GetRightLocation(location);
|
||||
if (wxFileExists(right))
|
||||
return new wxFSFile(new wxFileInputStream(right),
|
||||
right,
|
||||
GetMimeTypeFromExt(location),
|
||||
GetAnchor(location));
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxFileSystem
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxFileSystem, wxObject)
|
||||
|
||||
|
||||
wxList wxFileSystem::m_Handlers;
|
||||
|
||||
|
||||
|
||||
void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir)
|
||||
{
|
||||
int i, pathpos = -1;
|
||||
m_Path = location;
|
||||
|
||||
for (i = m_Path.Length()-1; i >= 0; i--)
|
||||
if (m_Path[i] == '\\') m_Path.GetWritableChar(i) = '/'; // wanna be windows-safe
|
||||
|
||||
if (is_dir == FALSE) {
|
||||
for (i = m_Path.Length()-1; i >= 0; i--) {
|
||||
if (m_Path[i] == '/') {
|
||||
if ((i > 1) && (m_Path[i-1] == '/') && (m_Path[i-2] == ':')) {
|
||||
i -= 2;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
pathpos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (m_Path[i] == ':') {
|
||||
pathpos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pathpos == -1) {
|
||||
for (i = 0; i < (int) m_Path.Length(); i++) {
|
||||
if (m_Path[i] == ':') {
|
||||
//m_Path << '/';
|
||||
m_Path.Remove(i+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == (int) m_Path.Length()) m_Path = wxEmptyString;
|
||||
}
|
||||
else {
|
||||
if (m_Path[m_Path.Length()-1] != '/') m_Path << '/';
|
||||
m_Path.Remove(pathpos+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxFSFile* wxFileSystem::OpenFile(const wxString& location)
|
||||
{
|
||||
wxString loc = location;
|
||||
int i, ln;
|
||||
char meta;
|
||||
wxFSFile *s = NULL;
|
||||
wxNode *node;
|
||||
|
||||
ln = loc.Length();
|
||||
meta = 0;
|
||||
for (i = 0; i < ln; i++) {
|
||||
if (loc[i] == '\\') loc.GetWritableChar(i) = '/'; // wanna be windows-safe
|
||||
if (!meta) switch (loc[i]) {
|
||||
case '/' : case ':' : case '#' : meta = loc[i];
|
||||
}
|
||||
}
|
||||
m_LastName = wxEmptyString;
|
||||
|
||||
// try relative paths first :
|
||||
if (meta != ':') {
|
||||
node = m_Handlers.GetFirst();
|
||||
while (node){
|
||||
wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData();
|
||||
if (h -> CanOpen(m_Path + location)) {
|
||||
s = h -> OpenFile(*this, m_Path + location);
|
||||
if (s) {m_LastName = m_Path + location; break;}
|
||||
}
|
||||
node = node -> GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
// if failed, try absolute paths :
|
||||
if (s == NULL) {
|
||||
node = m_Handlers.GetFirst();
|
||||
while (node){
|
||||
wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData();
|
||||
if (h -> CanOpen(location)) {
|
||||
s = h -> OpenFile(*this, location);
|
||||
if (s) {m_LastName = location; break; }
|
||||
}
|
||||
node = node -> GetNext();
|
||||
}
|
||||
}
|
||||
return (s);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxFileSystem::AddHandler(wxFileSystemHandler *handler)
|
||||
{
|
||||
m_Handlers.Append(handler);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///// Module:
|
||||
|
||||
class wxFileSystemModule : public wxModule
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxFileSystemModule)
|
||||
|
||||
public:
|
||||
virtual bool OnInit()
|
||||
{
|
||||
wxFileSystem::AddHandler(new wxLocalFSHandler);
|
||||
return TRUE;
|
||||
}
|
||||
virtual void OnExit() {}
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule)
|
||||
|
||||
|
||||
|
||||
|
130
src/common/fs_inet.cpp
Normal file
@@ -0,0 +1,130 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: fs_inet.cpp
|
||||
// Purpose: HTTP and FTP file system
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
|
||||
REMARKS :
|
||||
|
||||
This FS creates local cache (in /tmp directory). The cache is freed
|
||||
on program exit.
|
||||
|
||||
Size of cache is limited to cca 1000 items (due to GetTempFileName
|
||||
limitation)
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include "wx/wfstream.h"
|
||||
#include "wx/url.h"
|
||||
#include "wx/filesys.h"
|
||||
#include "wx/fs_inet.h"
|
||||
|
||||
class wxInetCacheNode : public wxObject
|
||||
{
|
||||
private:
|
||||
wxString m_Temp;
|
||||
wxString m_Mime;
|
||||
|
||||
public:
|
||||
wxInetCacheNode(const wxString& l, const wxString& m) : wxObject() {m_Temp = l; m_Mime = m;}
|
||||
const wxString& GetTemp() const {return m_Temp;}
|
||||
const wxString& GetMime() const {return m_Mime;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxInternetFSHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
bool wxInternetFSHandler::CanOpen(const wxString& location)
|
||||
{
|
||||
wxString p = GetProtocol(location);
|
||||
return (p == "http") || (p == "ftp");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
|
||||
{
|
||||
wxString right = GetProtocol(location) + ":" + GetRightLocation(location);
|
||||
wxInputStream *s;
|
||||
wxString content;
|
||||
wxInetCacheNode *info;
|
||||
|
||||
info = (wxInetCacheNode*) m_Cache.Get(right);
|
||||
|
||||
// Add item into cache:
|
||||
if (info == NULL) {
|
||||
wxURL url(right);
|
||||
s = url.GetInputStream();
|
||||
content = url.GetProtocol().GetContentType();
|
||||
if (content == wxEmptyString) content = GetMimeTypeFromExt(location);
|
||||
if (s) {
|
||||
char buf[256];
|
||||
|
||||
wxGetTempFileName("wxhtml", buf);
|
||||
info = new wxInetCacheNode(buf, content);
|
||||
m_Cache.Put(right, info);
|
||||
|
||||
{ // ok, now copy it:
|
||||
wxFileOutputStream sout(buf);
|
||||
s -> Read(sout); // copy the stream
|
||||
}
|
||||
delete s;
|
||||
}
|
||||
else return NULL; //we can't open the URL
|
||||
}
|
||||
|
||||
// Load item from cache:
|
||||
s = new wxFileInputStream(info -> GetTemp());
|
||||
if (s) {
|
||||
return new wxFSFile(s,
|
||||
right,
|
||||
info -> GetMime(),
|
||||
GetAnchor(location));
|
||||
}
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxInternetFSHandler::~wxInternetFSHandler()
|
||||
{
|
||||
wxNode *n;
|
||||
wxInetCacheNode *n2;
|
||||
|
||||
m_Cache.BeginFind();
|
||||
while ((n = m_Cache.Next()) != NULL) {
|
||||
n2 = (wxInetCacheNode*) n -> GetData();
|
||||
wxRemoveFile(n2 -> GetTemp());
|
||||
delete n2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
75
src/common/fs_zip.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: fs_zip.cpp
|
||||
// Purpose: ZIP file system
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include "wx/filesys.h"
|
||||
#include "wx/zipstream.h"
|
||||
#include "wx/fs_zip.h"
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxZipFSHandler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
bool wxZipFSHandler::CanOpen(const wxString& location)
|
||||
{
|
||||
wxString p = GetProtocol(location);
|
||||
return (p == "zip");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
wxFSFile* wxZipFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
|
||||
{
|
||||
wxString right = GetRightLocation(location);
|
||||
wxString left = GetLeftLocation(location);
|
||||
wxInputStream *s;
|
||||
|
||||
if (GetProtocol(left) != "file") {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
s = new wxZipInputStream(left, right);
|
||||
if (s && (s -> LastError() == wxStream_NOERROR)) {
|
||||
return new wxFSFile(s,
|
||||
left + "#zip:" + right,
|
||||
GetMimeTypeFromExt(location),
|
||||
GetAnchor(location));
|
||||
}
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxZipFSHandler::~wxZipFSHandler()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
1294
src/common/unzip.c
Normal file
275
src/common/unzip.h
Normal file
@@ -0,0 +1,275 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 0.15 beta, Mar 19th, 1998,
|
||||
|
||||
Copyright (C) 1998 Gilles Vollant
|
||||
|
||||
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
|
||||
WinZip, InfoZip tools and compatible.
|
||||
Encryption and multi volume ZipFile (span) are not supported.
|
||||
Old compressions used by old PKZip 1.x are not supported
|
||||
|
||||
THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
|
||||
CAN CHANGE IN FUTURE VERSION !!
|
||||
I WAIT FEEDBACK at mail info@winimage.com
|
||||
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
|
||||
*/
|
||||
/* for more info about .ZIP format, see
|
||||
ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
|
||||
PkWare has also a specification at :
|
||||
ftp://ftp.pkware.com/probdesc.zip */
|
||||
|
||||
#ifndef _unz_H
|
||||
#define _unz_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
#define UNZ_EOF (0)
|
||||
#define UNZ_PARAMERROR (-102)
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
} unz_file_info;
|
||||
|
||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
||||
const char* fileName2,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Compare two filename (fileName1,fileName2).
|
||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
||||
or strcasecmp)
|
||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
||||
(like 1 on Unix, 2 on Windows)
|
||||
*/
|
||||
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
/*
|
||||
Open a Zip file. path contain the full pathname (by example,
|
||||
on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
|
||||
"zlib/zlib111.zip".
|
||||
If the zipfile cannot be opened (file don't exist or in not valid), the
|
||||
return value is NULL.
|
||||
Else, the return value is a unzFile Handle, usable with other function
|
||||
of this unzip package.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/*
|
||||
Close a ZipFile opened with unzipOpen.
|
||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||
unz_global_info *pglobal_info));
|
||||
/*
|
||||
Write info about the ZipFile in the *pglobal_info structure.
|
||||
No preparation of the structure is needed
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||
char *szComment,
|
||||
uLong uSizeBuf));
|
||||
/*
|
||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* Unzip package allow you browse the directory of the zipfile */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the first file.
|
||||
return UNZ_OK if there is no problem
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the next file.
|
||||
return UNZ_OK if there is no problem
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
||||
const char *szFileName,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Try locate the file szFileName in the zipfile.
|
||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||
|
||||
return value :
|
||||
UNZ_OK if the file is found. It becomes the current file.
|
||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||
unz_file_info *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
/*
|
||||
Get Info about the current file
|
||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
||||
the current file
|
||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||
(fileNameBufferSize is the size of the buffer)
|
||||
if extraField!=NULL, the extra field information will be copied in extraField
|
||||
(extraFieldBufferSize is the size of the buffer).
|
||||
This is the Central-header version of the extra field
|
||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||
(commentBufferSize is the size of the buffer)
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
/* for reading the content of the current zipfile, you can open it, read data
|
||||
from it, and close it (you can close it before reading all the file)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Close the file in zip opened with unzOpenCurrentFile
|
||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error
|
||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||
*/
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
/*
|
||||
Give the current position in uncompressed data
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
/*
|
||||
return 1 if the end of file was reached, 0 elsewhere
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf==NULL, it return the size of the local extra field
|
||||
|
||||
if buf!=NULL, len is the size of the buffer, the extra header is copied in
|
||||
buf.
|
||||
the return value is the number of bytes copied in buf, or (if <0)
|
||||
the error code
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz_H */
|
110
src/common/zipstream.cpp
Normal file
@@ -0,0 +1,110 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: zipstream.cpp
|
||||
// Purpose: input stream for ZIP archive access
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/stream.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/zipstream.h>
|
||||
#include "unzip.h"
|
||||
|
||||
|
||||
|
||||
|
||||
wxZipInputStream::wxZipInputStream(const wxString& archive, const wxString& file) : wxInputStream()
|
||||
{
|
||||
unz_file_info zinfo;
|
||||
|
||||
m_Pos = 0;
|
||||
m_Size = 0;
|
||||
m_Archive = (void*) unzOpen(archive);
|
||||
if (m_Archive == NULL) {
|
||||
m_lasterror = wxStream_READ_ERR;
|
||||
return;
|
||||
}
|
||||
if (unzLocateFile((unzFile)m_Archive, file, 0) != UNZ_OK) {
|
||||
m_lasterror = wxStream_READ_ERR;
|
||||
return;
|
||||
}
|
||||
unzGetCurrentFileInfo((unzFile)m_Archive, &zinfo, NULL, 0, NULL, 0, NULL, 0);
|
||||
|
||||
if (unzOpenCurrentFile((unzFile)m_Archive) != UNZ_OK) {
|
||||
m_lasterror = wxStream_READ_ERR;
|
||||
return;
|
||||
}
|
||||
m_Size = zinfo.uncompressed_size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxZipInputStream::~wxZipInputStream()
|
||||
{
|
||||
if (m_Archive) {
|
||||
if (m_Size != 0)
|
||||
unzCloseCurrentFile((unzFile)m_Archive);
|
||||
unzClose((unzFile)m_Archive);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
size_t wxZipInputStream::OnSysRead(void *buffer, size_t bufsize)
|
||||
{
|
||||
if (m_Pos + bufsize > m_Size) bufsize = m_Size - m_Pos;
|
||||
unzReadCurrentFile((unzFile)m_Archive, buffer, bufsize);
|
||||
m_Pos += bufsize;
|
||||
return bufsize;
|
||||
}
|
||||
|
||||
|
||||
|
||||
off_t wxZipInputStream::OnSysSeek(off_t seek, wxSeekMode mode)
|
||||
{
|
||||
off_t nextpos;
|
||||
void *buf;
|
||||
|
||||
switch (mode) {
|
||||
case wxFromCurrent : nextpos = seek + m_Pos; break;
|
||||
case wxFromStart : nextpos = seek; break;
|
||||
case wxFromEnd : nextpos = m_Size - 1 + seek; break;
|
||||
default : nextpos = m_Pos; break; /* just to fool compiler, never happens */
|
||||
}
|
||||
|
||||
// cheated seeking :
|
||||
if (nextpos > m_Pos) {
|
||||
buf = malloc(nextpos - m_Pos);
|
||||
unzReadCurrentFile((unzFile)m_Archive, buf, nextpos - m_Pos);
|
||||
free(buf);
|
||||
}
|
||||
else if (nextpos < m_Pos) {
|
||||
unzCloseCurrentFile((unzFile)m_Archive);
|
||||
if (unzOpenCurrentFile((unzFile)m_Archive) != UNZ_OK) {
|
||||
m_lasterror = wxStream_READ_ERR;
|
||||
return m_Pos;
|
||||
}
|
||||
buf = malloc(nextpos);
|
||||
unzReadCurrentFile((unzFile)m_Archive, buf, nextpos);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
m_Pos = nextpos;
|
||||
return m_Pos;
|
||||
}
|
||||
|
69
src/generic/busyinfo.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: busyinfo.cpp
|
||||
// Purpose: Information window when app is busy
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include "wx/busyinfo.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wxInfoFrame::wxInfoFrame(wxWindow *parent, const wxString& message)
|
||||
: wxFrame(parent, -1, "", wxPoint(0, 0), wxSize(400, 80), wxTHICK_FRAME | wxSIMPLE_BORDER | wxFRAME_TOOL_WINDOW)
|
||||
{
|
||||
wxPanel *p = new wxPanel(this);
|
||||
wxStaticText *s = new wxStaticText(p, -1, message, wxPoint(20, 20), wxSize(360, 40), wxALIGN_CENTER);
|
||||
Centre(wxBOTH);
|
||||
p -> SetCursor(*wxHOURGLASS_CURSOR);
|
||||
s -> SetCursor(*wxHOURGLASS_CURSOR);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
wxBusyInfo::wxBusyInfo(const wxString& message) : wxObject()
|
||||
{
|
||||
m_InfoFrame = new wxInfoFrame(NULL, message);
|
||||
m_InfoFrame -> Show(TRUE);
|
||||
wxYield();
|
||||
m_InfoFrame -> Refresh();
|
||||
wxYield();
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxBusyInfo::~wxBusyInfo()
|
||||
{
|
||||
m_InfoFrame -> Show(FALSE);
|
||||
m_InfoFrame -> Close();
|
||||
wxYield();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -12,7 +12,7 @@ SUFFIXES = .cpp .c
|
||||
DEFS = $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
LIBS = $(GUILIBS)
|
||||
|
||||
VPATH = .:${srcdir}:${srcdir}/../common:${srcdir}/../generic:${EXTRA_VPATH}
|
||||
VPATH = .:${srcdir}:${srcdir}/../common:${srcdir}/../generic:${srcdir}/../html:${EXTRA_VPATH}
|
||||
|
||||
lib_LTLIBRARIES = @WX_LIBRARY_NAME@
|
||||
EXTRA_LTLIBRARIES = libwx_gtk.la libwx_motif.la libwx_msw.la
|
||||
@@ -44,7 +44,10 @@ libwx_gtk_la_SOURCES = \
|
||||
file.cpp \
|
||||
fileconf.cpp \
|
||||
filefn.cpp \
|
||||
filesys.cpp \
|
||||
framecmn.cpp \
|
||||
fs_inet.cpp \
|
||||
fs_zip.cpp \
|
||||
ftp.cpp \
|
||||
gdicmn.cpp \
|
||||
hash.cpp \
|
||||
@@ -90,6 +93,7 @@ libwx_gtk_la_SOURCES = \
|
||||
time.cpp \
|
||||
timercmn.cpp \
|
||||
tokenzr.cpp \
|
||||
unzip.c \
|
||||
url.cpp \
|
||||
utilscmn.cpp \
|
||||
valgen.cpp \
|
||||
@@ -101,10 +105,12 @@ libwx_gtk_la_SOURCES = \
|
||||
wxchar.cpp \
|
||||
wxexpr.cpp \
|
||||
zstream.cpp \
|
||||
zipstream.cpp \
|
||||
\
|
||||
db.cpp \
|
||||
dbtable.cpp \
|
||||
\
|
||||
busyinfo.cpp \
|
||||
caret.cpp \
|
||||
colrdlgg.cpp \
|
||||
dcpsg.cpp \
|
||||
@@ -192,7 +198,26 @@ libwx_gtk_la_SOURCES = \
|
||||
utilsgtk.cpp \
|
||||
utilsres.cpp \
|
||||
wave.cpp \
|
||||
window.cpp
|
||||
window.cpp \
|
||||
\
|
||||
htmlcell.cpp \
|
||||
htmlfilter.cpp \
|
||||
htmlhelp.cpp \
|
||||
htmlhelp_io.cpp \
|
||||
htmlparser.cpp \
|
||||
htmltag.cpp \
|
||||
htmlwin.cpp \
|
||||
htmlwinparser.cpp \
|
||||
mod_fonts.cpp \
|
||||
mod_hline.cpp \
|
||||
mod_image.cpp \
|
||||
mod_layout.cpp \
|
||||
mod_links.cpp \
|
||||
mod_list.cpp \
|
||||
mod_pre.cpp \
|
||||
mod_tables.cpp \
|
||||
search.cpp
|
||||
|
||||
|
||||
# these are the sources which we build by our own rules
|
||||
#
|
||||
|
@@ -12,7 +12,7 @@ SUFFIXES = .cpp .c
|
||||
DEFS = $(TOOLKIT_DEF) $(WXDEBUG_DEFINE)
|
||||
LIBS = $(GUILIBS)
|
||||
|
||||
VPATH = .:${srcdir}:${srcdir}/../common:${srcdir}/../generic:${EXTRA_VPATH}
|
||||
VPATH = .:${srcdir}:${srcdir}/../common:${srcdir}/../generic:${srcdir}/../html:${EXTRA_VPATH}
|
||||
|
||||
lib_LTLIBRARIES = @WX_LIBRARY_NAME@
|
||||
EXTRA_LTLIBRARIES = libwx_gtk.la libwx_motif.la libwx_msw.la
|
||||
@@ -44,7 +44,10 @@ libwx_gtk_la_SOURCES = \
|
||||
file.cpp \
|
||||
fileconf.cpp \
|
||||
filefn.cpp \
|
||||
filesys.cpp \
|
||||
framecmn.cpp \
|
||||
fs_inet.cpp \
|
||||
fs_zip.cpp \
|
||||
ftp.cpp \
|
||||
gdicmn.cpp \
|
||||
hash.cpp \
|
||||
@@ -90,6 +93,7 @@ libwx_gtk_la_SOURCES = \
|
||||
time.cpp \
|
||||
timercmn.cpp \
|
||||
tokenzr.cpp \
|
||||
unzip.c \
|
||||
url.cpp \
|
||||
utilscmn.cpp \
|
||||
valgen.cpp \
|
||||
@@ -101,10 +105,12 @@ libwx_gtk_la_SOURCES = \
|
||||
wxchar.cpp \
|
||||
wxexpr.cpp \
|
||||
zstream.cpp \
|
||||
zipstream.cpp \
|
||||
\
|
||||
db.cpp \
|
||||
dbtable.cpp \
|
||||
\
|
||||
busyinfo.cpp \
|
||||
caret.cpp \
|
||||
colrdlgg.cpp \
|
||||
dcpsg.cpp \
|
||||
@@ -192,7 +198,26 @@ libwx_gtk_la_SOURCES = \
|
||||
utilsgtk.cpp \
|
||||
utilsres.cpp \
|
||||
wave.cpp \
|
||||
window.cpp
|
||||
window.cpp \
|
||||
\
|
||||
htmlcell.cpp \
|
||||
htmlfilter.cpp \
|
||||
htmlhelp.cpp \
|
||||
htmlhelp_io.cpp \
|
||||
htmlparser.cpp \
|
||||
htmltag.cpp \
|
||||
htmlwin.cpp \
|
||||
htmlwinparser.cpp \
|
||||
mod_fonts.cpp \
|
||||
mod_hline.cpp \
|
||||
mod_image.cpp \
|
||||
mod_layout.cpp \
|
||||
mod_links.cpp \
|
||||
mod_list.cpp \
|
||||
mod_pre.cpp \
|
||||
mod_tables.cpp \
|
||||
search.cpp
|
||||
|
||||
|
||||
# these are the sources which we build by our own rules
|
||||
#
|
||||
|
24
src/html/bitmaps/back.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char * back_xpm[] = {
|
||||
"16 16 5 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #C0E4CB",
|
||||
"@ c #77C490",
|
||||
"# c #808080",
|
||||
" ",
|
||||
" ",
|
||||
" . ",
|
||||
" .. ",
|
||||
" .+. ",
|
||||
" .++........ ",
|
||||
" .++@+++++++. ",
|
||||
" .++@@@@@@@@@. ",
|
||||
" .+@@@@@@@@@. ",
|
||||
" #.+@........ ",
|
||||
" #.+.####### ",
|
||||
" #..# ",
|
||||
" #.# ",
|
||||
" ## ",
|
||||
" # ",
|
||||
" "};
|
40
src/html/bitmaps/book.xpm
Normal file
@@ -0,0 +1,40 @@
|
||||
/* XPM */
|
||||
static char * book_xpm[] = {
|
||||
"16 16 21 1",
|
||||
" c None",
|
||||
". c #007F7F",
|
||||
"+ c #660000",
|
||||
"@ c #CC0000",
|
||||
"# c #E50000",
|
||||
"$ c #FF0000",
|
||||
"% c #F20000",
|
||||
"& c #D80000",
|
||||
"* c #720000",
|
||||
"= c #7F0000",
|
||||
"- c #BFBFBF",
|
||||
"; c #E57F7F",
|
||||
"> c #7F7F7F",
|
||||
", c #FFFFFF",
|
||||
"' c #F2BFBF",
|
||||
") c #723F3F",
|
||||
"! c #A5A5A5",
|
||||
"~ c #E5E5E5",
|
||||
"{ c #B2B2B2",
|
||||
"] c #003F3F",
|
||||
"^ c #000000",
|
||||
" ",
|
||||
" ......... ",
|
||||
" +@#$$$$$%&+ ",
|
||||
" +##$$$$$$$* ",
|
||||
" +##$$$$$$$=- ",
|
||||
" +##$$$$$$$=;> ",
|
||||
" +##$$$$$$$=;,. ",
|
||||
" +##$$$$$$$=;,. ",
|
||||
" +##$$$$$$$=''. ",
|
||||
" +##$$$$$$$=,;. ",
|
||||
" +##$$$$$$%+,;. ",
|
||||
" +&++++++++),;. ",
|
||||
" ++!~~~~~~~~~,. ",
|
||||
" ++!~~~~~~~~~{. ",
|
||||
" ]^^^^^^^^^^^ ",
|
||||
" "};
|
50
src/html/bitmaps/folder.xpm
Normal file
@@ -0,0 +1,50 @@
|
||||
/* XPM */
|
||||
static char * folder_xpm[] = {
|
||||
"16 16 31 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #7F6E54",
|
||||
"@ c #555555",
|
||||
"# c #7F6140",
|
||||
"$ c #FFCF94",
|
||||
"% c #FFFFFF",
|
||||
"& c #D5D5D5",
|
||||
"* c #4B4336",
|
||||
"= c #FFDCA8",
|
||||
"- c #BFA57E",
|
||||
"; c #EFEFEF",
|
||||
"> c #DFDFDF",
|
||||
", c #B8B8B9",
|
||||
"' c #6E6E6F",
|
||||
") c #BF7E42",
|
||||
"! c #FFA858",
|
||||
"~ c #FFC280",
|
||||
"{ c #CFCFCF",
|
||||
"] c #55402C",
|
||||
"^ c #3C2C2C",
|
||||
"/ c #7F542C",
|
||||
"( c #C0C0C0",
|
||||
"_ c #B0B0B2",
|
||||
": c #969698",
|
||||
"< c #A8A8AB",
|
||||
"[ c #A0A0A4",
|
||||
"} c #2C2C2C",
|
||||
"| c #7C7C7E",
|
||||
"1 c #161616",
|
||||
"2 c #3F2A16",
|
||||
" .+. ",
|
||||
".@#$+. ",
|
||||
".%&@#$+.+* ",
|
||||
".%%%&@#$==-. ",
|
||||
".%%;>,')!~$+ ",
|
||||
".%;>{{,']^/~. ",
|
||||
".;>{{((,,_:]/ ",
|
||||
".>{{((,,_<[}/ ",
|
||||
".{{((,,_<[[^/ ",
|
||||
"._((,,_<[[[}/ ",
|
||||
" }|_,_<[[[[}/ ",
|
||||
" .}|<[[[[[}/ ",
|
||||
" .}|[[[[}/ ",
|
||||
" .}|[[}/.. ",
|
||||
" .}|}/.. ",
|
||||
" .12. "};
|
24
src/html/bitmaps/forward.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char * forward_xpm[] = {
|
||||
"16 16 5 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #C0E4CB",
|
||||
"@ c #77C490",
|
||||
"# c #808080",
|
||||
" ",
|
||||
" ",
|
||||
" . ",
|
||||
" .. ",
|
||||
" .+. ",
|
||||
" ........++. ",
|
||||
" .+++++++@++. ",
|
||||
" .@@@@@@@@@++. ",
|
||||
" .@@@@@@@@@+. ",
|
||||
" ........@+.# ",
|
||||
" #######.+.# ",
|
||||
" #..# ",
|
||||
" #.# ",
|
||||
" ## ",
|
||||
" # ",
|
||||
" "};
|
25
src/html/bitmaps/page.xpm
Normal file
@@ -0,0 +1,25 @@
|
||||
/* XPM */
|
||||
static char * page_xpm[] = {
|
||||
/* width height ncolors chars_per_pixel */
|
||||
"16 16 3 1",
|
||||
/* colors */
|
||||
" s None c None",
|
||||
". c #000000",
|
||||
"+ c #ffffff",
|
||||
/* pixels */
|
||||
" ",
|
||||
" ........ ",
|
||||
" .++++++.. ",
|
||||
" .+.+.++.+. ",
|
||||
" .++++++.... ",
|
||||
" .+.+.+++++. ",
|
||||
" .+++++++++. ",
|
||||
" .+.+.+.+.+. ",
|
||||
" .+++++++++. ",
|
||||
" .+.+.+.+.+. ",
|
||||
" .+++++++++. ",
|
||||
" .+.+.+.+.+. ",
|
||||
" .+++++++++. ",
|
||||
" ........... ",
|
||||
" ",
|
||||
" "};
|
122
src/html/bitmaps/panel.xpm
Normal file
@@ -0,0 +1,122 @@
|
||||
/* XPM */
|
||||
static char * panel_xpm[] = {
|
||||
"16 15 104 2",
|
||||
" c None",
|
||||
". c #7F7C7C",
|
||||
"+ c #8A8E8E",
|
||||
"@ c #D03232",
|
||||
"# c #BA7E7E",
|
||||
"$ c #555858",
|
||||
"% c #5F5F5F",
|
||||
"& c #656565",
|
||||
"* c #5D5D5D",
|
||||
"= c #939696",
|
||||
"- c #FFFFFF",
|
||||
"; c #F4C8C8",
|
||||
"> c #DCDCF4",
|
||||
", c #D3D3D3",
|
||||
"' c #4E5151",
|
||||
") c #7E7E7E",
|
||||
"! c #9E9E9E",
|
||||
"~ c #A7A7A7",
|
||||
"{ c #5C5C5C",
|
||||
"] c #9B9E9E",
|
||||
"^ c #A3A3FF",
|
||||
"/ c #BBBBFF",
|
||||
"( c #DBDBDB",
|
||||
"_ c #808B8B",
|
||||
": c #5E5E5E",
|
||||
"< c #858571",
|
||||
"[ c #AEAE4B",
|
||||
"} c #90902D",
|
||||
"| c #8B8B8B",
|
||||
"1 c #000027",
|
||||
"2 c #D7D7FF",
|
||||
"3 c #C3C3FF",
|
||||
"4 c #A7A7FF",
|
||||
"5 c #9B9BFF",
|
||||
"6 c #D7D7D7",
|
||||
"7 c #717474",
|
||||
"8 c #727D7D",
|
||||
"9 c #575721",
|
||||
"0 c #BFBF7F",
|
||||
"a c #DFDF8F",
|
||||
"b c #DFDF60",
|
||||
"c c #7F7F3B",
|
||||
"d c #2F2F7F",
|
||||
"e c #AFAFF3",
|
||||
"f c #E7E7E7",
|
||||
"g c #9797E7",
|
||||
"h c #8787F3",
|
||||
"i c #AFAFC3",
|
||||
"j c #4F4F37",
|
||||
"k c #8E9898",
|
||||
"l c #484824",
|
||||
"m c #4D4D0B",
|
||||
"n c #8C8C8C",
|
||||
"o c #7D7D36",
|
||||
"p c #74742D",
|
||||
"q c #535353",
|
||||
"r c #636363",
|
||||
"s c #5C5C4C",
|
||||
"t c #818149",
|
||||
"u c #78784C",
|
||||
"v c #787840",
|
||||
"w c #7E7E40",
|
||||
"x c #787E46",
|
||||
"y c #757F7F",
|
||||
"z c #616121",
|
||||
"A c #87874B",
|
||||
"B c #C8C88C",
|
||||
"C c #F6F6B6",
|
||||
"D c #D4D498",
|
||||
"E c #6C6C30",
|
||||
"F c #424242",
|
||||
"G c #9D9D23",
|
||||
"H c #FDFD7B",
|
||||
"I c #FFFF7F",
|
||||
"J c #7F7F3F",
|
||||
"K c #737C7C",
|
||||
"L c #808038",
|
||||
"M c #6B6B5F",
|
||||
"N c #797935",
|
||||
"O c #6E6E62",
|
||||
"P c #8B8B43",
|
||||
"Q c #8D8D8D",
|
||||
"R c #1C4B4B",
|
||||
"S c #959523",
|
||||
"T c #F9F973",
|
||||
"U c #7F7F43",
|
||||
"V c #737D7D",
|
||||
"W c #939343",
|
||||
"X c #4FD3D3",
|
||||
"Y c #185353",
|
||||
"Z c #8D8D27",
|
||||
"` c #F5F56B",
|
||||
" . c #9B9B43",
|
||||
".. c #57CFCF",
|
||||
"+. c #145B5B",
|
||||
"@. c #85851E",
|
||||
"#. c #A3A343",
|
||||
"$. c #3BA7A7",
|
||||
"%. c #636300",
|
||||
"&. c #CFCF67",
|
||||
"*. c #F3F367",
|
||||
"=. c #909A9A",
|
||||
"-. c #4B4B07",
|
||||
";. c #434325",
|
||||
" . ",
|
||||
" + @ # ",
|
||||
" $ % & * = - ; > , ",
|
||||
" ' ) ! ~ ~ { ] - - ^ / - ( ",
|
||||
"_ : < [ [ } | 1 2 - 3 / 4 5 6 7 ",
|
||||
"8 9 0 a b c 3 d e f f g h i j ",
|
||||
"k l m n o p q r s t t t u v w x ",
|
||||
"y z A B C D E F G H I I I I I J ",
|
||||
"K I L M N O P Q R S T I I I I U ",
|
||||
"V I I I I I I W X Y Z ` I I I U ",
|
||||
"8 I I I I I I I ...+.@.I I I U ",
|
||||
"K I I I I I I I I #.$.%.I I I U ",
|
||||
"8 I I I I I I I I I &.*.I I I U ",
|
||||
"V I I I I I I I I I I I I I I U ",
|
||||
"=.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;."};
|
507
src/html/htmlcell.cpp
Normal file
@@ -0,0 +1,507 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlcell.cpp
|
||||
// Purpose: wxHtmlCell - basic element of HTML output
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/html/htmlcell.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlCell
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y, bool left, bool middle, bool right)
|
||||
{
|
||||
if (GetLink() != wxEmptyString)
|
||||
((wxHtmlWindow*)parent) -> OnLinkClicked(GetLink());
|
||||
// note : this overcasting is legal because parent is *always* wxHtmlWindow
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlWordCell
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell()
|
||||
{
|
||||
m_Word = word;
|
||||
m_Word.Replace(" ", " ", TRUE);
|
||||
m_Word.Replace(""", "\"", TRUE);
|
||||
m_Word.Replace("<", "<", TRUE);
|
||||
m_Word.Replace(">", ">", TRUE);
|
||||
m_Word.Replace("&", "&", TRUE);
|
||||
dc.GetTextExtent(m_Word, &m_Width, &m_Height, &m_Descent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWordCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
dc.DrawText(m_Word, x + m_PosX, y + m_PosY);
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlContainerCell
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
wxHtmlContainerCell::wxHtmlContainerCell(wxHtmlContainerCell *parent) : wxHtmlCell()
|
||||
{
|
||||
m_Cells = m_LastCell = NULL;
|
||||
m_Parent = parent;
|
||||
if (m_Parent) m_Parent -> InsertCell(this);
|
||||
m_AlignHor = HTML_ALIGN_LEFT;
|
||||
m_AlignVer = HTML_ALIGN_BOTTOM;
|
||||
m_IndentLeft = m_IndentRight = m_IndentTop = m_IndentBottom = 0;
|
||||
m_WidthFloat = 100; m_WidthFloatUnits = HTML_UNITS_PERCENT;
|
||||
m_UseBkColour = FALSE;
|
||||
m_UseBorder = FALSE;
|
||||
m_MinHeight = m_MaxLineWidth = 0;
|
||||
m_MinHeightAlign = HTML_ALIGN_TOP;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::SetIndent(int i, int what, int units)
|
||||
{
|
||||
int val = (units == HTML_UNITS_PIXELS) ? i : -i;
|
||||
if (what & HTML_INDENT_LEFT) m_IndentLeft = val;
|
||||
if (what & HTML_INDENT_RIGHT) m_IndentRight = val;
|
||||
if (what & HTML_INDENT_TOP) m_IndentTop = val;
|
||||
if (what & HTML_INDENT_BOTTOM) m_IndentBottom = val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int wxHtmlContainerCell::GetIndent(int ind) const
|
||||
{
|
||||
if (ind & HTML_INDENT_LEFT) return m_IndentLeft;
|
||||
else if (ind & HTML_INDENT_RIGHT) return m_IndentRight;
|
||||
else if (ind & HTML_INDENT_TOP) return m_IndentTop;
|
||||
else if (ind & HTML_INDENT_BOTTOM) return m_IndentBottom;
|
||||
else return -1; /* BUG! Should not be called... */
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int wxHtmlContainerCell::GetIndentUnits(int ind) const
|
||||
{
|
||||
bool p = FALSE;
|
||||
if (ind & HTML_INDENT_LEFT) p = m_IndentLeft < 0;
|
||||
else if (ind & HTML_INDENT_RIGHT) p = m_IndentRight < 0;
|
||||
else if (ind & HTML_INDENT_TOP) p = m_IndentTop < 0;
|
||||
else if (ind & HTML_INDENT_BOTTOM) p = m_IndentBottom < 0;
|
||||
if (p) return HTML_UNITS_PERCENT;
|
||||
else return HTML_UNITS_PIXELS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::Layout(int w)
|
||||
{
|
||||
wxHtmlCell *cell = m_Cells, *line = m_Cells;
|
||||
long xpos = 0, ypos = m_IndentTop;
|
||||
int xdelta = 0, ybasicpos = 0, ydiff;
|
||||
int s_width, s_indent;
|
||||
int ysizeup = 0, ysizedown = 0;
|
||||
|
||||
/*
|
||||
|
||||
WIDTH ADJUSTING :
|
||||
|
||||
*/
|
||||
|
||||
if (m_WidthFloatUnits == HTML_UNITS_PERCENT) {
|
||||
if (m_WidthFloat < 0) m_Width = (100 + m_WidthFloat) * w / 100;
|
||||
else m_Width = m_WidthFloat * w / 100;
|
||||
}
|
||||
else {
|
||||
if (m_WidthFloat < 0) m_Width = w + m_WidthFloat;
|
||||
else m_Width = m_WidthFloat;
|
||||
}
|
||||
|
||||
if (m_Cells) {
|
||||
int l = (m_IndentLeft < 0) ? (-m_IndentLeft * m_Width / 100) : m_IndentLeft;
|
||||
int r = (m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight;
|
||||
m_Cells -> Layout(m_Width - (l + r));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
LAYOUTING :
|
||||
|
||||
*/
|
||||
|
||||
// adjust indentation:
|
||||
s_indent = (m_IndentLeft < 0) ? (-m_IndentLeft * m_Width / 100) : m_IndentLeft;
|
||||
s_width = m_Width - s_indent - ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
|
||||
|
||||
m_MaxLineWidth = 0;
|
||||
|
||||
// my own layouting:
|
||||
while (cell != NULL) {
|
||||
switch (m_AlignVer) {
|
||||
case HTML_ALIGN_TOP : ybasicpos = 0; break;
|
||||
case HTML_ALIGN_BOTTOM : ybasicpos = - cell -> GetHeight(); break;
|
||||
case HTML_ALIGN_CENTER : ybasicpos = - cell -> GetHeight() / 2; break;
|
||||
}
|
||||
ydiff = cell -> GetHeight() + ybasicpos;
|
||||
|
||||
if (cell -> GetDescent() + ydiff > ysizedown) ysizedown = cell -> GetDescent() + ydiff;
|
||||
if (ybasicpos + cell -> GetDescent() < -ysizeup) ysizeup = - (ybasicpos + cell -> GetDescent());
|
||||
|
||||
cell -> SetPos(xpos, ybasicpos + cell -> GetDescent());
|
||||
xpos += cell -> GetWidth();
|
||||
cell = cell -> GetNext();
|
||||
|
||||
// force new line if occured:
|
||||
if ((cell == NULL) || (xpos + cell -> GetWidth() > s_width)) {
|
||||
if (xpos > m_MaxLineWidth) m_MaxLineWidth = xpos;
|
||||
if (ysizeup < 0) ysizeup = 0;
|
||||
if (ysizedown < 0) ysizedown = 0;
|
||||
switch (m_AlignHor) {
|
||||
case HTML_ALIGN_LEFT : xdelta = 0; break;
|
||||
case HTML_ALIGN_RIGHT : xdelta = 0 + (s_width - xpos); break;
|
||||
case HTML_ALIGN_CENTER : xdelta = 0 + (s_width - xpos) / 2; break;
|
||||
}
|
||||
if (xdelta < 0) xdelta = 0;
|
||||
xdelta += s_indent;
|
||||
|
||||
ypos += ysizeup;
|
||||
while (line != cell) {
|
||||
line -> SetPos(line -> GetPosX() + xdelta, ypos + line -> GetPosY());
|
||||
line = line -> GetNext();
|
||||
}
|
||||
|
||||
ypos += ysizedown;
|
||||
xpos = 0;
|
||||
ysizeup = ysizedown = 0;
|
||||
line = cell;
|
||||
}
|
||||
}
|
||||
|
||||
// setup height & width, depending on container layout:
|
||||
m_Height = ypos + (ysizedown + ysizeup) + m_IndentBottom;
|
||||
|
||||
if (m_Height < m_MinHeight) {
|
||||
if (m_MinHeightAlign != HTML_ALIGN_TOP) {
|
||||
int diff = m_MinHeight - m_Height;
|
||||
if (m_MinHeightAlign == HTML_ALIGN_CENTER) diff /= 2;
|
||||
cell = m_Cells;
|
||||
while (cell) {
|
||||
cell -> SetPos(cell -> GetPosX(), cell -> GetPosY() + diff);
|
||||
cell = cell -> GetNext();
|
||||
}
|
||||
}
|
||||
m_Height = m_MinHeight;
|
||||
}
|
||||
|
||||
m_MaxLineWidth += s_indent + ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
|
||||
if (m_Width < m_MaxLineWidth) m_Width = m_MaxLineWidth;
|
||||
|
||||
wxHtmlCell::Layout(w);
|
||||
}
|
||||
|
||||
|
||||
#define mMin(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#define mMax(a, b) (((a) < (b)) ? (b) : (a))
|
||||
|
||||
void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
// container visible, draw it:
|
||||
if ((y + m_PosY < view_y2) && (y + m_PosY + m_Height > view_y1)) {
|
||||
|
||||
if (m_UseBkColour) {
|
||||
wxBrush myb = wxBrush(m_BkColour, wxSOLID);
|
||||
|
||||
int real_y1 = mMax(y + m_PosY, view_y1);
|
||||
int real_y2 = mMin(y + m_PosY + m_Height - 1, view_y2);
|
||||
|
||||
dc.SetBrush(myb);
|
||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||
dc.DrawRectangle(x + m_PosX, real_y1, m_Width, real_y2 - real_y1 + 1);
|
||||
}
|
||||
|
||||
if (m_UseBorder) {
|
||||
wxPen mypen1(m_BorderColour1, 1, wxSOLID);
|
||||
wxPen mypen2(m_BorderColour2, 1, wxSOLID);
|
||||
|
||||
dc.SetPen(mypen1);
|
||||
dc.DrawLine(x + m_PosX, y + m_PosY, x + m_PosX, y + m_PosY + m_Height - 1);
|
||||
dc.DrawLine(x + m_PosX, y + m_PosY, x + m_PosX + m_Width - 1, y + m_PosY);
|
||||
dc.SetPen(mypen2);
|
||||
dc.DrawLine(x + m_PosX + m_Width - 1, y + m_PosY, x + m_PosX + m_Width - 1, y + m_PosY + m_Height - 1);
|
||||
dc.DrawLine(x + m_PosX, y + m_PosY + m_Height - 1, x + m_PosX + m_Width - 1, y + m_PosY + m_Height - 1);
|
||||
}
|
||||
|
||||
if (m_Cells) m_Cells -> Draw(dc, x + m_PosX, y + m_PosY, view_y1, view_y2);
|
||||
}
|
||||
// container invisible, just proceed font+color changing:
|
||||
else {
|
||||
if (m_Cells) m_Cells -> DrawInvisible(dc, x + m_PosX, y + m_PosY);
|
||||
}
|
||||
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::DrawInvisible(wxDC& dc, int x, int y)
|
||||
{
|
||||
if (m_Cells) m_Cells -> DrawInvisible(dc, x + m_PosX, y + m_PosY);
|
||||
wxHtmlCell::DrawInvisible(dc, x, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlContainerCell::GetLink(int x, int y) const
|
||||
{
|
||||
wxHtmlCell *c = m_Cells;
|
||||
int cx, cy, cw, ch;
|
||||
|
||||
while (c) {
|
||||
cx = c -> GetPosX(), cy = c -> GetPosY();
|
||||
cw = c -> GetWidth(), ch = c -> GetHeight();
|
||||
if ((x >= cx) && (x < cx + cw) && (y >= cy) && (y < cy + ch))
|
||||
return c -> GetLink(x - cx, y - cy);
|
||||
c = c -> GetNext();
|
||||
}
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::InsertCell(wxHtmlCell *f)
|
||||
{
|
||||
if (!m_Cells) m_Cells = m_LastCell = f;
|
||||
else {
|
||||
m_LastCell -> SetNext(f);
|
||||
m_LastCell = f;
|
||||
if (m_LastCell) while (m_LastCell -> GetNext()) m_LastCell = m_LastCell -> GetNext();
|
||||
}
|
||||
f -> SetParent(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::SetAlign(const wxHtmlTag& tag)
|
||||
{
|
||||
if (tag.HasParam("ALIGN")) {
|
||||
wxString alg = tag.GetParam("ALIGN");
|
||||
alg.MakeUpper();
|
||||
if (alg == "CENTER")
|
||||
SetAlignHor(HTML_ALIGN_CENTER);
|
||||
else if (alg == "LEFT")
|
||||
SetAlignHor(HTML_ALIGN_LEFT);
|
||||
else if (alg == "RIGHT")
|
||||
SetAlignHor(HTML_ALIGN_RIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::SetWidthFloat(const wxHtmlTag& tag)
|
||||
{
|
||||
if (tag.HasParam("WIDTH")) {
|
||||
int wdi;
|
||||
wxString wd = tag.GetParam("WIDTH");
|
||||
|
||||
if (wd[wd.Length()-1] == '%') {
|
||||
sscanf(wd.c_str(), "%i%%", &wdi);
|
||||
SetWidthFloat(wdi, HTML_UNITS_PERCENT);
|
||||
}
|
||||
else {
|
||||
sscanf(wd.c_str(), "%i", &wdi);
|
||||
SetWidthFloat(wdi, HTML_UNITS_PIXELS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
const wxHtmlCell* wxHtmlContainerCell::Find(int condition, const void* param) const
|
||||
{
|
||||
const wxHtmlCell *r = NULL;
|
||||
|
||||
if (m_Cells) {
|
||||
r = m_Cells -> Find(condition, param);
|
||||
if (r) return r;
|
||||
}
|
||||
|
||||
return wxHtmlCell::Find(condition, param);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlContainerCell::OnMouseClick(wxWindow *parent, int x, int y, bool left, bool middle, bool right)
|
||||
{
|
||||
if (m_Cells) {
|
||||
wxHtmlCell *c = m_Cells;
|
||||
while (c) {
|
||||
if ( (c -> GetPosX() <= x) &&
|
||||
(c -> GetPosY() <= y) &&
|
||||
(c -> GetPosX() + c -> GetWidth() > x) &&
|
||||
(c -> GetPosY() + c -> GetHeight() > y)) {
|
||||
c -> OnMouseClick(parent, x - c -> GetPosX(), y - c -> GetPosY(), left, middle, right);
|
||||
break;
|
||||
}
|
||||
c = c -> GetNext();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlColourCell
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
void wxHtmlColourCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
if (m_Flags & HTML_CLR_FOREGROUND)
|
||||
dc.SetTextForeground(m_Colour);
|
||||
if (m_Flags & HTML_CLR_BACKGROUND) {
|
||||
dc.SetBackground(wxBrush(m_Colour, wxSOLID));
|
||||
dc.SetTextBackground(m_Colour);
|
||||
}
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
void wxHtmlColourCell::DrawInvisible(wxDC& dc, int x, int y)
|
||||
{
|
||||
if (m_Flags & HTML_CLR_FOREGROUND)
|
||||
dc.SetTextForeground(m_Colour);
|
||||
if (m_Flags & HTML_CLR_BACKGROUND) {
|
||||
dc.SetBackground(wxBrush(m_Colour, wxSOLID));
|
||||
dc.SetTextBackground(m_Colour);
|
||||
}
|
||||
wxHtmlCell::DrawInvisible(dc, x, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFontCell
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
void wxHtmlFontCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
dc.SetFont(*m_Font);
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
void wxHtmlFontCell::DrawInvisible(wxDC& dc, int x, int y)
|
||||
{
|
||||
dc.SetFont(*m_Font);
|
||||
wxHtmlCell::DrawInvisible(dc, x, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlWidgetCell
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
wxHtmlWidgetCell::wxHtmlWidgetCell(wxWindow *wnd, int w)
|
||||
{
|
||||
int sx, sy;
|
||||
m_Wnd = wnd;
|
||||
m_Wnd -> GetSize(&sx, &sy);
|
||||
m_Width = sx, m_Height = sy;
|
||||
m_WidthFloat = w;
|
||||
}
|
||||
|
||||
|
||||
void wxHtmlWidgetCell::Draw(wxDC& dc, int x, int y, int view_y1, int 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())) -> ViewStart(&stx, &sty);
|
||||
|
||||
m_Wnd -> SetSize(absx - HTML_SCROLL_STEP * stx, absy - HTML_SCROLL_STEP * sty, m_Width, m_Height);
|
||||
// m_Wnd -> Refresh();
|
||||
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWidgetCell::DrawInvisible(wxDC& dc, int x, int 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())) -> ViewStart(&stx, &sty);
|
||||
|
||||
m_Wnd -> SetSize(absx - HTML_SCROLL_STEP * stx, absy - HTML_SCROLL_STEP * sty, m_Width, m_Height);
|
||||
wxHtmlCell::DrawInvisible(dc, x, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWidgetCell::Layout(int w)
|
||||
{
|
||||
if (m_WidthFloat != 0) {
|
||||
m_Width = (w * m_WidthFloat) / 100;
|
||||
m_Wnd -> SetSize(m_Width, m_Height);
|
||||
}
|
||||
|
||||
wxHtmlCell::Layout(w);
|
||||
}
|
||||
|
||||
#endif
|
170
src/html/htmlfilter.cpp
Normal file
@@ -0,0 +1,170 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: filter.cpp
|
||||
// Purpose: wxHtmlFilter - input filter for translating into HTML format
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/html/htmlfilter.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
|
||||
/*
|
||||
|
||||
There is code for several default filters:
|
||||
|
||||
*/
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxHtmlFilter, wxObject)
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterPlainText
|
||||
// filter for text/plain or uknown
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterPlainText, wxHtmlFilter)
|
||||
|
||||
bool wxHtmlFilterPlainText::CanRead(const wxFSFile& file)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterPlainText::ReadFile(const wxFSFile& file)
|
||||
{
|
||||
wxInputStream *s = file.GetStream();
|
||||
char *src;
|
||||
wxString doc, doc2;
|
||||
|
||||
if (s == NULL) return wxEmptyString;
|
||||
src = (char*) malloc(s -> StreamSize());
|
||||
src[s -> StreamSize()] = 0;
|
||||
s -> Read(src, s -> StreamSize());
|
||||
doc = src;
|
||||
free(src);
|
||||
|
||||
doc.Replace("<", "<", TRUE);
|
||||
doc.Replace(">", ">", TRUE);
|
||||
doc2 = "<HTML><BODY><PRE>\n" + doc + "\n</PRE></BODY></HTML>";
|
||||
return doc2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterImage
|
||||
// filter for image/*
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlFilterImage : public wxHtmlFilter
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterImage)
|
||||
|
||||
public:
|
||||
virtual bool CanRead(const wxFSFile& file);
|
||||
virtual wxString ReadFile(const wxFSFile& file);
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterImage, wxHtmlFilter)
|
||||
|
||||
|
||||
|
||||
bool wxHtmlFilterImage::CanRead(const wxFSFile& file)
|
||||
{
|
||||
return (file.GetMimeType().Left(6) == "image/");
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterImage::ReadFile(const wxFSFile& file)
|
||||
{
|
||||
return ("<HTML><BODY><IMG SRC=\"" + file.GetLocation() + "\"></BODY></HTML>");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterPlainText
|
||||
// filter for text/plain or uknown
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlFilterHTML : public wxHtmlFilter
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterHTML)
|
||||
|
||||
public:
|
||||
virtual bool CanRead(const wxFSFile& file);
|
||||
virtual wxString ReadFile(const wxFSFile& file);
|
||||
};
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterHTML, wxHtmlFilter)
|
||||
|
||||
bool wxHtmlFilterHTML::CanRead(const wxFSFile& file)
|
||||
{
|
||||
return (file.GetMimeType() == "text/html");
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterHTML::ReadFile(const wxFSFile& file)
|
||||
{
|
||||
wxInputStream *s = file.GetStream();
|
||||
char *src;
|
||||
wxString doc;
|
||||
|
||||
if (s == NULL) return wxEmptyString;
|
||||
src = (char*) malloc(s -> StreamSize() + 1);
|
||||
src[s -> StreamSize()] = 0;
|
||||
s -> Read(src, s -> StreamSize());
|
||||
doc = src;
|
||||
free(src);
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///// Module:
|
||||
|
||||
class wxHtmlFilterModule : public wxModule
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterModule)
|
||||
|
||||
public:
|
||||
virtual bool OnInit()
|
||||
{
|
||||
wxHtmlWindow::AddFilter(new wxHtmlFilterHTML);
|
||||
wxHtmlWindow::AddFilter(new wxHtmlFilterImage);
|
||||
return TRUE;
|
||||
}
|
||||
virtual void OnExit() {}
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterModule, wxModule)
|
||||
|
||||
#endif
|
864
src/html/htmlhelp.cpp
Normal file
@@ -0,0 +1,864 @@
|
||||
// Name: htmlhelp.cpp
|
||||
// Purpose: Help controller
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/imaglist.h>
|
||||
#include <wx/treectrl.h>
|
||||
#include <wx/tokenzr.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <wx/html/htmlhelp.h>
|
||||
#include <wx/busyinfo.h>
|
||||
|
||||
#if !((wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7)))
|
||||
#include <wx/progdlg.h>
|
||||
#endif
|
||||
|
||||
|
||||
// Bitmaps:
|
||||
|
||||
#ifndef __WXMSW__
|
||||
#include "bitmaps/panel.xpm"
|
||||
#include "bitmaps/back.xpm"
|
||||
#include "bitmaps/forward.xpm"
|
||||
#include "bitmaps/book.xpm"
|
||||
#include "bitmaps/folder.xpm"
|
||||
#include "bitmaps/page.xpm"
|
||||
#endif
|
||||
|
||||
#include "search.h"
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helper constants
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Command IDs :
|
||||
|
||||
enum {
|
||||
wxID_HTML_PANEL = wxID_HIGHEST + 1,
|
||||
wxID_HTML_BACK,
|
||||
wxID_HTML_FORWARD,
|
||||
wxID_HTML_TREECTRL,
|
||||
wxID_HTML_INDEXPAGE,
|
||||
wxID_HTML_INDEXLIST,
|
||||
wxID_HTML_NOTEBOOK,
|
||||
wxID_HTML_SEARCHPAGE,
|
||||
wxID_HTML_SEARCHTEXT,
|
||||
wxID_HTML_SEARCHLIST,
|
||||
wxID_HTML_SEARCHBUTTON
|
||||
};
|
||||
|
||||
|
||||
// Images:
|
||||
|
||||
enum {
|
||||
IMG_Book = 0,
|
||||
IMG_Folder,
|
||||
IMG_Page
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class HtmlHelpTreeItemData : public wxTreeItemData
|
||||
{
|
||||
private:
|
||||
wxString m_Page;
|
||||
|
||||
public:
|
||||
HtmlHelpTreeItemData(HtmlContentsItem *it) : wxTreeItemData() {m_Page = it -> m_Book -> GetBasePath() + it -> m_Page;}
|
||||
const wxString& GetPage() {return m_Page;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include <wx/arrimpl.cpp>
|
||||
WX_DEFINE_OBJARRAY(HtmlBookRecArray)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlHelpController
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpController, wxEvtHandler)
|
||||
|
||||
|
||||
wxHtmlHelpController::wxHtmlHelpController() : wxEvtHandler()
|
||||
{
|
||||
m_Frame = NULL;
|
||||
m_Config = NULL;
|
||||
m_ConfigRoot = wxEmptyString;
|
||||
m_TitleFormat = _("Help : %s");
|
||||
m_TempPath = wxEmptyString;
|
||||
|
||||
m_Cfg.x = m_Cfg.y = 0;
|
||||
m_Cfg.w = 700; m_Cfg.h = 480;
|
||||
m_Cfg.sashpos = 240;
|
||||
m_Cfg.navig_on = TRUE;
|
||||
|
||||
m_ContentsImageList = new wxImageList(12, 12);
|
||||
m_ContentsImageList -> Add(wxICON(book));
|
||||
m_ContentsImageList -> Add(wxICON(folder));
|
||||
m_ContentsImageList -> Add(wxICON(page));
|
||||
|
||||
m_Contents = NULL;
|
||||
m_ContentsCnt = 0;
|
||||
m_Index = NULL;
|
||||
m_IndexCnt = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlHelpController::~wxHtmlHelpController()
|
||||
{
|
||||
int i;
|
||||
|
||||
m_BookRecords.Empty();
|
||||
delete m_ContentsImageList;
|
||||
if (m_Contents) {
|
||||
for (i = 0; i < m_ContentsCnt; i++) {
|
||||
free(m_Contents[i].m_Page);
|
||||
free(m_Contents[i].m_Name);
|
||||
}
|
||||
free(m_Contents);
|
||||
}
|
||||
if (m_Index) {
|
||||
for (i = 0; i < m_IndexCnt; i++) {
|
||||
free(m_Index[i].m_Page);
|
||||
free(m_Index[i].m_Name);
|
||||
}
|
||||
free(m_Index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::SetTempDir(const wxString& path)
|
||||
{
|
||||
if (path == wxEmptyString) m_TempPath = path;
|
||||
else {
|
||||
if (wxIsAbsolutePath(path)) m_TempPath = path;
|
||||
else m_TempPath = wxGetCwd() + "/" + path;
|
||||
|
||||
if (m_TempPath[m_TempPath.Length() - 1] != '/')
|
||||
m_TempPath << "/";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Reads one line, stores it into buf and returns pointer to new line or NULL.
|
||||
static char* ReadLine(char *line, char *buf)
|
||||
{
|
||||
char *writeptr = buf, *readptr = line;
|
||||
|
||||
while (*readptr != 0 && *readptr != '\r' && *readptr != '\n') *(writeptr++) = *(readptr++);
|
||||
*writeptr = 0;
|
||||
while (*readptr == '\r' || *readptr == '\n') readptr++;
|
||||
if (*readptr == 0) return NULL;
|
||||
else return readptr;
|
||||
}
|
||||
|
||||
|
||||
static wxString SafeFileName(const wxString& s)
|
||||
{
|
||||
wxString res = s;
|
||||
res.Replace(":", "_", TRUE);
|
||||
res.Replace(" ", "_", TRUE);
|
||||
res.Replace("/", "_", TRUE);
|
||||
res.Replace("\\", "_", TRUE);
|
||||
res.Replace("#", "_", TRUE);
|
||||
res.Replace(".", "_", TRUE);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static int IndexCompareFunc(const void *a, const void *b)
|
||||
{
|
||||
return strcmp(((HtmlContentsItem*)a) -> m_Name, ((HtmlContentsItem*)b) -> m_Name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlHelpController::AddBook(const wxString& book, bool show_wait_msg = FALSE)
|
||||
{
|
||||
wxFSFile *fi;
|
||||
wxFileSystem fsys;
|
||||
wxInputStream *s;
|
||||
HtmlBookRecord *bookr;
|
||||
wxString bookFull;
|
||||
|
||||
int sz;
|
||||
char *buff, *lineptr;
|
||||
char linebuf[300];
|
||||
|
||||
wxString title = _("noname"),
|
||||
safetitle,
|
||||
start = wxEmptyString,
|
||||
contents = wxEmptyString, index = wxEmptyString;
|
||||
|
||||
if (wxIsAbsolutePath(book)) bookFull = book;
|
||||
else bookFull = wxGetCwd() + "/" + book;
|
||||
|
||||
fi = fsys.OpenFile(bookFull);
|
||||
if (fi == NULL) return FALSE;
|
||||
fsys.ChangePathTo(bookFull);
|
||||
s = fi -> GetStream();
|
||||
sz = s -> StreamSize();
|
||||
buff = (char*) malloc(sz+1);
|
||||
buff[sz] = 0;
|
||||
s -> Read(buff, sz);
|
||||
lineptr = buff;
|
||||
delete fi;
|
||||
|
||||
while ((lineptr = ReadLine(lineptr, linebuf)) != NULL) {
|
||||
if (strstr(linebuf, "Title=") == linebuf)
|
||||
title = linebuf + strlen("Title=");
|
||||
if (strstr(linebuf, "Default topic=") == linebuf)
|
||||
start = linebuf + strlen("Default topic=");
|
||||
if (strstr(linebuf, "Index file=") == linebuf)
|
||||
index = linebuf + strlen("Index file=");
|
||||
if (strstr(linebuf, "Contents file=") == linebuf)
|
||||
contents = linebuf + strlen("Contents file=");
|
||||
}
|
||||
free(buff);
|
||||
|
||||
bookr = new HtmlBookRecord(fsys.GetPath(), title, start);
|
||||
|
||||
if (m_ContentsCnt % HTML_REALLOC_STEP == 0)
|
||||
m_Contents = (HtmlContentsItem*) realloc(m_Contents, (m_ContentsCnt + HTML_REALLOC_STEP) * sizeof(HtmlContentsItem));
|
||||
m_Contents[m_ContentsCnt].m_Level = 0;
|
||||
m_Contents[m_ContentsCnt].m_ID = 0;
|
||||
m_Contents[m_ContentsCnt].m_Page = (char*) malloc(start.Length() + 1);
|
||||
strcpy(m_Contents[m_ContentsCnt].m_Page, start.c_str());
|
||||
m_Contents[m_ContentsCnt].m_Name = (char*) malloc(title.Length() + 1);
|
||||
strcpy(m_Contents[m_ContentsCnt].m_Name, title.c_str());
|
||||
m_Contents[m_ContentsCnt].m_Book = bookr;
|
||||
m_ContentsCnt++;
|
||||
|
||||
// Try to find cached binary versions:
|
||||
safetitle = SafeFileName(title);
|
||||
fi = fsys.OpenFile(safetitle + ".cached");
|
||||
if (fi == NULL) fi = fsys.OpenFile(m_TempPath + safetitle + ".cached");
|
||||
if ((fi == NULL) || (m_TempPath == wxEmptyString)) {
|
||||
LoadMSProject(bookr, fsys, index, contents, show_wait_msg);
|
||||
if (m_TempPath != wxEmptyString) {
|
||||
wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath + safetitle + ".cached");
|
||||
SaveCachedBook(bookr, outs);
|
||||
delete outs;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LoadCachedBook(bookr, fi -> GetStream());
|
||||
delete fi;
|
||||
}
|
||||
|
||||
m_BookRecords.Add(bookr);
|
||||
if (m_IndexCnt > 0)
|
||||
qsort(m_Index, m_IndexCnt, sizeof(HtmlContentsItem), IndexCompareFunc);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::Display(const wxString& x)
|
||||
{
|
||||
int cnt;
|
||||
int i;
|
||||
wxFileSystem fsys;
|
||||
wxFSFile *f;
|
||||
|
||||
CreateHelpWindow();
|
||||
|
||||
/* 1. try to open given file: */
|
||||
|
||||
cnt = m_BookRecords.GetCount();
|
||||
for (i = 0; i < cnt; i++) {
|
||||
f = fsys.OpenFile(m_BookRecords[i].GetBasePath() + x);
|
||||
if (f) {
|
||||
m_HtmlWin -> LoadPage(m_BookRecords[i].GetBasePath() + x);
|
||||
delete f;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 2. try to find a book: */
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (m_BookRecords[i].GetTitle() == x) {
|
||||
m_HtmlWin -> LoadPage(m_BookRecords[i].GetBasePath() + m_BookRecords[i].GetStart());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* 3. try to find in contents: */
|
||||
|
||||
cnt = m_ContentsCnt;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (strcmp(m_Contents[i].m_Name, x) == 0) {
|
||||
m_HtmlWin -> LoadPage(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 4. try to find in index: */
|
||||
|
||||
cnt = m_IndexCnt;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (strcmp(m_Index[i].m_Name, x) == 0) {
|
||||
m_HtmlWin -> LoadPage(m_Index[i].m_Book -> GetBasePath() + m_Index[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 5. if everything failed, search the documents: */
|
||||
|
||||
KeywordSearch(x);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::Display(const int id)
|
||||
{
|
||||
CreateHelpWindow();
|
||||
|
||||
for (int i = 0; i < m_ContentsCnt; i++) {
|
||||
if (m_Contents[i].m_ID == id) {
|
||||
m_HtmlWin -> LoadPage(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::DisplayContents()
|
||||
{
|
||||
CreateHelpWindow();
|
||||
m_Frame -> Raise();
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::DisplayIndex()
|
||||
{
|
||||
CreateHelpWindow();
|
||||
m_Frame -> Raise();
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
|
||||
class MyProgressDlg : public wxDialog
|
||||
{
|
||||
public:
|
||||
bool m_Canceled;
|
||||
|
||||
MyProgressDlg(wxWindow *parent) : wxDialog(parent, -1,
|
||||
_("Searching..."),
|
||||
wxPoint(0, 0),
|
||||
#ifdef __WXGTK__
|
||||
wxSize(300, 110))
|
||||
#else
|
||||
wxSize(300, 130))
|
||||
#endif
|
||||
{m_Canceled = FALSE;}
|
||||
void OnCancel(wxCommandEvent& event) {m_Canceled = TRUE;}
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
BEGIN_EVENT_TABLE(MyProgressDlg, wxDialog)
|
||||
EVT_BUTTON(wxID_CANCEL, MyProgressDlg::OnCancel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
bool wxHtmlHelpController::KeywordSearch(const wxString& keyword)
|
||||
{
|
||||
int foundcnt = 0;
|
||||
|
||||
CreateHelpWindow();
|
||||
m_Frame -> Raise();
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(2);
|
||||
m_SearchList -> Clear();
|
||||
m_SearchText -> SetValue(keyword);
|
||||
m_SearchButton -> Enable(FALSE);
|
||||
|
||||
{
|
||||
int cnt = m_ContentsCnt;
|
||||
wxSearchEngine engine;
|
||||
wxFileSystem fsys;
|
||||
wxFSFile *file;
|
||||
wxString lastpage = wxEmptyString;
|
||||
wxString foundstr;
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
MyProgressDlg progress(m_Frame);
|
||||
|
||||
wxStaticText *prompt = new wxStaticText(&progress, -1, "", wxPoint(20, 50), wxSize(260, 25), wxALIGN_CENTER);
|
||||
wxGauge *gauge = new wxGauge(&progress, -1, cnt, wxPoint(20, 20), wxSize(260, 25));
|
||||
wxButton *btn = new wxButton(&progress, wxID_CANCEL, _("Cancel"), wxPoint(110, 70), wxSize(80, 25));
|
||||
btn = btn; /* fool compiler :-) */
|
||||
prompt -> SetLabel(_("No matching page found yet"));
|
||||
|
||||
progress.Centre(wxBOTH);
|
||||
progress.Show(TRUE);
|
||||
#else
|
||||
wxProgressDialog progress(_("Searching..."), _("No matching page found yet"), cnt, m_Frame, wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_AUTO_HIDE);
|
||||
#endif
|
||||
|
||||
engine.LookFor(keyword);
|
||||
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
gauge -> SetValue(i);
|
||||
if (progress.m_Canceled) break;
|
||||
#else
|
||||
if (progress.Update(i) == FALSE) break;
|
||||
#endif
|
||||
wxYield();
|
||||
|
||||
file = fsys.OpenFile(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
if (file) {
|
||||
if (lastpage != file -> GetLocation()) {
|
||||
lastpage = file -> GetLocation();
|
||||
if (engine.Scan(file -> GetStream())) {
|
||||
foundstr.Printf(_("Found %i matches"), ++foundcnt);
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
prompt -> SetLabel(foundstr);
|
||||
#else
|
||||
progress.Update(i, foundstr);
|
||||
#endif
|
||||
wxYield();
|
||||
m_SearchList -> Append(m_Contents[i].m_Name, (char*)(m_Contents + i));
|
||||
}
|
||||
}
|
||||
delete file;
|
||||
}
|
||||
}
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
progress.Close(TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
m_SearchButton -> Enable(TRUE);
|
||||
m_SearchText -> SetSelection(0, keyword.Length());
|
||||
m_SearchText -> SetFocus();
|
||||
if (foundcnt) {
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_SearchList -> GetClientData(0);
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
return (foundcnt > 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::CreateHelpWindow()
|
||||
{
|
||||
wxBusyCursor cur;
|
||||
wxString oldpath;
|
||||
wxStatusBar *sbar;
|
||||
|
||||
if (m_Frame) {
|
||||
m_Frame -> Raise();
|
||||
m_Frame -> Show(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
wxBusyInfo busyinfo(_("Preparing help window..."));
|
||||
|
||||
if (m_Config) ReadCustomization(m_Config, m_ConfigRoot);
|
||||
|
||||
m_Frame = new wxFrame(NULL, -1, "", wxPoint(m_Cfg.x, m_Cfg.y), wxSize(m_Cfg.w, m_Cfg.h));
|
||||
m_Frame -> PushEventHandler(this);
|
||||
sbar = m_Frame -> CreateStatusBar();
|
||||
|
||||
{
|
||||
wxToolBar *toolBar;
|
||||
toolBar = m_Frame -> CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE);
|
||||
toolBar -> SetMargins(2, 2);
|
||||
wxBitmap* toolBarBitmaps[3];
|
||||
|
||||
#ifdef __WXMSW__
|
||||
toolBarBitmaps[0] = new wxBitmap("panel");
|
||||
toolBarBitmaps[1] = new wxBitmap("back");
|
||||
toolBarBitmaps[2] = new wxBitmap("forward");
|
||||
int width = 24;
|
||||
#else
|
||||
toolBarBitmaps[0] = new wxBitmap(panel_xpm);
|
||||
toolBarBitmaps[1] = new wxBitmap(back_xpm);
|
||||
toolBarBitmaps[2] = new wxBitmap(forward_xpm);
|
||||
int width = 16;
|
||||
#endif
|
||||
|
||||
int currentX = 5;
|
||||
|
||||
toolBar -> AddTool(wxID_HTML_PANEL, *(toolBarBitmaps[0]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Show/hide navigation panel"));
|
||||
currentX += width + 5;
|
||||
toolBar -> AddSeparator();
|
||||
toolBar -> AddTool(wxID_HTML_BACK, *(toolBarBitmaps[1]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Go back to the previous HTML page"));
|
||||
currentX += width + 5;
|
||||
toolBar -> AddTool(wxID_HTML_FORWARD, *(toolBarBitmaps[2]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Go forward to the next HTML page"));
|
||||
currentX += width + 5;
|
||||
|
||||
toolBar -> Realize();
|
||||
|
||||
// Can delete the bitmaps since they're reference counted
|
||||
for (int i = 0; i < 3; i++) delete toolBarBitmaps[i];
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
m_Splitter = new wxSplitterWindow(m_Frame);
|
||||
|
||||
m_HtmlWin = new wxHtmlWindow(m_Splitter);
|
||||
m_HtmlWin -> SetRelatedFrame(m_Frame, m_TitleFormat);
|
||||
m_HtmlWin -> SetRelatedStatusBar(0);
|
||||
if (m_Config) m_HtmlWin -> ReadCustomization(m_Config, m_ConfigRoot);
|
||||
|
||||
m_NavigPan = new wxNotebook(m_Splitter, wxID_HTML_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
|
||||
{
|
||||
m_ContentsBox = new wxTreeCtrl(m_NavigPan, wxID_HTML_TREECTRL, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
|
||||
m_ContentsBox -> SetImageList(m_ContentsImageList);
|
||||
m_NavigPan -> AddPage(m_ContentsBox, _("Contents"));
|
||||
}
|
||||
|
||||
{
|
||||
wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_INDEXPAGE);
|
||||
wxLayoutConstraints *b1 = new wxLayoutConstraints;
|
||||
b1 -> top.SameAs (dummy, wxTop, 0);
|
||||
b1 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b1 -> width.PercentOf (dummy, wxWidth, 100);
|
||||
b1 -> bottom.SameAs (dummy, wxBottom, 0);
|
||||
m_IndexBox = new wxListBox(dummy, wxID_HTML_INDEXLIST, wxDefaultPosition, wxDefaultSize, 0);
|
||||
m_IndexBox -> SetConstraints(b1);
|
||||
dummy -> SetAutoLayout(TRUE);
|
||||
m_NavigPan -> AddPage(dummy, _("Index"));
|
||||
}
|
||||
|
||||
{
|
||||
wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_SEARCHPAGE);
|
||||
|
||||
wxLayoutConstraints *b1 = new wxLayoutConstraints;
|
||||
m_SearchText = new wxTextCtrl(dummy, wxID_HTML_SEARCHTEXT);
|
||||
b1 -> top.SameAs (dummy, wxTop, 0);
|
||||
b1 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b1 -> right.SameAs (dummy, wxRight, 0);
|
||||
b1 -> height.AsIs();
|
||||
m_SearchText -> SetConstraints(b1);
|
||||
|
||||
wxLayoutConstraints *b2 = new wxLayoutConstraints;
|
||||
m_SearchButton = new wxButton(dummy, wxID_HTML_SEARCHBUTTON, _("Search!"));
|
||||
b2 -> top.Below (m_SearchText, 10);
|
||||
b2 -> right.SameAs (dummy, wxRight, 10);
|
||||
b2 -> width.AsIs();
|
||||
b2 -> height.AsIs();
|
||||
m_SearchButton -> SetConstraints(b2);
|
||||
|
||||
wxLayoutConstraints *b3 = new wxLayoutConstraints;
|
||||
m_SearchList = new wxListBox(dummy, wxID_HTML_SEARCHLIST, wxDefaultPosition, wxDefaultSize, 0);
|
||||
b3 -> top.Below (m_SearchButton, 10);
|
||||
b3 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b3 -> right.SameAs (dummy, wxRight, 0);
|
||||
b3 -> bottom.SameAs (dummy, wxBottom, 0);
|
||||
m_SearchList -> SetConstraints(b3);
|
||||
|
||||
dummy -> SetAutoLayout(TRUE);
|
||||
dummy -> Layout();
|
||||
m_NavigPan -> AddPage(dummy, _("Search"));
|
||||
}
|
||||
|
||||
RefreshLists();
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SetMinimumPaneSize(20);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
if (!m_Cfg.navig_on) m_Splitter -> Unsplit(m_NavigPan);
|
||||
wxYield();
|
||||
}
|
||||
|
||||
m_Frame -> Show(TRUE);
|
||||
wxYield();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define MAX_ROOTS 64
|
||||
|
||||
void wxHtmlHelpController::CreateContents()
|
||||
{
|
||||
HtmlContentsItem *it;
|
||||
wxTreeItemId roots[MAX_ROOTS];
|
||||
bool imaged[MAX_ROOTS];
|
||||
int count = m_ContentsCnt;
|
||||
|
||||
m_ContentsBox -> DeleteAllItems();
|
||||
roots[0] = m_ContentsBox -> AddRoot(_("(Help)"));
|
||||
imaged[0] = TRUE;
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
it = m_Contents + i;
|
||||
roots[it -> m_Level + 1] = m_ContentsBox -> AppendItem(roots[it -> m_Level], it -> m_Name, IMG_Page, -1, new HtmlHelpTreeItemData(it));
|
||||
if (it -> m_Level == 0) {
|
||||
m_ContentsBox -> SetItemBold(roots[1], TRUE);
|
||||
m_ContentsBox -> SetItemImage(roots[1], IMG_Book);
|
||||
m_ContentsBox -> SetItemSelectedImage(roots[1], IMG_Book);
|
||||
imaged[1] = TRUE;
|
||||
}
|
||||
else imaged[it -> m_Level + 1] = FALSE;
|
||||
|
||||
if (!imaged[it -> m_Level]) {
|
||||
m_ContentsBox -> SetItemImage(roots[it -> m_Level], IMG_Folder);
|
||||
m_ContentsBox -> SetItemSelectedImage(roots[it -> m_Level], IMG_Folder);
|
||||
imaged[it -> m_Level] = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
m_ContentsBox -> Expand(roots[0]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::CreateIndex()
|
||||
{
|
||||
m_IndexBox -> Clear();
|
||||
|
||||
for (int i = 0; i < m_IndexCnt; i++)
|
||||
m_IndexBox -> Append(m_Index[i].m_Name, (char*)(m_Index + i));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::RefreshLists()
|
||||
{
|
||||
if (m_Frame) {
|
||||
CreateContents();
|
||||
CreateIndex();
|
||||
m_SearchList -> Clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::ReadCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
m_Cfg.navig_on = (bool) cfg -> Read("hcNavigPanel", m_Cfg.navig_on);
|
||||
m_Cfg.sashpos = cfg -> Read("hcSashPos", m_Cfg.sashpos);
|
||||
m_Cfg.x = cfg -> Read("hcX", m_Cfg.x);
|
||||
m_Cfg.y = cfg -> Read("hcY", m_Cfg.y);
|
||||
m_Cfg.w = cfg -> Read("hcW", m_Cfg.w);
|
||||
m_Cfg.h = cfg -> Read("hcH", m_Cfg.h);
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::WriteCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
cfg -> Write("hcNavigPanel", m_Cfg.navig_on);
|
||||
cfg -> Write("hcSashPos", (long)m_Cfg.sashpos);
|
||||
cfg -> Write("hcX", (long)m_Cfg.x);
|
||||
cfg -> Write("hcY", (long)m_Cfg.y);
|
||||
cfg -> Write("hcW", (long)m_Cfg.w);
|
||||
cfg -> Write("hcH", (long)m_Cfg.h);
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
EVENT HANDLING :
|
||||
*/
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnToolbar(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId()) {
|
||||
case wxID_HTML_BACK :
|
||||
m_HtmlWin -> HistoryBack();
|
||||
break;
|
||||
case wxID_HTML_FORWARD :
|
||||
m_HtmlWin -> HistoryForward();
|
||||
break;
|
||||
case wxID_HTML_PANEL :
|
||||
if (m_Splitter -> IsSplit()) {
|
||||
m_Cfg.sashpos = m_Splitter -> GetSashPosition();
|
||||
m_Splitter -> Unsplit(m_NavigPan);
|
||||
}
|
||||
else {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnContentsSel(wxTreeEvent& event)
|
||||
{
|
||||
HtmlHelpTreeItemData *pg;
|
||||
|
||||
pg = (HtmlHelpTreeItemData*) m_ContentsBox -> GetItemData(event.GetItem());
|
||||
if (pg) m_HtmlWin -> LoadPage(pg -> GetPage());
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnIndexSel(wxCommandEvent& event)
|
||||
{
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_IndexBox -> GetClientData(m_IndexBox -> GetSelection());
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnSearchSel(wxCommandEvent& event)
|
||||
{
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_SearchList -> GetClientData(m_SearchList -> GetSelection());
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
int a, b;
|
||||
|
||||
m_Cfg.navig_on = m_Splitter -> IsSplit();
|
||||
if (m_Cfg.navig_on)
|
||||
m_Cfg.sashpos = m_Splitter -> GetSashPosition();
|
||||
m_Frame -> GetPosition(&a, &b);
|
||||
m_Cfg.x = a, m_Cfg.y = b;
|
||||
m_Frame -> GetSize(&a, &b);
|
||||
m_Cfg.w = a, m_Cfg.h = b;
|
||||
|
||||
if (m_Config) {
|
||||
WriteCustomization(m_Config, m_ConfigRoot);
|
||||
m_HtmlWin -> WriteCustomization(m_Config, m_ConfigRoot);
|
||||
}
|
||||
m_Frame = NULL;
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnSearch(wxCommandEvent& event)
|
||||
{
|
||||
wxString sr = m_SearchText -> GetLineText(0);
|
||||
|
||||
if (sr != wxEmptyString) KeywordSearch(sr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(wxHtmlHelpController, wxEvtHandler)
|
||||
EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_FORWARD, wxHtmlHelpController::OnToolbar)
|
||||
EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpController::OnContentsSel)
|
||||
EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpController::OnIndexSel)
|
||||
EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpController::OnSearchSel)
|
||||
EVT_CLOSE(wxHtmlHelpController::OnCloseWindow)
|
||||
EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpController::OnSearch)
|
||||
EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpController::OnSearch)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
250
src/html/htmlhelp_io.cpp
Normal file
@@ -0,0 +1,250 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlhelp.cpp
|
||||
// Purpose: Help controller
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//#ifdef __GNUG__
|
||||
//#pragma implementation "htmlhelp.h"
|
||||
//#endif
|
||||
// --- already in htmlhelp.cpp
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <wx/wxhtml.h>
|
||||
#include <wx/busyinfo.h>
|
||||
|
||||
|
||||
|
||||
|
||||
class HP_Parser : public wxHtmlParser
|
||||
{
|
||||
public:
|
||||
void AddText(const char* text) {}
|
||||
wxObject* GetProduct() {return NULL;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
class HP_TagHandler : public wxHtmlTagHandler
|
||||
{
|
||||
private:
|
||||
wxString m_Name, m_Page;
|
||||
int m_Level;
|
||||
int m_ID;
|
||||
int m_Index;
|
||||
HtmlContentsItem *m_Items;
|
||||
int m_ItemsCnt;
|
||||
HtmlBookRecord *m_Book;
|
||||
|
||||
public:
|
||||
HP_TagHandler(HtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0;}
|
||||
wxString GetSupportedTags() {return "UL,OBJECT,PARAM";}
|
||||
bool HandleTag(const wxHtmlTag& tag);
|
||||
void WriteOut(HtmlContentsItem*& array, int& size);
|
||||
void ReadIn(HtmlContentsItem* array, int size);
|
||||
};
|
||||
|
||||
|
||||
bool HP_TagHandler::HandleTag(const wxHtmlTag& tag)
|
||||
{
|
||||
if (tag.GetName() == "UL") {
|
||||
m_Level++;
|
||||
ParseInner(tag);
|
||||
m_Level--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
else if (tag.GetName() == "OBJECT") {
|
||||
m_Name = m_Page = wxEmptyString;
|
||||
ParseInner(tag);
|
||||
if (m_Page != wxEmptyString) {
|
||||
if (m_ItemsCnt % HTML_REALLOC_STEP == 0)
|
||||
m_Items = (HtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + HTML_REALLOC_STEP) * sizeof(HtmlContentsItem));
|
||||
m_Items[m_ItemsCnt].m_Level = m_Level;
|
||||
m_Items[m_ItemsCnt].m_ID = m_ID;
|
||||
m_Items[m_ItemsCnt].m_Page = (char*) malloc(m_Page.Length() + 1);
|
||||
strcpy(m_Items[m_ItemsCnt].m_Page, m_Page.c_str());
|
||||
m_Items[m_ItemsCnt].m_Name = (char*) malloc(m_Name.Length() + 1);
|
||||
strcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str());
|
||||
m_Items[m_ItemsCnt].m_Book = m_Book;
|
||||
m_ItemsCnt++;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
else { // "PARAM"
|
||||
if (m_Name == wxEmptyString && tag.GetParam("NAME") == "Name") m_Name = tag.GetParam("VALUE");
|
||||
if (tag.GetParam("NAME") == "Local") m_Page = tag.GetParam("VALUE");
|
||||
if (tag.GetParam("NAME") == "ID") tag.ScanParam("VALUE", "%i", &m_ID);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void HP_TagHandler::WriteOut(HtmlContentsItem*& array, int& size)
|
||||
{
|
||||
array = m_Items;
|
||||
size = m_ItemsCnt;
|
||||
m_Items = NULL;
|
||||
m_ItemsCnt = 0;
|
||||
}
|
||||
|
||||
void HP_TagHandler::ReadIn(HtmlContentsItem* array, int size)
|
||||
{
|
||||
m_Items = array;
|
||||
m_ItemsCnt = size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::LoadMSProject(HtmlBookRecord *book, wxFileSystem& fsys, const wxString& indexfile, const wxString& contentsfile, bool show_wait_msg)
|
||||
{
|
||||
wxFSFile *f;
|
||||
char *buf;
|
||||
int sz;
|
||||
wxString string;
|
||||
wxBusyInfo *busyinfo = (show_wait_msg) ? new wxBusyInfo(_("Importing help file : \n") + book -> m_Title) : NULL;
|
||||
|
||||
HP_Parser parser;
|
||||
HP_TagHandler *handler = new HP_TagHandler(book);
|
||||
parser.AddTagHandler(handler);
|
||||
|
||||
f = fsys.OpenFile(contentsfile);
|
||||
if (f) {
|
||||
sz = f -> GetStream() -> StreamSize();
|
||||
buf = (char*) malloc(sz+1);
|
||||
buf[sz] = 0;
|
||||
f -> GetStream() -> Read(buf, sz);
|
||||
delete f;
|
||||
handler -> ReadIn(m_Contents, m_ContentsCnt);
|
||||
parser.Parse(buf);
|
||||
handler -> WriteOut(m_Contents, m_ContentsCnt);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
f = fsys.OpenFile(indexfile);
|
||||
if (f) {
|
||||
sz = f -> GetStream() -> StreamSize();
|
||||
buf = (char*) malloc(sz+1);
|
||||
buf[sz] = 0;
|
||||
f -> GetStream() -> Read(buf, sz);
|
||||
delete f;
|
||||
handler -> ReadIn(m_Index, m_IndexCnt);
|
||||
parser.Parse(buf);
|
||||
handler -> WriteOut(m_Index, m_IndexCnt);
|
||||
free(buf);
|
||||
}
|
||||
if (show_wait_msg) delete busyinfo;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::LoadCachedBook(HtmlBookRecord *book, wxInputStream *f)
|
||||
{
|
||||
int i, st;
|
||||
int x;
|
||||
|
||||
/* load contents : */
|
||||
|
||||
f -> Read(&x, sizeof(x));
|
||||
st = m_ContentsCnt;
|
||||
m_ContentsCnt += x;
|
||||
m_Contents = (HtmlContentsItem*) realloc(m_Contents, (m_ContentsCnt / HTML_REALLOC_STEP + 1) * HTML_REALLOC_STEP * sizeof(HtmlContentsItem));
|
||||
for (i = st; i < m_ContentsCnt; i++) {
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Contents[i].m_Level = x;
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Contents[i].m_ID = x;
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Contents[i].m_Name = (char*) malloc(x);
|
||||
f -> Read(m_Contents[i].m_Name, x);
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Contents[i].m_Page = (char*) malloc(x);
|
||||
f -> Read(m_Contents[i].m_Page, x);
|
||||
m_Contents[i].m_Book = book;
|
||||
}
|
||||
|
||||
/* load index : */
|
||||
|
||||
f -> Read(&x, sizeof(x));
|
||||
st = m_IndexCnt;
|
||||
m_IndexCnt += x;
|
||||
m_Index = (HtmlContentsItem*) realloc(m_Index, (m_IndexCnt / HTML_REALLOC_STEP + 1) * HTML_REALLOC_STEP * sizeof(HtmlContentsItem));
|
||||
for (i = st; i < m_IndexCnt; i++) {
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Index[i].m_Name = (char*) malloc(x);
|
||||
f -> Read(m_Index[i].m_Name, x);
|
||||
f -> Read(&x, sizeof(x));
|
||||
m_Index[i].m_Page = (char*) malloc(x);
|
||||
f -> Read(m_Index[i].m_Page, x);
|
||||
m_Index[i].m_Book = book;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::SaveCachedBook(HtmlBookRecord *book, wxOutputStream *f)
|
||||
{
|
||||
int i;
|
||||
int x;
|
||||
|
||||
/* save contents : */
|
||||
|
||||
x = 0;
|
||||
for (i = 0; i < m_ContentsCnt; i++) if (m_Contents[i].m_Book == book && m_Contents[i].m_Level > 0) x++;
|
||||
f -> Write(&x, sizeof(x));
|
||||
for (i = 0; i < m_ContentsCnt; i++) {
|
||||
if (m_Contents[i].m_Book != book || m_Contents[i].m_Level == 0) continue;
|
||||
x = m_Contents[i].m_Level;
|
||||
f -> Write(&x, sizeof(x));
|
||||
x = m_Contents[i].m_ID;
|
||||
f -> Write(&x, sizeof(x));
|
||||
x = strlen(m_Contents[i].m_Name) + 1;
|
||||
f -> Write(&x, sizeof(x));
|
||||
f -> Write(m_Contents[i].m_Name, x);
|
||||
x = strlen(m_Contents[i].m_Page) + 1;
|
||||
f -> Write(&x, sizeof(x));
|
||||
f -> Write(m_Contents[i].m_Page, x);
|
||||
}
|
||||
|
||||
/* save index : */
|
||||
|
||||
x = 0;
|
||||
for (i = 0; i < m_IndexCnt; i++) if (m_Index[i].m_Book == book && m_Index[i].m_Level > 0) x++;
|
||||
f -> Write(&x, sizeof(x));
|
||||
for (i = 0; i < m_IndexCnt; i++) {
|
||||
if (m_Index[i].m_Book != book || m_Index[i].m_Level == 0) continue;
|
||||
x = strlen(m_Index[i].m_Name) + 1;
|
||||
f -> Write(&x, sizeof(x));
|
||||
f -> Write(m_Index[i].m_Name, x);
|
||||
x = strlen(m_Index[i].m_Page) + 1;
|
||||
f -> Write(&x, sizeof(x));
|
||||
f -> Write(m_Index[i].m_Page, x);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
169
src/html/htmlparser.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlparser.cpp
|
||||
// Purpose: wxHtmlParser class (generic parser)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/tokenzr.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/url.h>
|
||||
#include <wx/html/htmldefs.h>
|
||||
#include <wx/html/htmlparser.h>
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlParser
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxHtmlParser,wxObject)
|
||||
|
||||
|
||||
wxObject* wxHtmlParser::Parse(const wxString& source)
|
||||
{
|
||||
wxObject *result;
|
||||
|
||||
InitParser(source);
|
||||
DoParsing();
|
||||
result = GetProduct();
|
||||
DoneParser();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlParser::InitParser(const wxString& source)
|
||||
{
|
||||
m_Source = source;
|
||||
m_Cache = new wxHtmlTagsCache(m_Source);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlParser::DoneParser()
|
||||
{
|
||||
delete m_Cache;
|
||||
m_Cache = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define HTML_MAX_BUFLEN 1024
|
||||
|
||||
void wxHtmlParser::DoParsing(int begin_pos, int end_pos)
|
||||
{
|
||||
char temp[HTML_BUFLEN], c;
|
||||
int i;
|
||||
int templen;
|
||||
|
||||
templen = 0;
|
||||
i = begin_pos;
|
||||
|
||||
while (i < end_pos) {
|
||||
c = m_Source[i];
|
||||
|
||||
// continue building word:
|
||||
if (c != '<') {
|
||||
temp[templen++] = c;
|
||||
if (templen == HTML_BUFLEN-1) {
|
||||
temp[templen] = 0;
|
||||
AddText(temp);
|
||||
templen = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
else if (c == '<') {
|
||||
wxHtmlTag tag(m_Source, i, end_pos, m_Cache);
|
||||
|
||||
if (templen) {
|
||||
temp[templen] = 0;
|
||||
AddText(temp);
|
||||
templen = 0;
|
||||
}
|
||||
AddTag(tag);
|
||||
if (tag.HasEnding()) i = tag.GetEndPos2();
|
||||
else i = tag.GetBeginPos();
|
||||
}
|
||||
}
|
||||
|
||||
if (templen) { // last word of block :-(
|
||||
temp[templen] = 0;
|
||||
AddText(temp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlParser::AddTag(const wxHtmlTag& tag)
|
||||
{
|
||||
wxHtmlTagHandler *h;
|
||||
bool inner = FALSE;
|
||||
|
||||
h = (wxHtmlTagHandler*) m_HandlersHash.Get(tag.GetName());
|
||||
if (h)
|
||||
inner = h -> HandleTag(tag);
|
||||
if (!inner) {
|
||||
if (tag.HasEnding())
|
||||
DoParsing(tag.GetBeginPos(), tag.GetEndPos1());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlParser::AddTagHandler(wxHtmlTagHandler *handler)
|
||||
{
|
||||
wxString s(handler -> GetSupportedTags());
|
||||
wxStringTokenizer tokenizer(s, ", ");
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100)
|
||||
while (tokenizer.HasMoreToken())
|
||||
#else
|
||||
while (tokenizer.HasMoreTokens())
|
||||
#endif
|
||||
m_HandlersHash.Put(tokenizer.NextToken(), handler);
|
||||
|
||||
if (m_HandlersList.IndexOf(handler) == wxNOT_FOUND)
|
||||
m_HandlersList.Append(handler);
|
||||
|
||||
handler -> SetParser(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlParser::~wxHtmlParser()
|
||||
{
|
||||
m_HandlersHash.Clear();
|
||||
m_HandlersList.DeleteContents(TRUE);
|
||||
m_HandlersList.Clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlTagHandler
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxHtmlTagHandler,wxObject)
|
||||
|
||||
#endif
|
248
src/html/htmltag.cpp
Normal file
@@ -0,0 +1,248 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmltag.cpp
|
||||
// Purpose: wxHtmlTag class (represents single tag)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/html/htmltag.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlTagsCache
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject)
|
||||
|
||||
#define CACHE_INCREMENT 64
|
||||
|
||||
wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
||||
{
|
||||
const char *src = source.c_str();
|
||||
int i, tg, pos, stpos;
|
||||
int lng = source.Length();
|
||||
char dummy[256];
|
||||
|
||||
m_Cache = NULL;
|
||||
m_CacheSize = 0;
|
||||
m_CachePos = 0;
|
||||
|
||||
pos = 0;
|
||||
while (pos < lng) {
|
||||
if (src[pos] == '<') { // tag found:
|
||||
if (m_CacheSize % CACHE_INCREMENT == 0)
|
||||
m_Cache = (sCacheItem*) realloc(m_Cache, (m_CacheSize + CACHE_INCREMENT) * sizeof(sCacheItem));
|
||||
tg = m_CacheSize++;
|
||||
m_Cache[tg].Key = stpos = pos++;
|
||||
dummy[0] = 0; i = 0;
|
||||
while ((src[pos] != '>') && (src[pos] != ' ')) {
|
||||
dummy[i] = src[pos++];
|
||||
if ((dummy[i] >= 'a') && (dummy[i] <= 'z')) dummy[i] -= ('a' - 'A');
|
||||
i++;
|
||||
}
|
||||
dummy[i] = 0;
|
||||
m_Cache[tg].Name = (char*) malloc(i+1);
|
||||
memcpy(m_Cache[tg].Name, dummy, i+1);
|
||||
|
||||
while (src[pos] != '>') pos++;
|
||||
|
||||
if (src[stpos+1] == '/') { // ending tag:
|
||||
m_Cache[tg].End1 = m_Cache[tg].End2 = -2;
|
||||
// find matching begin tag:
|
||||
for (i = tg; i >= 0; i--)
|
||||
if ((m_Cache[i].End1 == -1) && (strcmp(m_Cache[i].Name, dummy+1) == 0)) {
|
||||
m_Cache[i].End1 = stpos;
|
||||
m_Cache[i].End2 = pos + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_Cache[tg].End1 = m_Cache[tg].End2 = -1;
|
||||
}
|
||||
}
|
||||
|
||||
pos++;
|
||||
}
|
||||
|
||||
// ok, we're done, now we'll free .Name members of cache - we don't need it anymore:
|
||||
for (i = 0; i < m_CacheSize; i++) {
|
||||
free(m_Cache[i].Name);
|
||||
m_Cache[i].Name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2)
|
||||
{
|
||||
if (m_Cache == NULL) return;
|
||||
if (m_Cache[m_CachePos].Key != at) {
|
||||
int delta = (at < m_Cache[m_CachePos].Key) ? -1 : 1;
|
||||
do {m_CachePos += delta;} while (m_Cache[m_CachePos].Key != at);
|
||||
}
|
||||
*end1 = m_Cache[m_CachePos].End1;
|
||||
*end2 = m_Cache[m_CachePos].End2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlTag
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_CLASS(wxHtmlTag,wxObject)
|
||||
|
||||
wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCache* cache) : wxObject()
|
||||
{
|
||||
int i;
|
||||
char c;
|
||||
|
||||
// fill-in name, params and begin pos:
|
||||
m_Name = m_Params = wxEmptyString;
|
||||
i = pos+1;
|
||||
if (source[i] == '/') {m_Ending = TRUE; i++;}
|
||||
else m_Ending = FALSE;
|
||||
|
||||
while ((i < end_pos) && ((c = source[i++]) != ' ') && (c != '>')) {
|
||||
if ((c >= 'a') && (c <= 'z')) c -= ('a' - 'A');
|
||||
m_Name += c;
|
||||
}
|
||||
|
||||
if (source[i-1] != '>')
|
||||
while ((i < end_pos) && ((c = source[i++]) != '>')) {
|
||||
if ((c >= 'a') && (c <= 'z')) c -= ('a' - 'A');
|
||||
m_Params += c;
|
||||
if (c == '"') {
|
||||
while ((i < end_pos) && ((c = source[i++]) != '"')) m_Params += c;
|
||||
m_Params += c;
|
||||
}
|
||||
}
|
||||
m_Begin = i;
|
||||
|
||||
cache -> QueryTag(pos, &m_End1, &m_End2);
|
||||
if (m_End1 > end_pos) m_End1 = end_pos;
|
||||
if (m_End2 > end_pos) m_End2 = end_pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlTag::HasParam(const wxString& par) const
|
||||
{
|
||||
const char *st = m_Params, *p = par;
|
||||
const char *st2, *p2;
|
||||
|
||||
if (*st == 0) return FALSE;
|
||||
if (*p == 0) return FALSE;
|
||||
for (st2 = st, p2 = p; ; st2++) {
|
||||
if (*p2 == 0) return TRUE;
|
||||
if (*st2 == 0) return FALSE;
|
||||
if (*p2 != *st2) p2 = p;
|
||||
if (*p2 == *st2) p2++;
|
||||
if (*st2 == ' ') p2 = p;
|
||||
else if (*st2 == '=') {
|
||||
p2 = p;
|
||||
while (*st2 != ' ') {
|
||||
if (*st2 == '"') {
|
||||
st2++;
|
||||
while (*st2 != '"') st2++;
|
||||
}
|
||||
st2++;
|
||||
if (*st2 == 0) return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const
|
||||
{
|
||||
const char *st = m_Params, *p = par;
|
||||
const char *st2, *p2;
|
||||
bool comma;
|
||||
|
||||
if (*st == 0) return "";
|
||||
if (*p == 0) return "";
|
||||
for (st2 = st, p2 = p; ; st2++) {
|
||||
if (*p2 == 0) { // found
|
||||
wxString fnd = "";
|
||||
st2++; // '=' character
|
||||
comma = FALSE;
|
||||
if (!with_commas && (*(st2) == '"')) {st2++; comma = TRUE;}
|
||||
while (*st2 != 0) {
|
||||
if (*st2 == '"') comma = !comma;
|
||||
else if ((*st2 == ' ') && (!comma)) break;
|
||||
fnd += (*(st2++));
|
||||
}
|
||||
if (!with_commas && (*(st2-1) == '"')) fnd.RemoveLast();
|
||||
return fnd;
|
||||
}
|
||||
if (*st2 == 0) return "";
|
||||
if (*p2 != *st2) p2 = p;
|
||||
if (*p2 == *st2) p2++;
|
||||
if (*st2 == ' ') p2 = p;
|
||||
else if (*st2 == '=') {
|
||||
p2 = p;
|
||||
while (*st2 != ' ') {
|
||||
if (*st2 == '"') {
|
||||
st2++;
|
||||
while (*st2 != '"') st2++;
|
||||
}
|
||||
st2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlTag::ScanParam(const wxString& par, char *format, ...) const
|
||||
{
|
||||
va_list argptr;
|
||||
wxString parval = GetParam(par);
|
||||
|
||||
va_start(argptr, format);
|
||||
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__VISUALC__)
|
||||
sscanf((const char*)parval, format, va_arg(argptr, void *));
|
||||
#else
|
||||
vsscanf((const char*)parval, format, argptr);
|
||||
#endif
|
||||
|
||||
/*
|
||||
--- vsscanf is not defined under Cygwin or Mingw32 or M$ Visual C++ environment
|
||||
if this module doesn't compile with your compiler,
|
||||
modify the def statement and let me know. Thanks...
|
||||
|
||||
So far wxHtml functions are scanning only _one_ value
|
||||
so I workarounded this by supposing that there is only
|
||||
one ...-parameter
|
||||
*/
|
||||
|
||||
va_end(argptr);
|
||||
}
|
||||
|
||||
#endif
|
542
src/html/htmlwin.cpp
Normal file
@@ -0,0 +1,542 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlwin.cpp
|
||||
// Purpose: wxHtmlWindow class for parsing & displaying HTML (implementation)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
#include <wx/html/forcelink.h>
|
||||
|
||||
///// This is my own wxBusyCursor. It works only with one window.
|
||||
|
||||
#if (defined __WXGTK__) && (wxVERSION_NUMBER < 2100)
|
||||
class wxLocalBusyCursor
|
||||
#else
|
||||
class wxLocalBusyCursor : public wxBusyCursor
|
||||
#endif
|
||||
{
|
||||
private:
|
||||
wxWindow *m_Wnd;
|
||||
public:
|
||||
#if (defined __WXGTK__) && (wxVERSION_NUMBER < 2100)
|
||||
wxLocalBusyCursor(wxWindow *w) {m_Wnd = w; m_Wnd -> SetCursor(*wxHOURGLASS_CURSOR);}
|
||||
~wxLocalBusyCursor() {m_Wnd -> SetCursor(*wxSTANDARD_CURSOR);}
|
||||
#else
|
||||
wxLocalBusyCursor(wxWindow *w) : wxBusyCursor() {}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlWindow
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
#include <wx/arrimpl.cpp>
|
||||
WX_DEFINE_OBJARRAY(HtmlHistoryArray)
|
||||
|
||||
|
||||
wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||
const wxString& name, bool scrollable) : wxScrolledWindow(parent, id, pos, size, wxVSCROLL, name)
|
||||
{
|
||||
m_tmpMouseMoved = FALSE;
|
||||
m_tmpCanDraw = TRUE;
|
||||
m_FS = new wxFileSystem();
|
||||
m_RelatedStatusBar = -1;
|
||||
m_RelatedFrame = NULL;
|
||||
m_TitleFormat = "%s";
|
||||
m_OpenedPage = m_OpenedAnchor = wxEmptyString;
|
||||
m_Cell = NULL;
|
||||
m_Parser = new wxHtmlWinParser(this);
|
||||
m_Parser -> SetFS(m_FS);
|
||||
SetBorders(10);
|
||||
m_HistoryPos = -1;
|
||||
m_HistoryOn = TRUE;
|
||||
m_Scrollable = scrollable;
|
||||
SetPage("<html><body></body></html>");
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlWindow::~wxHtmlWindow()
|
||||
{
|
||||
HistoryClear();
|
||||
|
||||
if (m_Cell) delete m_Cell;
|
||||
|
||||
wxList *parser_data = m_Parser -> GetTempData();
|
||||
if (parser_data) delete parser_data;
|
||||
|
||||
delete m_Parser;
|
||||
delete m_FS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::SetRelatedFrame(wxFrame* frame, const wxString& format)
|
||||
{
|
||||
m_RelatedFrame = frame;
|
||||
m_TitleFormat = format;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::SetRelatedStatusBar(int bar)
|
||||
{
|
||||
m_RelatedStatusBar = bar;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::SetFonts(wxString normal_face, int normal_italic_mode, wxString fixed_face, int fixed_italic_mode, int *sizes)
|
||||
{
|
||||
m_Parser -> SetFonts(normal_face, normal_italic_mode, fixed_face, fixed_italic_mode, sizes);
|
||||
if (!m_OpenedPage.IsEmpty()) LoadPage(m_OpenedPage);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlWindow::SetPage(const wxString& source)
|
||||
{
|
||||
wxClientDC *dc = new wxClientDC(this);
|
||||
|
||||
dc -> SetMapMode(wxMM_TEXT);
|
||||
SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF));
|
||||
m_OpenedPage = m_OpenedAnchor = wxEmptyString;
|
||||
m_Parser -> SetDC(dc);
|
||||
if (m_Cell) delete m_Cell;
|
||||
m_Cell = (wxHtmlContainerCell*) m_Parser -> Parse(source);
|
||||
delete dc;
|
||||
m_Cell -> SetIndent(m_Borders, HTML_INDENT_ALL, HTML_UNITS_PIXELS);
|
||||
m_Cell -> SetAlignHor(HTML_ALIGN_CENTER);
|
||||
CreateLayout();
|
||||
Refresh();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
bool wxHtmlWindow::LoadPage(const wxString& location)
|
||||
{
|
||||
wxFSFile *f;
|
||||
bool rt_val;
|
||||
wxLocalBusyCursor b(this);
|
||||
|
||||
m_tmpCanDraw = FALSE;
|
||||
if (m_HistoryOn && (m_HistoryPos != -1)) { // store scroll position into history item
|
||||
int x, y;
|
||||
ViewStart(&x, &y);
|
||||
m_History[m_HistoryPos].SetPos(y);
|
||||
}
|
||||
|
||||
if (location[0] == '#') { // local anchor
|
||||
wxString anch = location.Mid(1) /*1 to end*/;
|
||||
m_tmpCanDraw = TRUE;
|
||||
rt_val = ScrollToAnchor(anch);
|
||||
}
|
||||
|
||||
else {
|
||||
// load&display it:
|
||||
if (m_RelatedStatusBar != -1) {
|
||||
m_RelatedFrame -> SetStatusText(_("Connecting..."), m_RelatedStatusBar);
|
||||
Refresh();
|
||||
}
|
||||
|
||||
f = m_FS -> OpenFile(location);
|
||||
if (f == NULL) {
|
||||
wxString err;
|
||||
|
||||
err.Printf(_("The browser is unable to open requested location :\n\n%s"), WXSTRINGCAST location);
|
||||
wxMessageBox(err, "Error");
|
||||
m_tmpCanDraw = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
else {
|
||||
wxNode *node;
|
||||
wxString src = wxEmptyString;
|
||||
|
||||
if (m_RelatedStatusBar != -1) {
|
||||
wxString msg = _("Loading : ") + location;
|
||||
m_RelatedFrame -> SetStatusText(msg, m_RelatedStatusBar);
|
||||
Refresh();
|
||||
}
|
||||
|
||||
node = m_Filters.GetFirst();
|
||||
while (node){
|
||||
wxHtmlFilter *h = (wxHtmlFilter*) node -> GetData();
|
||||
if (h -> CanRead(*f)) {
|
||||
src = h -> ReadFile(*f);
|
||||
break;
|
||||
}
|
||||
node = node -> GetNext();
|
||||
}
|
||||
if (src == wxEmptyString) src = m_DefaultFilter.ReadFile(*f);
|
||||
|
||||
m_FS -> ChangePathTo(f -> GetLocation());
|
||||
rt_val = SetPage(src);
|
||||
m_OpenedPage = f -> GetLocation();
|
||||
if (f -> GetAnchor() != wxEmptyString) {
|
||||
m_tmpCanDraw = TRUE;
|
||||
ScrollToAnchor(f -> GetAnchor());
|
||||
m_tmpCanDraw = FALSE;
|
||||
}
|
||||
|
||||
delete f;
|
||||
|
||||
if (m_RelatedStatusBar != -1) m_RelatedFrame -> SetStatusText(_("Done"), m_RelatedStatusBar);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_HistoryOn) { // add this page to history there:
|
||||
int c = m_History.GetCount() - (m_HistoryPos + 1);
|
||||
|
||||
m_HistoryPos++;
|
||||
for (int i = 0; i < c; i++)
|
||||
m_History.Remove(m_HistoryPos);
|
||||
m_History.Add(new HtmlHistoryItem(m_OpenedPage, m_OpenedAnchor));
|
||||
}
|
||||
|
||||
m_tmpCanDraw = TRUE;
|
||||
Refresh();
|
||||
return rt_val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlWindow::ScrollToAnchor(const wxString& anchor)
|
||||
{
|
||||
const wxHtmlCell *c = m_Cell -> Find(HTML_COND_ISANCHOR, &anchor);
|
||||
if (!c) return FALSE;
|
||||
else {
|
||||
int y;
|
||||
|
||||
for (y = 0; c != NULL; c = c -> GetParent()) y += c -> GetPosY();
|
||||
Scroll(-1, y / HTML_SCROLL_STEP);
|
||||
m_OpenedAnchor = anchor;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void wxHtmlWindow::SetTitle(const wxString& title)
|
||||
{
|
||||
if (m_RelatedFrame) {
|
||||
wxString tit;
|
||||
tit.Printf(m_TitleFormat, title.c_str());
|
||||
m_RelatedFrame -> SetTitle(tit);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::CreateLayout()
|
||||
{
|
||||
int ClientWidth, ClientHeight;
|
||||
|
||||
if (!m_Cell) return;
|
||||
GetClientSize(&ClientWidth, &ClientHeight);
|
||||
m_Cell -> Layout(ClientWidth);
|
||||
if (m_Scrollable)
|
||||
SetScrollbars(HTML_SCROLL_STEP, HTML_SCROLL_STEP,
|
||||
m_Cell -> GetWidth() / HTML_SCROLL_STEP,
|
||||
m_Cell -> GetHeight() / HTML_SCROLL_STEP
|
||||
/*cheat: top-level frag is always container*/ );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::ReadCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
m_Borders = cfg -> Read("wxHtmlWindow/Borders", m_Borders);
|
||||
m_Parser -> m_FontFaceFixed = cfg -> Read("wxHtmlWindow/FontFaceFixed", m_Parser -> m_FontFaceFixed);
|
||||
m_Parser -> m_FontFaceNormal = cfg -> Read("wxHtmlWindow/FontFaceNormal", m_Parser -> m_FontFaceNormal);
|
||||
m_Parser -> m_ItalicModeFixed = cfg -> Read("wxHtmlWindow/ItalicModeFixed", m_Parser -> m_ItalicModeFixed);
|
||||
m_Parser -> m_ItalicModeNormal = cfg -> Read("wxHtmlWindow/ItalicModeNormal", m_Parser -> m_ItalicModeNormal);
|
||||
for (int i = 0; i < 7; i++) {
|
||||
tmp.Printf("wxHtmlWindow/FontsSize%i", i);
|
||||
m_Parser -> m_FontsSizes[i] = cfg -> Read(tmp, m_Parser -> m_FontsSizes[i]);
|
||||
}
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::WriteCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
cfg -> Write("wxHtmlWindow/Borders", (long) m_Borders);
|
||||
cfg -> Write("wxHtmlWindow/FontFaceFixed", m_Parser -> m_FontFaceFixed);
|
||||
cfg -> Write("wxHtmlWindow/FontFaceNormal", m_Parser -> m_FontFaceNormal);
|
||||
cfg -> Write("wxHtmlWindow/ItalicModeFixed", (long) m_Parser -> m_ItalicModeFixed);
|
||||
cfg -> Write("wxHtmlWindow/ItalicModeNormal", (long) m_Parser -> m_ItalicModeNormal);
|
||||
for (int i = 0; i < 7; i++) {
|
||||
tmp.Printf("wxHtmlWindow/FontsSize%i", i);
|
||||
cfg -> Write(tmp, (long) m_Parser -> m_FontsSizes[i]);
|
||||
}
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlWindow::HistoryBack()
|
||||
{
|
||||
wxString a, l;
|
||||
|
||||
if (m_HistoryPos < 1) return FALSE;
|
||||
|
||||
m_HistoryPos--;
|
||||
|
||||
l = m_History[m_HistoryPos].GetPage();
|
||||
a = m_History[m_HistoryPos].GetAnchor();
|
||||
m_HistoryOn = FALSE;
|
||||
if (a == wxEmptyString) LoadPage(l);
|
||||
else LoadPage(l + "#" + a);
|
||||
m_HistoryOn = TRUE;
|
||||
Scroll(0, m_History[m_HistoryPos].GetPos());
|
||||
Refresh();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlWindow::HistoryForward()
|
||||
{
|
||||
wxString a, l;
|
||||
|
||||
if (m_HistoryPos == -1) return FALSE;
|
||||
if (m_HistoryPos >= (int)m_History.GetCount() - 1)return FALSE;
|
||||
|
||||
m_OpenedPage = wxEmptyString; // this will disable adding new entry into history in LoadPage()
|
||||
|
||||
m_HistoryPos++;
|
||||
l = m_History[m_HistoryPos].GetPage();
|
||||
a = m_History[m_HistoryPos].GetAnchor();
|
||||
m_HistoryOn = FALSE;
|
||||
if (a == wxEmptyString) LoadPage(l);
|
||||
else LoadPage(l + "#" + a);
|
||||
m_HistoryOn = TRUE;
|
||||
Scroll(0, m_History[m_HistoryPos].GetPos());
|
||||
Refresh();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::HistoryClear()
|
||||
{
|
||||
m_History.Empty();
|
||||
m_HistoryPos = -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxList wxHtmlWindow::m_Filters;
|
||||
wxHtmlFilterPlainText wxHtmlWindow::m_DefaultFilter;
|
||||
|
||||
void wxHtmlWindow::AddFilter(wxHtmlFilter *filter)
|
||||
{
|
||||
m_Filters.DeleteContents(TRUE);
|
||||
m_Filters.Append(filter);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnLinkClicked(const wxString& link)
|
||||
{
|
||||
LoadPage(link);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnDraw(wxDC& dc)
|
||||
{
|
||||
int x, y;
|
||||
wxRegionIterator upd(GetUpdateRegion()); // get the update rect list
|
||||
int v_y, v_h;
|
||||
|
||||
if (!m_tmpCanDraw) return;
|
||||
dc.SetMapMode(wxMM_TEXT);
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1200)
|
||||
::SetMapMode((HDC)dc.GetHDC(), MM_TEXT);
|
||||
#endif
|
||||
dc.SetBackgroundMode(wxTRANSPARENT);
|
||||
ViewStart(&x, &y);
|
||||
|
||||
while (upd) {
|
||||
v_y = upd.GetY();
|
||||
v_h = upd.GetH();
|
||||
if (m_Cell) m_Cell -> Draw(dc, 0, 0, y * HTML_SCROLL_STEP + v_y, y * HTML_SCROLL_STEP + v_h + v_y);
|
||||
upd++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnSize(wxSizeEvent& event)
|
||||
{
|
||||
wxScrolledWindow::OnSize(event);
|
||||
CreateLayout();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnKeyDown(wxKeyEvent& event)
|
||||
{
|
||||
int dummy;
|
||||
int sty, szy, cliy;
|
||||
|
||||
ViewStart(&dummy, &sty);
|
||||
GetClientSize(&dummy, &cliy); cliy /= HTML_SCROLL_STEP;
|
||||
GetVirtualSize(&dummy, &szy); szy /= HTML_SCROLL_STEP;
|
||||
|
||||
switch (event.KeyCode()) {
|
||||
case WXK_PAGEUP :
|
||||
case WXK_PRIOR :
|
||||
Scroll(-1, sty - cliy);
|
||||
break;
|
||||
case WXK_PAGEDOWN :
|
||||
case WXK_NEXT :
|
||||
Scroll(-1, sty + cliy);
|
||||
break;
|
||||
case WXK_HOME :
|
||||
Scroll(-1, 0);
|
||||
break;
|
||||
case WXK_END :
|
||||
Scroll(-1, szy - cliy);
|
||||
break;
|
||||
case WXK_UP :
|
||||
Scroll(-1, sty - 1);
|
||||
break;
|
||||
case WXK_DOWN :
|
||||
Scroll(-1, sty + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnMouseEvent(wxMouseEvent& event)
|
||||
{
|
||||
m_tmpMouseMoved = TRUE;
|
||||
|
||||
if (event.ButtonDown()) {
|
||||
int sx, sy;
|
||||
wxPoint pos;
|
||||
wxString lnk;
|
||||
|
||||
ViewStart(&sx, &sy); sx *= HTML_SCROLL_STEP; sy *= HTML_SCROLL_STEP;
|
||||
pos = event.GetPosition();
|
||||
|
||||
if (m_Cell)
|
||||
m_Cell -> OnMouseClick(this, sx + pos.x, sy + pos.y, event.ButtonDown(1), event.ButtonDown(2), event.ButtonDown(3));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWindow::OnIdle(wxIdleEvent& event)
|
||||
{
|
||||
static wxCursor cur_hand(wxCURSOR_HAND), cur_arrow(wxCURSOR_ARROW);
|
||||
|
||||
if (m_tmpMouseMoved && (m_Cell != NULL)) {
|
||||
int sx, sy;
|
||||
int x, y;
|
||||
wxString lnk;
|
||||
|
||||
ViewStart(&sx, &sy); sx *= HTML_SCROLL_STEP; sy *= HTML_SCROLL_STEP;
|
||||
wxGetMousePosition(&x, &y);
|
||||
ScreenToClient(&x, &y);
|
||||
lnk = m_Cell -> GetLink(sx + x, sy + y);
|
||||
|
||||
if (lnk == wxEmptyString) {
|
||||
SetCursor(cur_arrow);
|
||||
if (m_RelatedStatusBar != -1) m_RelatedFrame -> SetStatusText(wxEmptyString, m_RelatedStatusBar);
|
||||
}
|
||||
else {
|
||||
SetCursor(cur_hand);
|
||||
if (m_RelatedStatusBar != -1) m_RelatedFrame -> SetStatusText(lnk, m_RelatedStatusBar);
|
||||
}
|
||||
m_tmpMouseMoved = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlWindow,wxScrolledWindow)
|
||||
|
||||
BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow)
|
||||
EVT_SIZE(wxHtmlWindow::OnSize)
|
||||
EVT_LEFT_DOWN(wxHtmlWindow::OnMouseEvent)
|
||||
EVT_MOTION(wxHtmlWindow::OnMouseEvent)
|
||||
EVT_IDLE(wxHtmlWindow::OnIdle)
|
||||
EVT_KEY_DOWN(wxHtmlWindow::OnKeyDown)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///// default mod handlers are forced there:
|
||||
|
||||
FORCE_LINK(mod_layout)
|
||||
FORCE_LINK(mod_fonts)
|
||||
FORCE_LINK(mod_image)
|
||||
FORCE_LINK(mod_list)
|
||||
FORCE_LINK(mod_pre)
|
||||
FORCE_LINK(mod_hline)
|
||||
FORCE_LINK(mod_links)
|
||||
FORCE_LINK(mod_tables)
|
||||
|
||||
|
||||
#endif
|
288
src/html/htmlwinparser.cpp
Normal file
@@ -0,0 +1,288 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: htmlwinparser.cpp
|
||||
// Purpose: wxHtmlParser class (generic parser)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
|
||||
#include <wx/html/htmldefs.h>
|
||||
#include <wx/html/htmlwinparser.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlWinParser
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlWinParser,wxHtmlParser)
|
||||
|
||||
wxList wxHtmlWinParser::m_Modules;
|
||||
|
||||
wxHtmlWinParser::wxHtmlWinParser(wxWindow *wnd) : wxHtmlParser()
|
||||
{
|
||||
m_Window = wnd;
|
||||
m_Container = NULL;
|
||||
m_DC = NULL;
|
||||
m_CharHeight = m_CharWidth = 0;
|
||||
m_UseLink = FALSE;
|
||||
|
||||
{
|
||||
int i, j, k, l, m;
|
||||
for (i = 0; i < 2; i++)
|
||||
for (j = 0; j < 2; j++)
|
||||
for (k = 0; k < 2; k++)
|
||||
for (l = 0; l < 2; l++)
|
||||
for (m = 0; m < 7; m++)
|
||||
m_FontsTable[i][j][k][l][m] = NULL;
|
||||
#ifdef __WXMSW__
|
||||
int default_sizes[7] = {7, 8, 10, 12, 16, 22, 30};
|
||||
#else
|
||||
int default_sizes[7] = {10, 12, 14, 16, 19, 24, 32};
|
||||
#endif
|
||||
SetFonts("", wxSLANT, "", wxSLANT, default_sizes);
|
||||
}
|
||||
|
||||
// fill in wxHtmlParser's tables:
|
||||
wxNode *node = m_Modules.GetFirst();
|
||||
while (node){
|
||||
wxHtmlTagsModule *mod = (wxHtmlTagsModule*) node -> GetData();
|
||||
mod -> FillHandlersTable(this);
|
||||
node = node -> GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWinParser::AddModule(wxHtmlTagsModule *module)
|
||||
{
|
||||
m_Modules.Append(module);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWinParser::SetFonts(wxString normal_face, int normal_italic_mode, wxString fixed_face, int fixed_italic_mode, int *sizes)
|
||||
{
|
||||
for (int i = 0; i < 7; i++) m_FontsSizes[i] = sizes[i];
|
||||
m_FontFaceFixed = fixed_face;
|
||||
m_FontFaceNormal = normal_face;
|
||||
m_ItalicModeFixed = fixed_italic_mode;
|
||||
m_ItalicModeNormal = normal_italic_mode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWinParser::InitParser(const wxString& source)
|
||||
{
|
||||
wxHtmlParser::InitParser(source);
|
||||
wxASSERT_MSG(m_DC != NULL, _("no DC assigned to wxHtmlWinParser!!"));
|
||||
|
||||
m_FontBold = m_FontItalic = m_FontUnderlined = m_FontFixed = FALSE;
|
||||
m_FontSize = 0;
|
||||
CreateCurrentFont(); // we're selecting default font into
|
||||
m_DC -> GetTextExtent("H", &m_CharWidth, &m_CharHeight);
|
||||
/* NOTE : we're not using GetCharWidth/Height() because
|
||||
of differences under X and win
|
||||
*/
|
||||
|
||||
m_Link = "";
|
||||
m_LinkColor.Set(0, 0, 0xFF);
|
||||
m_ActualColor.Set(0, 0, 0);
|
||||
m_Align = HTML_ALIGN_LEFT;
|
||||
m_tmpLastWasSpace = FALSE;
|
||||
|
||||
OpenContainer();
|
||||
|
||||
OpenContainer();
|
||||
m_Container -> InsertCell(new wxHtmlColourCell(m_ActualColor));
|
||||
m_Container -> InsertCell(new wxHtmlFontCell(CreateCurrentFont()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWinParser::DoneParser()
|
||||
{
|
||||
m_Container = NULL;
|
||||
wxHtmlParser::DoneParser();
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxObject* wxHtmlWinParser::GetProduct()
|
||||
{
|
||||
wxHtmlContainerCell *top;
|
||||
|
||||
CloseContainer();
|
||||
OpenContainer();
|
||||
GetContainer() -> SetIndent(m_CharHeight, HTML_INDENT_TOP);
|
||||
top = m_Container;
|
||||
while (top -> GetParent()) top = top -> GetParent();
|
||||
return top;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxList* wxHtmlWinParser::GetTempData()
|
||||
{
|
||||
int i, j, k, l, m;
|
||||
wxFont *f;
|
||||
wxList *lst = wxHtmlParser::GetTempData();
|
||||
|
||||
if (lst == NULL) lst = new wxList;
|
||||
lst -> DeleteContents(TRUE);
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
for (j = 0; j < 2; j++)
|
||||
for (k = 0; k < 2; k++)
|
||||
for (l = 0; l < 2; l++)
|
||||
for (m = 0; m < 7; m++) {
|
||||
f = m_FontsTable[i][j][k][l][m];
|
||||
if (f) lst -> Append(f);
|
||||
}
|
||||
return lst;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlWinParser::AddText(const char* txt)
|
||||
{
|
||||
wxHtmlCell *c;
|
||||
int i = 0, x, lng = strlen(txt);
|
||||
char temp[HTML_BUFLEN];
|
||||
register char d;
|
||||
int templen = 0;
|
||||
|
||||
if (m_tmpLastWasSpace) {
|
||||
while ((i < lng) && ((txt[i] == '\n') || (txt[i] == '\r') || (txt[i] == ' ') || (txt[i] == '\t'))) i++;
|
||||
}
|
||||
|
||||
while (i < lng) {
|
||||
x = 0;
|
||||
d = temp[templen++] = txt[i];
|
||||
if ((d == '\n') || (d == '\r') || (d == ' ') || (d == '\t')) {
|
||||
i++, x++;
|
||||
while ((i < lng) && ((txt[i] == '\n') || (txt[i] == '\r') || (txt[i] == ' ') || (txt[i] == '\t'))) i++, x++;
|
||||
}
|
||||
else i++;
|
||||
|
||||
if (x) {
|
||||
temp[templen-1] = ' ';
|
||||
temp[templen] = 0;
|
||||
templen = 0;
|
||||
c = new wxHtmlWordCell(temp, *(GetDC()));
|
||||
if (m_UseLink) c -> SetLink(m_Link);
|
||||
m_Container -> InsertCell(c);
|
||||
m_tmpLastWasSpace = TRUE;
|
||||
}
|
||||
}
|
||||
if (templen) {
|
||||
temp[templen] = 0;
|
||||
c = new wxHtmlWordCell(temp, *(GetDC()));
|
||||
if (m_UseLink) c -> SetLink(m_Link);
|
||||
m_Container -> InsertCell(c);
|
||||
m_tmpLastWasSpace = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlContainerCell* wxHtmlWinParser::OpenContainer()
|
||||
{
|
||||
m_Container = new wxHtmlContainerCell(m_Container);
|
||||
m_Container -> SetAlignHor(m_Align);
|
||||
m_tmpLastWasSpace = TRUE;
|
||||
/* to avoid space being first character in paragraph */
|
||||
return m_Container;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlContainerCell* wxHtmlWinParser::SetContainer(wxHtmlContainerCell *c)
|
||||
{
|
||||
m_tmpLastWasSpace = TRUE;
|
||||
/* to avoid space being first character in paragraph */
|
||||
return m_Container = c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlContainerCell* wxHtmlWinParser::CloseContainer()
|
||||
{
|
||||
m_Container = m_Container -> GetParent();
|
||||
return m_Container;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxFont* wxHtmlWinParser::CreateCurrentFont()
|
||||
{
|
||||
int fb = GetFontBold(),
|
||||
fi = GetFontItalic(),
|
||||
fu = GetFontUnderlined(),
|
||||
ff = GetFontFixed(),
|
||||
fs = GetFontSize() + 2 /*remap from <-2;4> to <0;7>*/ ;
|
||||
|
||||
if (m_FontsTable[fb][fi][fu][ff][fs] == NULL) {
|
||||
m_FontsTable[fb][fi][fu][ff][fs] =
|
||||
//wxTheFontList -> FindOrCreateFont(
|
||||
new wxFont(
|
||||
m_FontsSizes[fs],
|
||||
ff ? wxMODERN : wxSWISS,
|
||||
fi ? (ff ? m_ItalicModeFixed : m_ItalicModeNormal) : wxNORMAL,
|
||||
fb ? wxBOLD : wxNORMAL,
|
||||
fu ? TRUE : FALSE, ff ? m_FontFaceFixed : m_FontFaceNormal);
|
||||
}
|
||||
m_DC -> SetFont(*(m_FontsTable[fb][fi][fu][ff][fs]));
|
||||
return (m_FontsTable[fb][fi][fu][ff][fs]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlWinTagHandler
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxHtmlWinTagHandler, wxHtmlTagHandler)
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlTagsModule
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlTagsModule, wxModule)
|
||||
|
||||
|
||||
bool wxHtmlTagsModule::OnInit()
|
||||
{
|
||||
wxHtmlWinParser::AddModule(this);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlTagsModule::OnExit()
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
175
src/html/mod_fonts.cpp
Normal file
@@ -0,0 +1,175 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mod_fonts.cpp
|
||||
// Purpose: wxHtml module for fonts & colors of fonts
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/html/forcelink.h>
|
||||
#include <wx/html/mod_templ.h>
|
||||
|
||||
FORCE_LINK_ME(mod_fonts)
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(FONT, "FONT")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
unsigned long tmp;
|
||||
wxColour oldclr = m_WParser -> GetActualColor();
|
||||
int oldsize = m_WParser -> GetFontSize();
|
||||
|
||||
if (tag.HasParam("COLOR")) {
|
||||
wxColour clr;
|
||||
tag.ScanParam("COLOR", "#%lX", &tmp);
|
||||
clr = wxColour((tmp & 0xFF0000) >> 16 , (tmp & 0x00FF00) >> 8, (tmp & 0x0000FF));
|
||||
m_WParser -> SetActualColor(clr);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlColourCell(clr));
|
||||
}
|
||||
|
||||
if (tag.HasParam("SIZE")) {
|
||||
tag.ScanParam("SIZE", "%li", &tmp);
|
||||
m_WParser -> SetFontSize(tmp);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
}
|
||||
|
||||
ParseInner(tag);
|
||||
|
||||
if (oldclr != m_WParser -> GetActualColor()) {
|
||||
m_WParser -> SetActualColor(oldclr);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlColourCell(oldclr));
|
||||
}
|
||||
if (oldsize != m_WParser -> GetFontSize()) {
|
||||
m_WParser -> SetFontSize(oldsize);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(FONT)
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(FACES, "U,I,B,TT")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
int fixed = m_WParser -> GetFontFixed(),
|
||||
italic = m_WParser -> GetFontItalic(),
|
||||
underlined = m_WParser -> GetFontUnderlined(),
|
||||
bold = m_WParser -> GetFontBold();
|
||||
|
||||
if (tag.GetName() == "U")
|
||||
m_WParser -> SetFontUnderlined(TRUE);
|
||||
else if (tag.GetName() == "B")
|
||||
m_WParser -> SetFontBold(TRUE);
|
||||
else if (tag.GetName() == "I")
|
||||
m_WParser -> SetFontItalic(TRUE);
|
||||
else
|
||||
m_WParser -> SetFontFixed(TRUE);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
|
||||
ParseInner(tag);
|
||||
|
||||
m_WParser -> SetFontUnderlined(underlined);
|
||||
m_WParser -> SetFontBold(bold);
|
||||
m_WParser -> SetFontItalic(italic);
|
||||
m_WParser -> SetFontFixed(fixed);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(FACES)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(Hx, "H1,H2,H3,H4,H5,H6")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
int old_size, old_b, old_i, old_u, old_f, old_al;
|
||||
wxHtmlContainerCell *c;
|
||||
|
||||
old_size = m_WParser -> GetFontSize();
|
||||
old_b = m_WParser -> GetFontBold();
|
||||
old_i = m_WParser -> GetFontItalic();
|
||||
old_u = m_WParser -> GetFontUnderlined();
|
||||
old_f = m_WParser -> GetFontFixed();
|
||||
old_al = m_WParser -> GetAlign();
|
||||
|
||||
m_WParser -> SetFontBold(TRUE);
|
||||
m_WParser -> SetFontItalic(FALSE);
|
||||
m_WParser -> SetFontUnderlined(FALSE);
|
||||
m_WParser -> SetFontFixed(FALSE);
|
||||
|
||||
if (tag.GetName() == "H1")
|
||||
m_WParser -> SetFontSize(+4);
|
||||
else if (tag.GetName() == "H2")
|
||||
m_WParser -> SetFontSize(+3);
|
||||
else if (tag.GetName() == "H3")
|
||||
m_WParser -> SetFontSize(+2);
|
||||
else if (tag.GetName() == "H4") {
|
||||
m_WParser -> SetFontSize(+2);
|
||||
m_WParser -> SetFontItalic(TRUE);
|
||||
m_WParser -> SetFontBold(FALSE);
|
||||
}
|
||||
else if (tag.GetName() == "H5")
|
||||
m_WParser -> SetFontSize(+1);
|
||||
else if (tag.GetName() == "H6") {
|
||||
m_WParser -> SetFontSize(+1);
|
||||
m_WParser -> SetFontItalic(TRUE);
|
||||
m_WParser -> SetFontBold(FALSE);
|
||||
}
|
||||
|
||||
c = m_WParser -> GetContainer();
|
||||
if (c -> GetFirstCell()) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
c = m_WParser -> GetContainer();
|
||||
}
|
||||
c = m_WParser -> GetContainer();
|
||||
|
||||
c -> SetAlign(tag);
|
||||
c -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
c -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_TOP);
|
||||
m_WParser -> SetAlign(c -> GetAlignHor());
|
||||
|
||||
ParseInner(tag);
|
||||
|
||||
m_WParser -> SetFontSize(old_size);
|
||||
m_WParser -> SetFontBold(old_b);
|
||||
m_WParser -> SetFontItalic(old_i);
|
||||
m_WParser -> SetFontUnderlined(old_u);
|
||||
m_WParser -> SetFontFixed(old_f);
|
||||
m_WParser -> SetAlign(old_al);
|
||||
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
c = m_WParser -> GetContainer();
|
||||
c -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_TOP);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(Hx)
|
||||
|
||||
|
||||
|
||||
|
||||
TAGS_MODULE_BEGIN(Fonts)
|
||||
|
||||
TAGS_MODULE_ADD(FONT)
|
||||
TAGS_MODULE_ADD(FACES)
|
||||
TAGS_MODULE_ADD(Hx)
|
||||
|
||||
TAGS_MODULE_END(Fonts)
|
||||
|
||||
|
||||
#endif
|
88
src/html/mod_hline.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mod_hline.cpp
|
||||
// Purpose: wxHtml module for horizontal line (HR tag)
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/html/forcelink.h>
|
||||
#include <wx/html/mod_templ.h>
|
||||
|
||||
#include <wx/html/htmlcell.h>
|
||||
|
||||
FORCE_LINK_ME(mod_hline)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlLineCell
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlLineCell : public wxHtmlCell
|
||||
{
|
||||
public:
|
||||
wxHtmlLineCell(int size) : wxHtmlCell() {m_Height = size;}
|
||||
void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
void Layout(int w) {m_Width = w; if (m_Next) m_Next -> Layout(w);}
|
||||
};
|
||||
|
||||
|
||||
void wxHtmlLineCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
wxBrush mybrush("BLACK", wxSOLID);
|
||||
wxPen mypen("BLACK", 1, wxSOLID);
|
||||
dc.SetBrush(mybrush);
|
||||
dc.SetPen(mypen);
|
||||
dc.DrawRectangle(x + m_PosX, y + m_PosY, m_Width, m_Height);
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// The list handler:
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(HR, "HR")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
wxHtmlContainerCell *c;
|
||||
int sz;
|
||||
|
||||
m_WParser -> CloseContainer();
|
||||
c = m_WParser -> OpenContainer();
|
||||
|
||||
c -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_VERTICAL);
|
||||
c -> SetAlignHor(HTML_ALIGN_CENTER);
|
||||
c -> SetAlign(tag);
|
||||
c -> SetWidthFloat(tag);
|
||||
if (tag.HasParam("SIZE")) tag.ScanParam("SIZE", "%i", &sz);
|
||||
else sz = 1;
|
||||
c -> InsertCell(new wxHtmlLineCell(sz));
|
||||
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(HR)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TAGS_MODULE_BEGIN(HLine)
|
||||
|
||||
TAGS_MODULE_ADD(HR)
|
||||
|
||||
TAGS_MODULE_END(HLine)
|
||||
|
||||
#endif
|
147
src/html/mod_image.cpp
Normal file
@@ -0,0 +1,147 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mod_image.cpp
|
||||
// Purpose: wxHtml module for displaying images
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/html/forcelink.h>
|
||||
#include <wx/html/mod_templ.h>
|
||||
|
||||
#include <wx/wxhtml.h>
|
||||
#include <wx/image.h>
|
||||
|
||||
FORCE_LINK_ME(mod_image)
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlImageCell
|
||||
// Image/bitmap
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlImageCell : public wxHtmlCell
|
||||
{
|
||||
public:
|
||||
wxBitmap *m_Image;
|
||||
|
||||
wxHtmlImageCell(wxFSFile *input, int w = -1, int h = -1, int align = HTML_ALIGN_BOTTOM);
|
||||
~wxHtmlImageCell() {if (m_Image) delete m_Image;}
|
||||
void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
|
||||
};
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlImageCell
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
wxHtmlImageCell::wxHtmlImageCell(wxFSFile *input, int w, int h, int align) : wxHtmlCell()
|
||||
{
|
||||
wxImage *img;
|
||||
int ww, hh;
|
||||
wxString m = input -> GetMimeType();
|
||||
wxInputStream *s = input -> GetStream();
|
||||
|
||||
#if wxVERSION_NUMBER < 2100
|
||||
/* NOTE : use this *old* code only if you have old 2.0.1 wxWindows distribution
|
||||
and don't want to upgrade it with stuffs from add-on/wxwin201 */
|
||||
if (wxMimeTypesManager::IsOfType(m, "image/png")) img = new wxImage(*s, wxBITMAP_TYPE_PNG);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/jpeg")) img = new wxImage(*s, wxBITMAP_TYPE_JPEG);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/bmp")) img = new wxImage(*s, wxBITMAP_TYPE_BMP);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/gif")) img = new wxImage(*s, wxBITMAP_TYPE_GIF);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/tiff")) img = new wxImage(*s, wxBITMAP_TYPE_TIF);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/xpm")) img = new wxImage(*s, wxBITMAP_TYPE_XPM);
|
||||
else if (wxMimeTypesManager::IsOfType(m, "image/xbm")) img = new wxImage(*s, wxBITMAP_TYPE_XBM);
|
||||
else img = NULL;
|
||||
#else
|
||||
img = new wxImage(*s, m);
|
||||
#endif
|
||||
|
||||
m_Image = NULL;
|
||||
if (img && (img -> Ok())) {
|
||||
ww = img -> GetWidth();
|
||||
hh = img -> GetHeight();
|
||||
if (w != -1) m_Width = w; else m_Width = ww;
|
||||
if (h != -1) m_Height = h; else m_Height = hh;
|
||||
if ((m_Width != ww) || (m_Height != hh)) {
|
||||
wxImage img2 = img -> Scale(m_Width, m_Height);
|
||||
m_Image = new wxBitmap(img2.ConvertToBitmap());
|
||||
}
|
||||
else
|
||||
m_Image = new wxBitmap(img -> ConvertToBitmap());
|
||||
delete img;
|
||||
}
|
||||
switch (align) {
|
||||
case HTML_ALIGN_TOP :
|
||||
m_Descent = m_Height; break;
|
||||
case HTML_ALIGN_CENTER :
|
||||
m_Descent = m_Height / 2; break;
|
||||
case HTML_ALIGN_BOTTOM : default :
|
||||
m_Descent = 0; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
|
||||
{
|
||||
if (m_Image)
|
||||
dc.DrawBitmap(*m_Image, x + m_PosX, y + m_PosY, TRUE);
|
||||
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// tag handler
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
TAG_HANDLER_BEGIN(IMG, "IMG")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
if (tag.HasParam("SRC")) {
|
||||
int w = -1, h = -1;
|
||||
int al;
|
||||
wxFSFile *str;
|
||||
wxString tmp = tag.GetParam("SRC");
|
||||
|
||||
str = m_WParser -> GetFS() -> OpenFile(tmp);
|
||||
if (tag.HasParam("WIDTH")) tag.ScanParam("WIDTH", "%i", &w);
|
||||
if (tag.HasParam("HEIGHT")) tag.ScanParam("HEIGHT", "%i", &h);
|
||||
al = HTML_ALIGN_BOTTOM;
|
||||
if (tag.HasParam("ALIGN")) {
|
||||
wxString alstr = tag.GetParam("ALIGN");
|
||||
alstr.MakeUpper(); // for the case alignment was in ".."
|
||||
if (alstr == "TEXTTOP") al = HTML_ALIGN_TOP;
|
||||
else if ((alstr == "CENTER") || (alstr == "ABSCENTER")) al = HTML_ALIGN_CENTER;
|
||||
}
|
||||
if (str) {
|
||||
wxHtmlCell *cel = new wxHtmlImageCell(str, w, h, al);
|
||||
cel -> SetLink(m_WParser -> GetLink());
|
||||
m_WParser -> GetContainer() -> InsertCell(cel);
|
||||
delete str;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(IMAGE)
|
||||
|
||||
|
||||
|
||||
TAGS_MODULE_BEGIN(Image)
|
||||
|
||||
TAGS_MODULE_ADD(IMG)
|
||||
|
||||
TAGS_MODULE_END(Image)
|
||||
|
||||
|
||||
#endif
|
223
src/html/mod_layout.cpp
Normal file
@@ -0,0 +1,223 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: mod_layout.cpp
|
||||
// Purpose: wxHtml module for basic paragraphs/layout handling
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#include <wx/html/forcelink.h>
|
||||
#include <wx/html/mod_templ.h>
|
||||
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
FORCE_LINK_ME(mod_layout)
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(P, "P")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
if (m_WParser -> GetContainer() -> GetFirstCell() != NULL) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
}
|
||||
m_WParser -> GetContainer() -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_TOP);
|
||||
m_WParser -> GetContainer() -> SetAlign(tag);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(P)
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(BR, "BR")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
int al = m_WParser -> GetContainer() -> GetAlignHor();
|
||||
wxHtmlContainerCell *c;
|
||||
|
||||
m_WParser -> CloseContainer();
|
||||
c = m_WParser -> OpenContainer();
|
||||
c -> SetAlignHor(al);
|
||||
c -> SetAlign(tag);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(BR)
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(CENTER, "CENTER")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
int old = m_WParser -> GetAlign();
|
||||
wxHtmlContainerCell *c = m_WParser -> GetContainer();
|
||||
|
||||
m_WParser -> SetAlign(HTML_ALIGN_CENTER);
|
||||
if (c -> GetFirstCell() != NULL) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
}
|
||||
else
|
||||
c -> SetAlignHor(HTML_ALIGN_CENTER);
|
||||
|
||||
if (tag.HasEnding()) {
|
||||
ParseInner(tag);
|
||||
|
||||
m_WParser -> SetAlign(old);
|
||||
if (c -> GetFirstCell() != NULL) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
}
|
||||
else
|
||||
c -> SetAlignHor(old);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(CENTER)
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(DIV, "DIV")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
int old = m_WParser -> GetAlign();
|
||||
wxHtmlContainerCell *c = m_WParser -> GetContainer();
|
||||
if (c -> GetFirstCell() != NULL) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
c = m_WParser -> GetContainer();
|
||||
c -> SetAlign(tag);
|
||||
m_WParser -> SetAlign(c -> GetAlignHor());
|
||||
}
|
||||
else {
|
||||
c -> SetAlign(tag);
|
||||
m_WParser -> SetAlign(c -> GetAlignHor());
|
||||
}
|
||||
|
||||
ParseInner(tag);
|
||||
|
||||
m_WParser -> SetAlign(old);
|
||||
if (c -> GetFirstCell() != NULL) {
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
}
|
||||
else
|
||||
c -> SetAlignHor(old);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(DIV)
|
||||
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(TITLE, "TITLE")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
if (m_WParser -> GetWindow()) {
|
||||
wxHtmlWindow *wfr = (wxHtmlWindow*)(m_WParser -> GetWindow());
|
||||
if (wfr) {
|
||||
wxString title = "";
|
||||
wxString *src = m_WParser -> GetSource();
|
||||
|
||||
for (int i = tag.GetBeginPos(); i < tag.GetEndPos1(); i++) title += (*src)[i];
|
||||
wfr -> SetTitle(title);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(TITLE)
|
||||
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(BODY, "BODY")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
unsigned long tmp;
|
||||
wxColour clr;
|
||||
|
||||
if (tag.HasParam("TEXT")) {
|
||||
tag.ScanParam("TEXT", "#%lX", &tmp);
|
||||
clr = wxColour((tmp & 0xFF0000) >> 16 , (tmp & 0x00FF00) >> 8, (tmp & 0x0000FF));
|
||||
m_WParser -> SetActualColor(clr);
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlColourCell(clr));
|
||||
}
|
||||
|
||||
if (tag.HasParam("LINK")) {
|
||||
tag.ScanParam("LINK", "#%lX", &tmp);
|
||||
clr = wxColour((tmp & 0xFF0000) >> 16 , (tmp & 0x00FF00) >> 8, (tmp & 0x0000FF));
|
||||
m_WParser -> SetLinkColor(clr);
|
||||
}
|
||||
|
||||
if (tag.HasParam("BGCOLOR")) {
|
||||
tag.ScanParam("BGCOLOR", "#%lX", &tmp);
|
||||
clr = wxColour((tmp & 0xFF0000) >> 16 , (tmp & 0x00FF00) >> 8, (tmp & 0x0000FF));
|
||||
m_WParser -> GetContainer() -> InsertCell(new wxHtmlColourCell(clr, HTML_CLR_BACKGROUND));
|
||||
if (m_WParser -> GetWindow() != NULL)
|
||||
m_WParser -> GetWindow() -> SetBackgroundColour(clr);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(BODY)
|
||||
|
||||
|
||||
|
||||
TAG_HANDLER_BEGIN(BLOCKQUOTE, "BLOCKQUOTE")
|
||||
|
||||
TAG_HANDLER_PROC(tag)
|
||||
{
|
||||
wxHtmlContainerCell *c;
|
||||
|
||||
m_WParser -> CloseContainer();
|
||||
c = m_WParser -> OpenContainer();
|
||||
if (c -> GetAlignHor() == HTML_ALIGN_RIGHT)
|
||||
c -> SetIndent(5 * m_WParser -> GetCharWidth(), HTML_INDENT_RIGHT);
|
||||
else
|
||||
c -> SetIndent(5 * m_WParser -> GetCharWidth(), HTML_INDENT_LEFT);
|
||||
c -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_TOP);
|
||||
m_WParser -> OpenContainer();
|
||||
ParseInner(tag);
|
||||
c = m_WParser -> CloseContainer();
|
||||
c -> SetIndent(m_WParser -> GetCharHeight(), HTML_INDENT_BOTTOM);
|
||||
m_WParser -> CloseContainer();
|
||||
m_WParser -> OpenContainer();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TAG_HANDLER_END(BLOCKQUOTE)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
TAGS_MODULE_BEGIN(Layout)
|
||||
|
||||
TAGS_MODULE_ADD(P)
|
||||
TAGS_MODULE_ADD(BR)
|
||||
TAGS_MODULE_ADD(CENTER)
|
||||
TAGS_MODULE_ADD(DIV)
|
||||
TAGS_MODULE_ADD(TITLE)
|
||||
TAGS_MODULE_ADD(BODY)
|
||||
TAGS_MODULE_ADD(BLOCKQUOTE)
|
||||
|
||||
TAGS_MODULE_END(Layout)
|
||||
|
||||
#endif
|