Modified font handling (on the way to real rtf editing...)

Selections are better but still buggy, list size does not get calculated
completely, end of list only appears after multiple edits. ???


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2438 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Karsten Ballüder 1999-05-12 22:14:51 +00:00
parent 69418a8e47
commit ae2d6d0200
7 changed files with 400 additions and 160 deletions

View File

@ -11,12 +11,20 @@ BUGS
- delete in empty line doesn't always work
- fix initial scrollbar sizes
- fix horiz scrollbar size
- occasionally wraps lines wongly (twice) ??
TODO
=====================================================================
Selections:
- moving in negative direction doesn't work
- selection state not properly reset, only works once
- selecting non-text objects is strange
wxllist::GetSize() requires extra Layout() call, which should not be
necessary. Find out why this is so.
- Image at end of a message doesn't get considered properly in
wxLayoutList::GetSize(), so it cannot be seen
- searching for text

View File

@ -36,7 +36,7 @@ IMPLEMENT_APP(MyApp)
enum ids{ ID_ADD_SAMPLE = 1, ID_CLEAR, ID_PRINT,
ID_PRINT_SETUP, ID_PAGE_SETUP, ID_PREVIEW, ID_PRINT_PS,
ID_PRINT_SETUP_PS, ID_PAGE_SETUP_PS,ID_PREVIEW_PS,
ID_WRAP, ID_NOWRAP, ID_PASTE, ID_COPY,
ID_WRAP, ID_NOWRAP, ID_PASTE, ID_COPY, ID_CUT,
ID_WXLAYOUT_DEBUG, ID_QUIT, ID_CLICK, ID_HTML, ID_TEXT,
ID_TEST, ID_LONG_TEST };
@ -94,6 +94,7 @@ MyFrame::MyFrame(void) :
edit_menu->Append(ID_NOWRAP, "No-wrap mode", "Deactivate wrapping.");
edit_menu->AppendSeparator();
edit_menu->Append(ID_COPY, "Copy", "Copy text to clipboard.");
edit_menu->Append(ID_CUT, "Cut", "Cut text to clipboard.");
edit_menu->Append(ID_PASTE,"Paste", "Paste text from clipboard.");
menu_bar->Append(edit_menu, "Edit" );
@ -231,9 +232,15 @@ void MyFrame::OnCommand( wxCommandEvent &event )
break;
case ID_PASTE:
m_lwin->Paste();
m_lwin->Refresh(FALSE);
break;
case ID_COPY:
m_lwin->Copy();
m_lwin->Refresh(FALSE);
break;
case ID_CUT:
m_lwin->Cut();
m_lwin->Refresh(FALSE);
break;
case ID_HTML:
{

View File

@ -27,6 +27,7 @@
# define SHOW_SELECTIONS 1
#else
# include "wxllist.h"
# include "wxlparser.h"
# define SHOW_SELECTIONS 1
#endif
@ -209,7 +210,7 @@ wxLayoutObjectText::GetOffsetScreen(wxDC &dc, CoordType xpos) const
}
void
wxLayoutObjectText::Layout(wxDC &dc)
wxLayoutObjectText::Layout(wxDC &dc, class wxLayoutList * )
{
long descent = 0l;
@ -262,7 +263,7 @@ wxLayoutObjectIcon::Draw(wxDC &dc, wxPoint const &coords,
}
void
wxLayoutObjectIcon::Layout(wxDC & /* dc */)
wxLayoutObjectIcon::Layout(wxDC & /* dc */, class wxLayoutList * )
{
}
@ -278,54 +279,108 @@ wxLayoutObjectIcon::GetSize(CoordType *top, CoordType *bottom) const
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
wxLayoutObjectIcon
wxLayoutObjectCmd
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
wxLayoutStyleInfo::wxLayoutStyleInfo(int ifamily,
int isize,
int istyle,
int iweight,
int iul,
wxColour *fg,
wxColour *bg)
{
family = ifamily; size = isize;
style = istyle; weight = iweight;
underline = iul;
if(fg)
{
fg_valid = true;
fg_red = fg->Red();
fg_blue = fg->Blue();
fg_green = fg->Green();
}
else
fg_valid = false;
if(bg)
{
bg_valid = true;
bg_red = bg->Red();
bg_blue = bg->Blue();
bg_green = bg->Green();
}
else
bg_valid = false;
}
#define SET_SI(what) tmp.what = (what != -1) ? what : ( si ? si->what : wxNORMAL);
wxFont *
wxLayoutStyleInfo::GetFont(wxLayoutStyleInfo *si)
{
wxLayoutStyleInfo tmp;
SET_SI(family);
SET_SI(size);
SET_SI(style);
SET_SI(weight);
SET_SI(underline);
return new wxFont(tmp.size,tmp.family,tmp.style,tmp.weight,tmp.underline);
}
wxLayoutObjectCmd::wxLayoutObjectCmd(int size, int family, int style, int
weight, bool underline,
wxColour &fg, wxColour &bg)
weight, int underline,
wxColour *fg, wxColour *bg)
{
m_font = new wxFont(size,family,style,weight,underline);
m_ColourFG = fg;
m_ColourBG = bg;
m_StyleInfo = new
wxLayoutStyleInfo(size,family,style,weight,underline,fg,bg);
m_font = m_StyleInfo->GetFont(NULL);
}
wxLayoutObject *
wxLayoutObjectCmd::Copy(void)
{
wxLayoutStyleInfo si;
GetStyle(&si);
wxColour
* fg = NULL,
* bg = NULL;
if(m_StyleInfo->fg_valid)
fg = new
wxColour(m_StyleInfo->fg_red,m_StyleInfo->fg_green,m_StyleInfo->fg_blue);
if(m_StyleInfo->bg_valid)
bg = new
wxColour(m_StyleInfo->bg_red,m_StyleInfo->bg_green,m_StyleInfo->bg_blue);
wxLayoutObjectCmd *obj = new wxLayoutObjectCmd(
si.size, si.family, si.style, si.weight, si.underline,
m_ColourFG, m_ColourBG);
m_StyleInfo->size,
m_StyleInfo->family,
m_StyleInfo->style,
m_StyleInfo->weight,
m_StyleInfo->underline,
fg, bg);
obj->SetUserData(m_UserData);
if(fg) delete fg;
if(bg) delete bg;
return obj;
}
wxLayoutObjectCmd::~wxLayoutObjectCmd()
{
delete m_StyleInfo;
delete m_font;
}
void
wxLayoutObjectCmd::GetStyle(wxLayoutStyleInfo *si) const
wxLayoutStyleInfo *
wxLayoutObjectCmd::GetStyle(void) const
{
si->size = m_font->GetPointSize();
si->family = m_font->GetFamily();
si->style = m_font->GetStyle();
si->underline = m_font->GetUnderlined();
si->weight = m_font->GetWeight();
si->fg_red = m_ColourFG.Red();
si->fg_green = m_ColourFG.Green();
si->fg_blue = m_ColourFG.Blue();
si->bg_red = m_ColourBG.Red();
si->bg_green = m_ColourBG.Green();
si->bg_blue = m_ColourBG.Blue();
return m_StyleInfo;
}
void
@ -333,19 +388,16 @@ wxLayoutObjectCmd::Draw(wxDC &dc, wxPoint const & /* coords */,
wxLayoutList *wxllist,
CoordType begin, CoordType /* len */)
{
wxASSERT(m_font);
wxASSERT(m_StyleInfo);
dc.SetFont(*m_font);
dc.SetTextForeground(m_ColourFG);
dc.SetTextBackground(m_ColourBG);
if(wxllist)
wxllist->SetColour_Internal(&m_ColourFG,& m_ColourBG);
wxllist->ApplyStyle(m_StyleInfo, dc);
}
void
wxLayoutObjectCmd::Layout(wxDC &dc)
wxLayoutObjectCmd::Layout(wxDC &dc, class wxLayoutList * llist)
{
// this get called, so that recalculation uses right font sizes
Draw(dc, wxPoint(0,0), NULL);
Draw(dc, wxPoint(0,0), llist);
}
@ -456,7 +508,7 @@ wxLayoutLine::FindObjectScreen(wxDC &dc,
for(i = m_ObjectList.begin(); i != NULLIT; i++)
{
(**i).Layout(dc);
//FIXME! (**i).Layout(dc, NULL);
width = (**i).GetWidth();
if( x <= xpos && xpos <= x + width )
{
@ -678,6 +730,7 @@ wxLayoutLine::Draw(wxDC &dc,
CoordType from, to, tempto;
int highlight = llist->IsSelected(this, &from, &to);
WXLO_DEBUG(("highlight=%d", highlight ));
if(highlight == 1) // we need to draw the whole line inverted!
llist->StartHighlighting(dc);
else
@ -743,7 +796,7 @@ wxLayoutLine::Layout(wxDC &dc,
for(i = m_ObjectList.begin(); i != NULLIT; i++)
{
(**i).Layout(dc);
(**i).Layout(dc, llist);
size = (**i).GetSize(&objTopHeight, &objBottomHeight);
if(cursorPos && ! cursorFound)
@ -1092,6 +1145,14 @@ wxLayoutList::InternalClear(void)
delete m_DefaultSetting;
m_DefaultSetting = NULL;
}
m_Selection.m_selecting = false;
m_Selection.m_valid = false;
m_CurrentSetting.family = wxSWISS;
m_CurrentSetting.size = WXLO_DEFAULTFONTSIZE;
m_CurrentSetting.style = wxNORMAL;
m_CurrentSetting.weight = wxNORMAL;
m_CurrentSetting.underline = 0;
}
void
@ -1104,13 +1165,9 @@ wxLayoutList::SetFont(int family, int size, int style, int weight,
if(style != -1) m_FontStyle = style;
if(weight != -1) m_FontWeight = weight;
if(underline != -1) m_FontUnderline = underline != 0;
if(fg != NULL) m_ColourFG = *fg;
if(bg != NULL) m_ColourBG = *bg;
Insert(
new wxLayoutObjectCmd(m_FontPtSize,m_FontFamily,m_FontStyle,m_FontWeight,m_FontUnderline,
m_ColourFG, m_ColourBG));
fg, bg));
}
void
@ -1127,37 +1184,20 @@ wxLayoutList::SetFont(int family, int size, int style, int weight,
if( bg )
cbg = wxTheColourDatabase->FindColour(bg);
SetFont(family,size,style,weight,underline,cfg,cbg);
SetFont(size,family,style,weight,underline,cfg,cbg);
}
void
wxLayoutList::Clear(int family, int size, int style, int weight,
int /* underline */, wxColour *fg, wxColour *bg)
int underline, wxColour *fg, wxColour *bg)
{
InternalClear();
// set defaults
m_FontPtSize = size;
m_FontUnderline = false;
m_FontFamily = family;
m_FontStyle = style;
m_FontWeight = weight;
if(fg)
m_ColourFG = *fg;
else
m_ColourFG = *wxBLACK;
if(bg)
m_ColourBG = *bg;
else
m_ColourBG = *wxWHITE;
if(m_DefaultSetting)
delete m_DefaultSetting;
m_DefaultSetting = new
wxLayoutObjectCmd(m_FontPtSize,m_FontFamily,m_FontStyle,
m_FontWeight,m_FontUnderline,
m_ColourFG, m_ColourBG);
m_DefaultSetting = new
wxLayoutStyleInfo(family,size,style,weight,underline,fg,bg);
}
@ -1291,6 +1331,7 @@ wxLayoutList::Insert(wxString const &text)
SetUpdateRect(m_CursorScreenPos+m_CursorSize);
m_CursorLine->Insert(m_CursorPos.x, text);
m_CursorPos.x += text.Length();
m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
@ -1302,6 +1343,7 @@ wxLayoutList::Insert(wxLayoutObject *obj)
SetUpdateRect(m_CursorScreenPos+m_CursorSize);
m_CursorLine->Insert(m_CursorPos.x, obj);
m_CursorPos.x += obj->GetLength();
m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
@ -1317,6 +1359,7 @@ wxLayoutList::LineBreak(void)
m_FirstLine = m_CursorLine->GetPreviousLine();
m_CursorPos.y++;
m_CursorPos.x = 0;
m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
@ -1338,6 +1381,7 @@ wxLayoutList::WrapLine(CoordType column)
LineBreak();
Delete(1); // delete the space
m_CursorPos.x = newpos;
m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
}
@ -1379,6 +1423,7 @@ wxLayoutList::Delete(CoordType npos)
}
}
while(left);
m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return left == 0;
}
@ -1416,7 +1461,7 @@ wxLayoutList::Recalculate(wxDC &dc, CoordType bottom)
// first, make sure everything is calculated - this might not be
// needed, optimise it later
m_DefaultSetting->Layout(dc);
ApplyStyle(m_DefaultSetting, dc);
while(line)
{
line->RecalculatePosition(this); // so we don't need to do it all the time
@ -1447,7 +1492,7 @@ wxLayoutList::Layout(wxDC &dc, CoordType bottom)
// first, make sure everything is calculated - this might not be
// needed, optimise it later
m_DefaultSetting->Layout(dc);
ApplyStyle(m_DefaultSetting, dc);
while(line)
{
if(line == m_CursorLine)
@ -1479,7 +1524,7 @@ wxLayoutList::Draw(wxDC &dc,
wxLayoutLine *line = m_FirstLine;
Layout(dc, bottom);
m_DefaultSetting->Draw(dc, wxPoint(0,0), this);
ApplyStyle(m_DefaultSetting, dc);
wxBrush brush(m_ColourBG, wxSOLID);
dc.SetBrush(brush);
@ -1514,7 +1559,7 @@ wxLayoutList::FindObjectScreen(wxDC &dc, wxPoint const pos,
wxPoint p;
// we need to run a layout here to get font sizes right :-(
m_DefaultSetting->Layout(dc);
ApplyStyle(m_DefaultSetting, dc);
while(line)
{
p = line->GetPosition();
@ -1706,7 +1751,62 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
return 0;
}
void
wxLayoutList::DeleteSelection(void)
{
if(! m_Selection.m_valid)
return;
m_Selection.m_valid = false;
// Only delete part of the current line?
if(m_Selection.m_CursorA.y == m_Selection.m_CursorB.y)
{
MoveCursorTo(m_Selection.m_CursorA);
Delete(m_Selection.m_CursorB.x - m_Selection.m_CursorA.x);
return;
}
wxLayoutLine
* firstLine = NULL,
* lastLine = NULL;
for(firstLine = m_FirstLine;
firstLine && firstLine->GetLineNumber() < m_Selection.m_CursorA.y;
firstLine=firstLine->GetNextLine())
;
if(!firstLine || firstLine->GetLineNumber() != m_Selection.m_CursorA.y)
return;
for(lastLine = m_FirstLine;
lastLine && lastLine->GetLineNumber() < m_Selection.m_CursorB.y;
lastLine=lastLine->GetNextLine())
;
if(!lastLine || lastLine->GetLineNumber() != m_Selection.m_CursorB.y)
return;
// We now know that the two lines are different:
// First, delete what's left of this line:
MoveCursorTo(m_Selection.m_CursorA);
DeleteToEndOfLine();
wxLayoutLine *nextLine = firstLine->GetNextLine();
while(nextLine && nextLine != lastLine)
nextLine = nextLine->DeleteLine(false, this);
// Now nextLine = lastLine;
Delete(1); // This joins firstLine and nextLine
Delete(m_Selection.m_CursorB.x); // This deletes the first x
// positions
/// Recalculate:
firstLine->RecalculatePositions(1, this);
}
/// Starts highlighting the selection
void
wxLayoutList::StartHighlighting(wxDC &dc)
@ -1767,11 +1867,15 @@ wxLayoutList::Copy(const wxPoint &from,
{
// Extract objects from first line
firstLine->Copy(llist, from.x);
llist->LineBreak();
// Extract all lines between
for(wxLayoutLine *line = firstLine->GetNextLine();
line != lastLine;
line = line->GetNextLine())
{
line->Copy(llist);
llist->LineBreak();
}
// Extract objects from last line
lastLine->Copy(llist, 0, to.x);
}
@ -1782,11 +1886,57 @@ wxLayoutList *
wxLayoutList::GetSelection(void)
{
if(! m_Selection.m_valid)
return NULL;
{
if(m_Selection.m_selecting)
EndSelection();
else
return NULL;
}
m_Selection.m_valid = false;
return Copy( m_Selection.m_CursorA, m_Selection.m_CursorB );
}
#define COPY_SI(what) if(si->what != -1) m_CurrentSetting.what = si->what;
void
wxLayoutList::ApplyStyle(wxLayoutStyleInfo *si, wxDC &dc)
{
COPY_SI(family);
COPY_SI(size);
COPY_SI(style);
COPY_SI(weight);
COPY_SI(underline);
if(si->fg_valid)
{
m_CurrentSetting.fg_valid = true;
m_CurrentSetting.fg_red = si->fg_red;
m_CurrentSetting.fg_green = si->fg_green;
m_CurrentSetting.fg_blue = si->fg_blue;
}
if(si->bg_valid)
{
m_CurrentSetting.bg_valid = true;
m_CurrentSetting.bg_red = si->bg_red;
m_CurrentSetting.bg_green = si->bg_green;
m_CurrentSetting.bg_blue = si->bg_blue;
}
m_ColourFG = wxColour(m_CurrentSetting.fg_red,
m_CurrentSetting.fg_green,
m_CurrentSetting.fg_blue);
m_ColourBG = wxColour(m_CurrentSetting.bg_red,
m_CurrentSetting.bg_green,
m_CurrentSetting.bg_blue);
dc.SetTextForeground(m_ColourFG);
dc.SetTextBackground(m_ColourBG);
}
#ifdef WXLAYOUT_DEBUG
void

View File

@ -40,7 +40,7 @@
# define WXLO_TRACE(x)
#endif
#define WXLO_DEBUG_URECT 0
#ifndef WXLO_DEFAULTFONTSIZE
# define WXLO_DEFAULTFONTSIZE 12
@ -106,8 +106,9 @@ public:
virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_INVALID; }
/** Calculates the size of an object.
@param dc the wxDC to draw on
@param llist the wxLayoutList
*/
virtual void Layout(wxDC &) = 0;
virtual void Layout(wxDC &dc, class wxLayoutList *llist) = 0;
/** Draws an object.
@param dc the wxDC to draw on
@ -194,7 +195,7 @@ public:
wxLayoutObjectText(const wxString &txt);
virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_TEXT; }
virtual void Layout(wxDC &dc);
virtual void Layout(wxDC &dc, class wxLayoutList *llist);
virtual void Draw(wxDC &dc, wxPoint const &coords,
class wxLayoutList *wxllist,
CoordType begin = -1,
@ -254,7 +255,7 @@ public:
~wxLayoutObjectIcon() { delete m_Icon; }
virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_ICON; }
virtual void Layout(wxDC &dc);
virtual void Layout(wxDC &dc, class wxLayoutList *llist);
virtual void Draw(wxDC &dc, wxPoint const &coords,
class wxLayoutList *wxllist,
CoordType begin = -1,
@ -277,16 +278,34 @@ private:
wxBitmap *m_Icon;
};
/// for export to html:
/** This structure holds all formatting information. Members which are
undefined (for a CmdObject this means: no change), are set to -1.
*/
struct wxLayoutStyleInfo
{
wxLayoutStyleInfo()
wxLayoutStyleInfo(int ifamily = -1,
int isize = -1,
int istyle = -1,
int iweight = -1,
int iul = -1,
wxColour *fg = NULL,
wxColour *bg = NULL);
wxColour * GetBGColour() const
{
family = -1; // this marks the styleinfo as uninitialised
return fg_valid ? new
wxColour(bg_red,bg_green,bg_blue)
: wxWHITE;
}
int size, family, style, weight;
bool underline;
wxFont *GetFont(wxLayoutStyleInfo *);
/// Font change parameters.
int size, family, style, weight, underline;
/// Is foreground colour valid to bet set?
bool fg_valid;
/// Is background colour valid to bet set?
bool bg_valid;
/// Foreground colour RGB values.
unsigned fg_red, fg_green, fg_blue;
/// Background colour RGB values.
unsigned bg_red, bg_green, bg_blue;
};
@ -301,29 +320,28 @@ class wxLayoutObjectCmd : public wxLayoutObject
{
public:
virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_CMD; }
virtual void Layout(wxDC &dc);
virtual void Layout(wxDC &dc, class wxLayoutList *llist);
virtual void Draw(wxDC &dc, wxPoint const &coords,
class wxLayoutList *wxllist,
CoordType begin = -1,
CoordType end = -1);
wxLayoutObjectCmd(int size, int family, int style, int weight,
bool underline,
wxColour &fg, wxColour &bg);
wxLayoutObjectCmd(int size = -1,
int family = -1,
int style = -1,
int weight = -1,
int underline = -1,
wxColour *fg = NULL,
wxColour *bg = NULL);
~wxLayoutObjectCmd();
/** Stores the current style in the styleinfo structure */
void GetStyle(wxLayoutStyleInfo *si) const;
/// return the background colour for setting colour of window
wxColour &GetBGColour(void) { return m_ColourBG; }
wxLayoutStyleInfo * GetStyle(void) const;
/** Makes a copy of this object.
*/
virtual wxLayoutObject *Copy(void);
private:
/// the font to use
wxFont *m_font;
/// foreground colour
wxColour m_ColourFG;
/// background colour
wxColour m_ColourBG;
wxLayoutStyleInfo *m_StyleInfo;
};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@ -748,16 +766,13 @@ public:
{ SetFont(-1,-1,-1,-1,-1,fg,bg); }
/// Used by wxLayoutObjectCmd only:
void SetColour_Internal(wxColour *fg, wxColour *bg)
{ if(fg) m_ColourFG = *fg; if(bg) m_ColourBG = *bg; }
/**
Returns a pointer to the default settings.
This is only valid temporarily and should not be stored
anywhere.
@return the default settings of the list
*/
wxLayoutObjectCmd *GetDefaults(void) { return m_DefaultSetting ; }
wxLayoutStyleInfo *GetDefaults(void) { return m_DefaultSetting ; }
//@}
/**@name Drawing */
@ -859,6 +874,8 @@ public:
/// Return the selection as a wxLayoutList:
wxLayoutList *GetSelection(void);
/// Delete selected bit
void DeleteSelection(void);
wxLayoutList *Copy(const wxPoint &from = wxPoint(0,0),
const wxPoint &to = wxPoint(-1,-1));
@ -878,7 +895,9 @@ public:
*/
int IsSelected(const wxLayoutLine *line, CoordType *from, CoordType *to);
void ApplyStyle(wxLayoutStyleInfo *si, wxDC &dc);
#ifdef WXLAYOUT_DEBUG
void Debug(void);
#endif
@ -924,7 +943,9 @@ private:
wxColour m_ColourFG;
wxColour m_ColourBG;
/// the default setting:
wxLayoutObjectCmd *m_DefaultSetting;
wxLayoutStyleInfo *m_DefaultSetting;
/// the current setting:
wxLayoutStyleInfo m_CurrentSetting;
//@}
};

View File

@ -71,23 +71,27 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
static char buffer[20];
wxString html;
wxLayoutStyleInfo si;
cmd.GetStyle(&si);
wxLayoutStyleInfo *si = cmd.GetStyle();
int size, sizecount;
html += "<font ";
html +="color=";
sprintf(buffer,"\"#%02X%02X%02X\"", si.fg_red,si.fg_green,si.fg_blue);
html += buffer;
if(si->fg_valid)
{
html +="color=";
sprintf(buffer,"\"#%02X%02X%02X\"", si->fg_red,si->fg_green,si->fg_blue);
html += buffer;
}
html += " bgcolor=";
sprintf(buffer,"\"#%02X%02X%02X\"", si.bg_red,si.bg_green,si.bg_blue);
html += buffer;
switch(si.family)
if(si->bg_valid)
{
html += " bgcolor=";
sprintf(buffer,"\"#%02X%02X%02X\"", si->bg_red,si->bg_green,si->bg_blue);
html += buffer;
}
switch(si->family)
{
case wxSWISS:
case wxMODERN:
@ -101,12 +105,12 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
}
size = BASE_SIZE; sizecount = 0;
while(size < si.size && sizecount < 5)
while(size < si->size && sizecount < 5)
{
sizecount ++;
size = (size*12)/10;
}
while(size > si.size && sizecount > -5)
while(size > si->size && sizecount > -5)
{
sizecount --;
size = (size*10)/12;
@ -120,28 +124,28 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
if(styleInfo != NULL)
html ="</font>"+html; // terminate any previous font command
if((si.weight == wxBOLD) && ( (!styleInfo) || (styleInfo->weight != wxBOLD)))
if((si->weight == wxBOLD) && ( (!styleInfo) || (styleInfo->weight != wxBOLD)))
html += "<b>";
else
if(si.weight != wxBOLD && ( styleInfo && (styleInfo->weight == wxBOLD)))
if(si->weight != wxBOLD && ( styleInfo && (styleInfo->weight == wxBOLD)))
html += "</b>";
if(si.style == wxSLANT)
si.style = wxITALIC; // the same for html
if(si->style == wxSLANT)
si->style = wxITALIC; // the same for html
if((si.style == wxITALIC) && ( (!styleInfo) || (styleInfo->style != wxITALIC)))
if((si->style == wxITALIC) && ( (!styleInfo) || (styleInfo->style != wxITALIC)))
html += "<i>";
else
if(si.style != wxITALIC && ( styleInfo && (styleInfo->style == wxITALIC)))
if(si->style != wxITALIC && ( styleInfo && (styleInfo->style == wxITALIC)))
html += "</i>";
if(si.underline && ( (!styleInfo) || ! styleInfo->underline))
if(si->underline && ( (!styleInfo) || ! styleInfo->underline))
html += "<u>";
else if(si.underline == false && ( styleInfo && styleInfo->underline))
else if(si->underline == false && ( styleInfo && styleInfo->underline))
html += "</u>";
*styleInfo = si; // update last style info
*styleInfo = *si; // update last style info
return html;
}
@ -150,7 +154,7 @@ wxString wxLayoutExportCmdAsHTML(wxLayoutObjectCmd const & cmd,
wxLayoutExportStatus::wxLayoutExportStatus(wxLayoutList *list)
{
list->GetDefaults()->GetStyle(&m_si);
m_si = *list->GetDefaults();
m_line = list->GetFirstLine();
m_iterator = m_line->GetFirstObject();
}

View File

@ -105,6 +105,28 @@ wxLayoutWindow::~wxLayoutWindow()
SetBackgroundBitmap(NULL);
}
void
wxLayoutWindow::Clear(int family,
int size,
int style,
int weight,
int underline,
wxColour *fg,
wxColour *bg)
{
GetLayoutList()->Clear(family,size,style,weight,underline,fg,bg);
SetBackgroundColour(*GetLayoutList()->GetDefaults()->GetBGColour());
ResizeScrollbars(true);
SetDirty();
SetModified(false);
wxRect r;
int w,h;
r.x = r.y = 0; GetSize(&w,&h);
r.width = w;
r.height = h;
DoPaint(&r);
}
#ifdef __WXMSW__
long
wxLayoutWindow::MSWGetDlgCode()
@ -193,40 +215,35 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
void
wxLayoutWindow::OnChar(wxKeyEvent& event)
{
int keyCode = event.KeyCode();
#ifdef WXLAYOUT_DEBUG
if(event.KeyCode() == WXK_F1)
if(keyCode == WXK_F1)
{
m_llist->Debug();
return;
}
#endif
long keyCode = event.KeyCode();
if(m_Selecting && ! event.ShiftDown())
if(! m_Selecting && event.ShiftDown())
{
m_llist->EndSelection();
m_Selecting = false;
}
else
if(! m_Selecting && event.ShiftDown())
switch(keyCode)
{
switch(keyCode)
{
case WXK_UP:
case WXK_DOWN:
case WXK_RIGHT:
case WXK_LEFT:
case WXK_PRIOR:
case WXK_NEXT:
case WXK_HOME:
case WXK_END:
m_Selecting = true;
m_llist->StartSelection();
break;
default:
;
}
case WXK_UP:
case WXK_DOWN:
case WXK_RIGHT:
case WXK_LEFT:
case WXK_PRIOR:
case WXK_NEXT:
case WXK_HOME:
case WXK_END:
m_Selecting = true;
m_llist->StartSelection();
break;
default:
;
}
}
/* These two nested switches work like this:
The first one processes all non-editing keycodes, to move the
@ -348,6 +365,17 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
SetModified();
}// if(IsEditable())
}// first switch()
if(m_Selecting)
{
if(event.ShiftDown())
m_llist->ContinueSelection();
else
{
m_llist->EndSelection();
m_Selecting = false;
}
}
ScrollToCursor();
wxRect r = *m_llist->GetUpdateRect();
DoPaint(&r);
@ -445,8 +473,10 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
updateRect->y+updateRect->height));
if(IsDirty())
{
//FIXME m_llist->Layout(dc);
ResizeScrollbars();
}
/* Check whether the window has grown, if so, we need to reallocate
the bitmap to be larger. */
if(x1 > m_bitmapSize.x || y1 > m_bitmapSize.y)
@ -462,8 +492,8 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
}
m_memDC->SetDeviceOrigin(0,0);
m_memDC->SetBrush(wxBrush(m_llist->GetDefaults()->GetBGColour(),wxSOLID));
m_memDC->SetPen(wxPen(m_llist->GetDefaults()->GetBGColour(),
m_memDC->SetBrush(wxBrush(*m_llist->GetDefaults()->GetBGColour(),wxSOLID));
m_memDC->SetPen(wxPen(*m_llist->GetDefaults()->GetBGColour(),
0,wxTRANSPARENT));
m_memDC->SetLogicalFunction(wxCOPY);
@ -489,10 +519,12 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
/* This is the important bit: we tell the list to draw itself: */
#if WXLO_DEBUG_URECT
WXLO_DEBUG(("Update rect: %ld,%ld / %ld,%ld",
updateRect->x, updateRect->y,
updateRect->x+updateRect->width,
updateRect->y+updateRect->height));
#endif
// Device origins on the memDC are suspect, we translate manually
// with the translate parameter of Draw().
@ -592,6 +624,13 @@ wxLayoutWindow::Paste(void)
bool
wxLayoutWindow::Copy(void)
{
// Calling GetSelection() will automatically do an EndSelection()
// on the list, but we need to take a note of it, too:
if(m_Selecting)
{
m_Selecting = false;
m_llist->EndSelection();
}
wxLayoutList *llist = m_llist->GetSelection();
if(! llist)
return FALSE;
@ -606,6 +645,16 @@ wxLayoutWindow::Copy(void)
delete export;
}
delete llist;
// The exporter always appends a newline, so we chop it off if it
// is there:
{
size_t len = text.Length();
if(len > 2 && text[len-2] == '\r') // Windows
text = text.Mid(0,len-2);
else if(len > 1 && text[len-1] == '\n')
text = text.Mid(0,len-1);
}
// Read some text
if (wxTheClipboard->Open())
@ -618,6 +667,18 @@ wxLayoutWindow::Copy(void)
return FALSE;
}
bool
wxLayoutWindow::Cut(void)
{
if(Copy())
{
m_llist->DeleteSelection();
return TRUE;
}
else
return FALSE;
}
wxMenu *
wxLayoutWindow::MakeFormatMenu()
{

View File

@ -65,20 +65,7 @@ public:
int weight=wxNORMAL,
int underline=0,
wxColour *fg=NULL,
wxColour *bg=NULL)
{
GetLayoutList()->Clear(family,size,style,weight,underline,fg,bg);
SetBackgroundColour(GetLayoutList()->GetDefaults()->GetBGColour());
ResizeScrollbars(true);
SetDirty();
SetModified(false);
wxRect r;
int w,h;
r.x = r.y = 0; GetSize(&w,&h);
r.width = w;
r.height = h;
DoPaint(&r);
}
wxColour *bg=NULL);
/** Sets a background image, only used on screen, not on printouts.
@param bitmap a pointer to a wxBitmap or NULL to remove it
*/
@ -95,6 +82,8 @@ public:
void Paste(void);
/// Copies selection to clipboard.
bool Copy(void);
/// Copies selection to clipboard and deletes it.
bool Cut(void);
//@}