8907154c1a
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35650 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
265 lines
6.9 KiB
C++
265 lines
6.9 KiB
C++
/*-*- c++ -*-********************************************************
|
|
* wxlparser.h : parsers, import/export for wxLayoutList *
|
|
* *
|
|
* (C) 1998,1999 by Karsten Ballüder (Ballueder@usa.net) *
|
|
* *
|
|
* $Id$
|
|
*******************************************************************/
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
# pragma hdrstop
|
|
#endif
|
|
|
|
#include "Mpch.h"
|
|
|
|
#ifdef M_PREFIX
|
|
# include "gui/wxllist.h"
|
|
# include "gui/wxlparser.h"
|
|
#else
|
|
# include "wxllist.h"
|
|
# include "wxlparser.h"
|
|
#endif
|
|
|
|
#define BASE_SIZE 12
|
|
|
|
inline static bool IsEndOfLine(const wxChar *p)
|
|
{
|
|
// the end of line is either just '\n' or "\r\n" - we understand both (even
|
|
// though the second is used only under DOS/Windows) to be able to import
|
|
// DOS text files even under Unix
|
|
return (*p == '\n') || ((*p == '\r') && (*(p + 1) == '\n'));
|
|
}
|
|
|
|
void wxLayoutImportText(wxLayoutList *list, wxString const &str)
|
|
{
|
|
if ( !str )
|
|
return;
|
|
|
|
// we change the string only temporarily inside this function
|
|
// VZ: I still don't like it... the string data may be shared...
|
|
wxChar * cptr = (wxChar *)str.c_str(); // const_cast
|
|
const wxChar * begin = cptr;
|
|
wxUnusedVar(begin);
|
|
wxChar backup;
|
|
|
|
for(;;)
|
|
{
|
|
begin = cptr;
|
|
while( *cptr && !IsEndOfLine(cptr) )
|
|
cptr++;
|
|
backup = *cptr;
|
|
*cptr = '\0';
|
|
list->Insert(begin);
|
|
*cptr = backup;
|
|
|
|
// check if it's the end of this line
|
|
if ( IsEndOfLine(cptr) )
|
|
{
|
|
// if it was "\r\n", skip the following '\n'
|
|
if ( *cptr == '\r' )
|
|
cptr++;
|
|
list->LineBreak();
|
|
}
|
|
else if(backup == '\0') // reached end of string
|
|
break;
|
|
cptr++;
|
|
}
|
|
}
|
|
|
|
static
|
|
wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
|
|
wxLayoutStyleInfo *styleInfo,
|
|
bool firstTime)
|
|
{
|
|
static wxChar buffer[20];
|
|
wxString html;
|
|
|
|
wxLayoutStyleInfo *si = cmd.GetStyle();
|
|
|
|
int size, sizecount;
|
|
|
|
html += _T("<font ");
|
|
|
|
if(si->m_fg_valid)
|
|
{
|
|
html += _T("color=");
|
|
wxSprintf(buffer,_T("\"#%02X%02X%02X\""), si->m_fg.Red(),si->m_fg.Green(),si->m_fg.Blue());
|
|
html += buffer;
|
|
}
|
|
|
|
if(si->m_bg_valid)
|
|
{
|
|
html += _T(" bgcolor=");
|
|
wxSprintf(buffer,_T("\"#%02X%02X%02X\""), si->m_bg.Red(),si->m_bg.Green(),si->m_bg.Blue());
|
|
html += buffer;
|
|
}
|
|
|
|
switch(si->family)
|
|
{
|
|
case wxSWISS:
|
|
case wxMODERN:
|
|
html += _T(" face=\"Arial,Helvetica\""); break;
|
|
case wxROMAN:
|
|
html += _T(" face=\"Times New Roman, Times\""); break;
|
|
case wxTELETYPE:
|
|
html += _T(" face=\"Courier New, Courier\""); break;
|
|
default:
|
|
;
|
|
}
|
|
|
|
size = BASE_SIZE; sizecount = 0;
|
|
while(size < si->size && sizecount < 5)
|
|
{
|
|
sizecount ++;
|
|
size = (size*12)/10;
|
|
}
|
|
while(size > si->size && sizecount > -5)
|
|
{
|
|
sizecount --;
|
|
size = (size*10)/12;
|
|
}
|
|
html += _T("size=");
|
|
wxSprintf(buffer,_T("%+1d"), sizecount);
|
|
html += buffer;
|
|
|
|
html += _T(">");
|
|
|
|
if(styleInfo != NULL && ! firstTime)
|
|
html = _T("</font>")+html; // terminate any previous font command
|
|
|
|
if((si->weight == wxBOLD) && ( (!styleInfo) || (styleInfo->weight != wxBOLD)))
|
|
html += _T("<b>");
|
|
else
|
|
if(si->weight != wxBOLD && ( styleInfo && (styleInfo->weight == wxBOLD)))
|
|
html += _T("</b>");
|
|
|
|
if(si->style == wxSLANT)
|
|
si->style = wxITALIC; // the same for html
|
|
|
|
if((si->style == wxITALIC) && ( (!styleInfo) || (styleInfo->style != wxITALIC)))
|
|
html += _T("<i>");
|
|
else
|
|
if(si->style != wxITALIC && ( styleInfo && (styleInfo->style == wxITALIC)))
|
|
html += _T("</i>");
|
|
|
|
if(si->underline && ( (!styleInfo) || ! styleInfo->underline))
|
|
html += _T("<u>");
|
|
else if(si->underline == false && ( styleInfo && styleInfo->underline))
|
|
html += _T("</u>");
|
|
|
|
|
|
*styleInfo = *si; // update last style info
|
|
|
|
return html;
|
|
}
|
|
|
|
|
|
|
|
wxLayoutExportStatus::wxLayoutExportStatus(wxLayoutList *list)
|
|
{
|
|
m_si = list->GetDefaultStyleInfo();
|
|
m_line = list->GetFirstLine();
|
|
m_iterator = m_line->GetFirstObject();
|
|
m_FirstTime = true;
|
|
}
|
|
|
|
|
|
|
|
#define WXLO_IS_TEXT(type) \
|
|
( type == WXLO_TYPE_TEXT \
|
|
|| (type == WXLO_TYPE_CMD \
|
|
&& mode == WXLO_EXPORT_AS_HTML))
|
|
|
|
|
|
wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
|
|
int mode, int flags)
|
|
{
|
|
wxLayoutObjectList::iterator nulled(NULL);
|
|
wxASSERT(status);
|
|
wxLayoutExportObject * exp;
|
|
|
|
if(status->m_iterator == nulled) // end of line
|
|
{
|
|
if(!status->m_line || status->m_line->GetNextLine() == NULL)
|
|
// reached end of list
|
|
return NULL;
|
|
}
|
|
exp = new wxLayoutExportObject();
|
|
wxLayoutObjectType type;
|
|
if(status->m_iterator != nulled)
|
|
{
|
|
type = (** status->m_iterator).GetType();
|
|
if( mode == WXLO_EXPORT_AS_OBJECTS || ! WXLO_IS_TEXT(type)) // simple case
|
|
{
|
|
exp->type = WXLO_EXPORT_OBJECT;
|
|
exp->content.object = *status->m_iterator;
|
|
status->m_iterator++;
|
|
return exp;
|
|
}
|
|
}
|
|
else
|
|
{ // iterator == nulled
|
|
if(mode == WXLO_EXPORT_AS_OBJECTS)
|
|
{
|
|
exp->type = WXLO_EXPORT_EMPTYLINE;
|
|
exp->content.object = NULL; //empty line
|
|
status->m_line = status->m_line->GetNextLine();
|
|
if(status->m_line)
|
|
status->m_iterator = status->m_line->GetFirstObject();
|
|
return exp;
|
|
}
|
|
else
|
|
type = WXLO_TYPE_TEXT;
|
|
}
|
|
wxUnusedVar(type);
|
|
|
|
wxString *str = new wxString();
|
|
// text must be concatenated
|
|
for(;;)
|
|
{
|
|
while(status->m_iterator == nulled)
|
|
{
|
|
if(mode & WXLO_EXPORT_AS_HTML)
|
|
*str += _T("<br>");
|
|
if(flags & WXLO_EXPORT_WITH_CRLF)
|
|
*str += _T("\r\n");
|
|
else
|
|
*str += '\n';
|
|
|
|
status->m_line = status->m_line->GetNextLine();
|
|
if(status->m_line)
|
|
status->m_iterator = status->m_line->GetFirstObject();
|
|
else
|
|
break; // end of list
|
|
}
|
|
if(! status->m_line) // reached end of list, fall through
|
|
break;
|
|
type = (** status->m_iterator).GetType();
|
|
if(type == WXLO_TYPE_ICON)
|
|
break;
|
|
switch(type)
|
|
{
|
|
case WXLO_TYPE_TEXT:
|
|
*str += ((wxLayoutObjectText *)*status->m_iterator)->GetText();
|
|
break;
|
|
case WXLO_TYPE_CMD:
|
|
if(mode == WXLO_EXPORT_AS_HTML)
|
|
*str += wxLayoutExportCmdAsHTML(
|
|
*(wxLayoutObjectCmd const *)*status->m_iterator,
|
|
& status->m_si, status->m_FirstTime);
|
|
status->m_FirstTime = false;
|
|
break;
|
|
default: // ignore icons
|
|
;
|
|
}
|
|
status->m_iterator++;
|
|
}
|
|
exp->type = (mode == WXLO_EXPORT_AS_HTML)
|
|
? WXLO_EXPORT_HTML : WXLO_EXPORT_TEXT;
|
|
exp->content.text = str;
|
|
return exp;
|
|
}
|
|
|