- 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
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 };
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" );
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:
{
# define SHOW_SELECTIONS 1
#else
# include "wxllist.h"
+# include "wxlparser.h"
# define SHOW_SELECTIONS 1
#endif
}
void
-wxLayoutObjectText::Layout(wxDC &dc)
+wxLayoutObjectText::Layout(wxDC &dc, class wxLayoutList * )
{
long descent = 0l;
}
void
-wxLayoutObjectIcon::Layout(wxDC & /* dc */)
+wxLayoutObjectIcon::Layout(wxDC & /* dc */, class wxLayoutList * )
{
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 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
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);
}
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 )
{
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
for(i = m_ObjectList.begin(); i != NULLIT; i++)
{
- (**i).Layout(dc);
+ (**i).Layout(dc, llist);
size = (**i).GetSize(&objTopHeight, &objBottomHeight);
if(cursorPos && ! cursorFound)
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
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
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);
}
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;
}
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;
}
m_FirstLine = m_CursorLine->GetPreviousLine();
m_CursorPos.y++;
m_CursorPos.x = 0;
+ m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
LineBreak();
Delete(1); // delete the space
m_CursorPos.x = newpos;
+ m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return true;
}
}
}
}
while(left);
+ m_CursorLine->RecalculatePositions(true, this); //FIXME needed?
return left == 0;
}
// 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
// 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)
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);
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();
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)
{
// 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);
}
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
# define WXLO_TRACE(x)
#endif
-
+#define WXLO_DEBUG_URECT 0
#ifndef WXLO_DEFAULTFONTSIZE
# define WXLO_DEFAULTFONTSIZE 12
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
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,
~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,
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;
};
{
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;
};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
{ 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 */
/// 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));
*/
int IsSelected(const wxLayoutLine *line, CoordType *from, CoordType *to);
-
+
+
+ void ApplyStyle(wxLayoutStyleInfo *si, wxDC &dc);
#ifdef WXLAYOUT_DEBUG
void Debug(void);
#endif
wxColour m_ColourFG;
wxColour m_ColourBG;
/// the default setting:
- wxLayoutObjectCmd *m_DefaultSetting;
+ wxLayoutStyleInfo *m_DefaultSetting;
+ /// the current setting:
+ wxLayoutStyleInfo m_CurrentSetting;
//@}
};
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;
-
-
- html += " bgcolor=";
- sprintf(buffer,"\"#%02X%02X%02X\"", si.bg_red,si.bg_green,si.bg_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;
+ }
- 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:
}
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;
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;
}
wxLayoutExportStatus::wxLayoutExportStatus(wxLayoutList *list)
{
- list->GetDefaults()->GetStyle(&m_si);
+ m_si = *list->GetDefaults();
m_line = list->GetFirstLine();
m_iterator = m_line->GetFirstObject();
}
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()
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
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);
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)
}
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);
/* 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().
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;
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())
return FALSE;
}
+bool
+wxLayoutWindow::Cut(void)
+{
+ if(Copy())
+ {
+ m_llist->DeleteSelection();
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
wxMenu *
wxLayoutWindow::MakeFormatMenu()
{
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
*/
void Paste(void);
/// Copies selection to clipboard.
bool Copy(void);
+ /// Copies selection to clipboard and deletes it.
+ bool Cut(void);
//@}