updated richedit and nettest

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3915 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Karsten Ballüder
1999-10-10 16:52:34 +00:00
parent 2726c66d5b
commit 89be8239db
10 changed files with 650 additions and 442 deletions

View File

@@ -2947,11 +2947,13 @@ AC_OUTPUT([
samples/listctrl/Makefile
samples/mdi/Makefile
samples/minifram/Makefile
samples/minimal/Makefile
samples/minimal/Makefile
samples/nettest/Makefile
samples/newgrid/Makefile
samples/notebook/Makefile
samples/printing/Makefile
samples/proplist/Makefile
samples/proplist/Makefile
samples/richedit/Makefile
samples/sashtest/Makefile
samples/scroll/Makefile
samples/splitter/Makefile

View File

@@ -183,6 +183,7 @@ typedef void (wxObject::*wxDialUpEventFunction)(wxDialUpEvent&);
#define EVT_DIALUP_CONNECTED(func) { wxEVT_DIALUP_CONNECTED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxDialUpEventFunction) & func, NULL},
#define EVT_DIALUP_DISCONNECTED(func) { wxEVT_DIALUP_DISCONNECTED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxDialUpEventFunction) & func, NULL},
#endif // wxUSE_DIALUP_MANAGER
#endif // _WX_NET_H

View File

@@ -0,0 +1,21 @@
#
# File: makefile.unx
# Author: Julian Smart
# Created: 1998
# Updated:
# Copyright: (c) 1998 Julian Smart
#
# "%W% %G%"
#
# Makefile for richedit example (UNIX).
top_srcdir = @top_srcdir@
top_builddir = ../..
program_dir = samples/richedit
PROGRAM=wxLayout
OBJECTS=$(PROGRAM).o kbList.o wxllist.o wxlparser.o wxlwindow.o
include ../../src/makeprog.env

View File

@@ -19,6 +19,7 @@
#include "wxLayout.h"
#include <wx/textfile.h>
#include <iostream.h>
#include "Micon.xpm"
@@ -299,10 +300,12 @@ void MyFrame::OnCommand( wxCommandEvent &event )
m_lwin->Cut();
m_lwin->Refresh(FALSE);
break;
#ifdef M_BASEDIR
case ID_FIND:
m_lwin->Find("void");
m_lwin->Refresh(FALSE);
break;
#endif
case ID_HTML:
{
wxLayoutExportObject *export;

View File

@@ -34,6 +34,7 @@
#include "Mpch.h"
#ifdef M_BASEDIR
# include "Mcommon.h"
# include "gui/wxllist.h"
# include "gui/wxlparser.h"
# define SHOW_SELECTIONS 1
@@ -375,7 +376,22 @@ wxLayoutObjectText::Debug(void)
wxLayoutObjectIcon::wxLayoutObjectIcon(wxBitmap const &icon)
{
if ( !icon.Ok() )
{
wxFAIL_MSG("invalid icon");
m_Icon = NULL;
return;
}
#ifdef __WXMSW__
// FIXME ugly, ugly, ugly - but the only way to avoid slicing
m_Icon = icon.GetHBITMAP() ? new wxBitmap(icon)
: new wxBitmap(wxBitmap((const wxBitmap &)icon));
#else // !MSW
m_Icon = new wxBitmap(icon);
#endif // MSW/!MSW
}
@@ -634,6 +650,7 @@ wxLayoutLine::wxLayoutLine(wxLayoutLine *prev, wxLayoutList *llist)
m_LineNumber = 0;
RecalculatePosition(llist);
MarkDirty();
if(m_Previous)
{
m_LineNumber = m_Previous->GetLineNumber() + 1;
@@ -644,8 +661,7 @@ wxLayoutLine::wxLayoutLine(wxLayoutLine *prev, wxLayoutList *llist)
if(m_Next)
{
m_Next->m_Previous = this;
m_Next->MoveLines(+1);
m_Next->RecalculatePositions(1,llist);
m_Next->ReNumber();
}
m_StyleInfo = llist->GetDefaultStyleInfo();
@@ -687,28 +703,6 @@ wxLayoutLine::RecalculatePosition(wxLayoutList *llist)
return m_Position;
}
void
wxLayoutLine::RecalculatePositions(int recurse, wxLayoutList *llist)
{
//FIXME: is this really needed? We run Layout() anyway.
// Recursing here, drives computation time up exponentially, as
// each line will cause all following lines to be recalculated.
// Yes, or linenumbers go wrong.
wxASSERT(recurse >= 0);
wxPoint pos = m_Position;
CoordType height = m_Height;
// WXLO_TRACE("RecalculatePositions()");
RecalculatePosition(llist);
if(m_Next)
{
if(recurse > 0)
m_Next->RecalculatePositions(--recurse, llist);
else if(pos != m_Position || m_Height != height)
m_Next->RecalculatePositions(0, llist);
}
}
wxLayoutObjectList::iterator
wxLayoutLine::FindObject(CoordType xpos, CoordType *offset) const
@@ -823,11 +817,6 @@ wxLayoutLine::Insert(CoordType xpos, wxLayoutObject *obj)
MarkDirty(xpos);
// If we insert a command object, we need to recalculate all lines
// to update their styleinfo structure.
if(obj->GetType() == WXLO_TYPE_CMD)
MarkNextDirty(-1);
CoordType offset;
wxLOiterator i = FindObject(xpos, &offset);
if(i == NULLIT)
@@ -923,10 +912,6 @@ wxLayoutLine::Delete(CoordType xpos, CoordType npos)
len = (**i).GetLength();
m_Length -= len;
npos -= len;
// If we delete a command object, we need to recalculate all lines
// to update their styleinfo structure.
if((**i).GetType() == WXLO_TYPE_CMD)
MarkNextDirty(-1);
m_ObjectList.erase(i);
}
else
@@ -963,18 +948,6 @@ wxLayoutLine::Delete(CoordType xpos, CoordType npos)
return npos;
}
void
wxLayoutLine::MarkNextDirty(int recurse)
{
wxLayoutLine *line = GetNextLine();
while(line && (recurse == -1 || recurse >= 0))
{
line->MarkDirty();
line = line->GetNextLine();
if(recurse > 0) recurse --;
}
}
bool
wxLayoutLine::DeleteWord(CoordType xpos)
{
@@ -1032,28 +1005,15 @@ wxLayoutLine::DeleteLine(bool update, wxLayoutList *llist)
if(m_Previous)
m_Previous->m_Next = m_Next;
// get the line numbers right again
if ( update && m_Next)
m_Next->ReNumber();
MarkDirty();
// we can't use m_Next after "delete this", so we must save this pointer
// first
wxLayoutLine *next = m_Next;
if ( next )
{
// get the line numbers right again
next->MoveLines(-1);
}
if(update)
{
if ( next )
next->RecalculatePositions(1, llist);
/* We assume that if we have more than one object in the list,
this means that we have a command object, so we need to
update the following lines. */
if(m_ObjectList.size() > 1 ||
( m_ObjectList.begin() != NULLIT &&
(**m_ObjectList.begin()).GetType() == WXLO_TYPE_CMD)
)
MarkNextDirty(-1);
}
delete this;
llist->DecNumLines();
@@ -1138,6 +1098,8 @@ wxLayoutLine::Layout(wxDC &dc,
bool cursorFound = false;
RecalculatePosition(llist);
if(cursorPos)
{
*cursorPos = m_Position;
@@ -1250,10 +1212,9 @@ wxLayoutLine::Layout(wxDC &dc,
// tell next line about coordinate change
if(m_Next && m_Height != heightOld)
{
// FIXME isn't this done in RecalculatePositions() below anyhow?
m_Next->RecalculatePositions(0, llist);
m_Next->MarkDirty();
}
// We need to check whether we found a valid cursor size:
if(cursorPos && cursorSize)
{
@@ -1269,7 +1230,6 @@ wxLayoutLine::Layout(wxDC &dc,
if(m_BaseLine >= cursorSize->y) // the normal case anyway
cursorPos->y += m_BaseLine-cursorSize->y;
}
RecalculatePositions(1, llist);
MarkClean();
}
@@ -1281,24 +1241,6 @@ wxLayoutLine::Break(CoordType xpos, wxLayoutList *llist)
MarkDirty(xpos);
/* If we are at the begin of a line, we want to move all other
lines down and stay with the cursor where we are. However, if we
are in an empty line, we want to move down with it. */
if(xpos == 0 && GetLength() > 0)
{ // insert an empty line before this one
wxLayoutLine *prev = new wxLayoutLine(m_Previous, llist);
if(m_Previous == NULL)
{ // We were in first line, need to link in new empty line
// before this.
prev->m_Next = this;
m_Previous = prev;
m_Previous->m_Height = 0; // this is a wild guess
}
if(m_Next)
m_Next->RecalculatePositions(1, llist);
return m_Previous;
}
CoordType offset;
wxLOiterator i = FindObject(xpos, &offset);
if(i == NULLIT)
@@ -1335,10 +1277,20 @@ wxLayoutLine::Break(CoordType xpos, wxLayoutList *llist)
m_ObjectList.remove(i); // remove without deleting it
}
if(m_Next)
m_Next->RecalculatePositions(2, llist);
m_Next->MarkDirty();
return newLine;
}
void
wxLayoutLine::ReNumber(void)
{
CoordType lineNo = m_Previous ? m_Previous->m_LineNumber+1 : 0;
m_LineNumber = lineNo++;
for(wxLayoutLine *next = GetNextLine();
next; next = next->GetNextLine())
next->m_LineNumber = lineNo++;
}
void
wxLayoutLine::MergeNextLine(wxLayoutList *llist)
@@ -1380,7 +1332,7 @@ wxLayoutLine::MergeNextLine(wxLayoutList *llist)
SetNext(nextLine);
if ( nextLine )
{
nextLine->MoveLines(-1);
nextLine->ReNumber();
}
else
{
@@ -1554,12 +1506,15 @@ wxLayoutList::wxLayoutList()
m_numLines = 0;
m_FirstLine = NULL;
SetAutoFormatting(TRUE);
ForceTotalLayout(TRUE); // for the first time, do all
InvalidateUpdateRect();
Clear();
}
wxLayoutList::~wxLayoutList()
{
SetAutoFormatting(FALSE);
InternalClear();
Empty();
m_FirstLine->DeleteLine(false, this);
@@ -1753,7 +1708,7 @@ wxLayoutList::MoveCursorVertically(int n)
if(! m_CursorLine)
{
m_CursorLine = last;
m_CursorPos.y ++;
m_CursorPos.y --;
rc = false;
}
else
@@ -1992,7 +1947,8 @@ wxLayoutList::Insert(wxString const &text)
m_movedCursor = true;
m_CursorLine->RecalculatePositions(0, this);
if(m_AutoFormat)
m_CursorLine->MarkDirty();
return true;
}
@@ -2011,7 +1967,8 @@ wxLayoutList::Insert(wxLayoutObject *obj)
m_CursorPos.x += obj->GetLength();
m_movedCursor = true;
m_CursorLine->RecalculatePositions(0, this);
if(m_AutoFormat)
m_CursorLine->MarkDirty();
return true;
}
@@ -2094,7 +2051,7 @@ wxLayoutList::WrapLine(CoordType column)
Delete(1); // delete the space
m_CursorPos.x = newpos;
m_CursorLine->RecalculatePositions(1, this);
m_CursorLine->MarkDirty();
m_movedCursor = true;
@@ -2197,7 +2154,8 @@ wxLayoutList::DeleteLines(int n)
{ // we cannot delete this line, but we can clear it
MoveCursorToBeginOfLine();
DeleteToEndOfLine();
m_CursorLine->RecalculatePositions(2, this);
if(m_AutoFormat)
m_CursorLine->MarkDirty();
return n-1;
}
//else:
@@ -2208,13 +2166,16 @@ wxLayoutList::DeleteLines(int n)
wxASSERT(m_FirstLine);
wxASSERT(m_CursorLine);
}
m_CursorLine->RecalculatePositions(2, this);
if(m_AutoFormat)
m_CursorLine->MarkDirty();
return n;
}
void
wxLayoutList::Recalculate(wxDC &dc, CoordType bottom)
{
if(! m_AutoFormat)
return;
wxLayoutLine *line = m_FirstLine;
// first, make sure everything is calculated - this might not be
@@ -2230,7 +2191,7 @@ wxLayoutList::Recalculate(wxDC &dc, CoordType bottom)
}
wxPoint
wxLayoutList::GetCursorScreenPos(wxDC &dc)
wxLayoutList::GetCursorScreenPos(void) const
{
return m_CursorScreenPos;
}
@@ -2247,18 +2208,39 @@ wxLayoutList::Layout(wxDC &dc, CoordType bottom, bool forceAll,
// needed, optimise it later
ApplyStyle(m_DefaultStyleInfo, dc);
// This one we always Layout() to get the current cursor
// coordinates on the screen:
m_CursorLine->MarkDirty();
bool wasDirty = false;
if(m_ReLayoutAll)
{
forceAll = TRUE;
bottom = -1;
}
ForceTotalLayout(FALSE);
// If one line was dirty, we need to re-calculate all
// following lines, too.
bool wasDirty = forceAll;
wxLayoutLine *line = m_FirstLine;
while(line)
{
if(! wasDirty)
ApplyStyle(line->GetStyleInfo(), dc);
if(forceAll || line->IsDirty()
|| (cpos && line->GetLineNumber() == cpos->y))
if(
// if any previous line was dirty, we need to layout all
// following lines:
wasDirty
// layout dirty lines:
|| line->IsDirty()
// always layout the cursor line toupdate the cursor
// position and size:
|| line == m_CursorLine
// or if it's the line we are asked to look for:
|| (cpos && line->GetLineNumber() == cpos->y)
)
{
if(line->IsDirty())
wasDirty = true;
// The following Layout() calls will update our
// m_CurrentStyleInfo if needed.
if(line == m_CursorLine)
@@ -2275,7 +2257,7 @@ wxLayoutList::Layout(wxDC &dc, CoordType bottom, bool forceAll,
if ( csize )
*csize = m_CursorSize;
}
}
}
else
if(cpos && line->GetLineNumber() == cpos->y)
line->Layout(dc, this,
@@ -2286,16 +2268,16 @@ wxLayoutList::Layout(wxDC &dc, CoordType bottom, bool forceAll,
// little condition to speed up redrawing:
if(bottom != -1 && line->GetPosition().y > bottom)
break;
wasDirty = true;
}
line->RecalculatePositions(1, this);
line = line->GetNextLine();
}
#ifndef WXLAYOUT_USE_CARET
// can only be 0 if we are on the first line and have no next line
wxASSERT(m_CursorSize.x != 0 || (m_CursorLine &&
m_CursorLine->GetNextLine() == NULL &&
m_CursorLine == m_FirstLine));
#endif // WXLAYOUT_USE_CARET
AddCursorPosToUpdateRect();
}
@@ -2311,7 +2293,8 @@ void
wxLayoutList::Draw(wxDC &dc,
wxPoint const &offset,
CoordType top,
CoordType bottom)
CoordType bottom,
bool clipStrictly)
{
wxLayoutLine *line = m_FirstLine;
@@ -2332,29 +2315,27 @@ wxLayoutList::Draw(wxDC &dc,
m_Selection.m_discarded = false;
}
/* We need to re-layout all dirty lines to update styleinfos
etc. However, somehow we don't find all dirty lines... */
Layout(dc); //,-1,true); //FIXME
/* This call to Layout() will re-calculate and update all lines
marked as dirty.
*/
Layout(dc, bottom);
ApplyStyle(m_DefaultStyleInfo, dc);
wxBrush brush(m_CurrentStyleInfo.m_bg, wxSOLID);
dc.SetBrush(brush);
dc.SetBackgroundMode(wxTRANSPARENT);
bool style_set = false;
while(line)
{
// only draw if between top and bottom:
if((top == -1 ||
line->GetPosition().y + line->GetHeight() > top))
{
// if(! style_set)
{
ApplyStyle(line->GetStyleInfo(), dc);
style_set = true;
}
ApplyStyle(line->GetStyleInfo(), dc);
// little condition to speed up redrawing:
if(bottom != -1
&& line->GetPosition().y+line->GetHeight() >= bottom)
if( bottom != -1
&& line->GetPosition().y
+(clipStrictly ? line->GetHeight() : 0) >= bottom)
break;
line->Draw(dc, this, offset);
}
@@ -2540,17 +2521,17 @@ wxLayoutList::ContinueSelection(const wxPoint& cposOrig, const wxPoint& spos)
wxASSERT(m_Selection.m_valid == false);
WXLO_DEBUG(("Continuing selection at %ld/%ld", cpos.x, cpos.y));
if ( m_Selection.m_CursorB <= cpos )
{
m_Selection.m_ScreenB = spos;
m_Selection.m_CursorB = cpos;
}
else
{
m_Selection.m_ScreenA = spos;
m_Selection.m_CursorA = cpos;
}
m_Selection.m_CursorB = cpos;}
void
wxLayoutList::EndSelection(const wxPoint& cposOrig, const wxPoint& spos)
{
wxPoint cpos(cposOrig);
if(cpos.x == -1)
cpos = m_CursorPos;
ContinueSelection(cpos);
WXLO_DEBUG(("Ending selection at %ld/%ld", cpos.x, cpos.y));
// we always want m_CursorA <= m_CursorB!
if( m_Selection.m_CursorA > m_Selection.m_CursorB )
{
@@ -2563,18 +2544,12 @@ wxLayoutList::ContinueSelection(const wxPoint& cposOrig, const wxPoint& spos)
m_Selection.m_ScreenB = m_Selection.m_ScreenA;
m_Selection.m_ScreenA = help;
}
}
void
wxLayoutList::EndSelection(const wxPoint& cposOrig, const wxPoint& spos)
{
wxPoint cpos(cposOrig);
if(cpos.x == -1)
cpos = m_CursorPos;
ContinueSelection(cpos);
WXLO_DEBUG(("Ending selection at %ld/%ld", cpos.x, cpos.y));
m_Selection.m_selecting = false;
m_Selection.m_valid = true;
/// In case we just clicked somewhere, the selection will have zero
/// size, so we discard it immediately.
if(m_Selection.m_CursorA == m_Selection.m_CursorB)
DiscardSelection();
}
void
@@ -2600,7 +2575,12 @@ wxLayoutList::IsSelected(const wxPoint &cursor) const
if ( !HasSelection() )
return false;
return m_Selection.m_CursorA <= cursor && cursor <= m_Selection.m_CursorB;
return (
(m_Selection.m_CursorA <= cursor
&& cursor <= m_Selection.m_CursorB)
|| (m_Selection.m_CursorB <= cursor
&& cursor <= m_Selection.m_CursorA)
);
}
@@ -2620,7 +2600,10 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
return 0;
CoordType y = line->GetLineNumber();
if(m_Selection.m_CursorA.y < y && m_Selection.m_CursorB.y > y)
if(
(m_Selection.m_CursorA.y < y && m_Selection.m_CursorB.y > y)
|| (m_Selection.m_CursorB.y < y && m_Selection.m_CursorA.y > y)
)
return 1;
else if(m_Selection.m_CursorA.y == y)
{
@@ -2628,7 +2611,18 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
if(m_Selection.m_CursorB.y == y)
*to = m_Selection.m_CursorB.x;
else
*to = line->GetLength();
{
if(m_Selection.m_CursorB > m_Selection.m_CursorA)
*to = line->GetLength();
else
*to = 0;
}
if(*to < *from)
{
CoordType help = *to;
*to = *from;
*from = help;
}
return -1;
}
else if(m_Selection.m_CursorB.y == y)
@@ -2637,7 +2631,18 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
if(m_Selection.m_CursorA.y == y)
*from = m_Selection.m_CursorA.x;
else
*from = 0;
{
if(m_Selection.m_CursorB > m_Selection.m_CursorA)
*from = 0;
else
*from = line->GetLength();
}
if(*to < *from)
{
CoordType help = *to;
*to = *from;
*from = help;
}
return -1;
}
else
@@ -2665,7 +2670,10 @@ wxLayoutList::DeleteSelection(void)
wxLayoutLine
* firstLine = GetLine(m_Selection.m_CursorA.y),
* lastLine = GetLine(m_Selection.m_CursorB.y);
// be a bit paranoid:
if(! firstLine || ! lastLine)
return;
// First, delete what's left of this line:
MoveCursorTo(m_Selection.m_CursorA);
DeleteToEndOfLine();
@@ -2682,7 +2690,7 @@ wxLayoutList::DeleteSelection(void)
// Recalculate the line positions and numbers but notice that firstLine
// might not exist any more - it could be deleted by Delete(1) above
wxLayoutLine *firstLine2 = prevLine ? prevLine->GetNextLine() : m_FirstLine;
firstLine2->RecalculatePositions(1, this);
firstLine2->MarkDirty();
}
/// Starts highlighting the selection
@@ -2708,6 +2716,37 @@ wxLayoutList::EndHighlighting(wxDC &dc)
}
wxLayoutLine *
wxLayoutList::GetLine(CoordType index) const
{
wxASSERT_MSG( (0 <= index) && (index < (CoordType)m_numLines),
"invalid index" );
wxLayoutLine *line;
CoordType n = index;
#ifdef DEBUG
CoordType lineNo = 0;
#endif
for ( line = m_FirstLine; line && n-- > 0; line =
line->GetNextLine() )
{
#ifdef DEBUG
wxASSERT(line->GetLineNumber() == lineNo );
lineNo++;
#endif
}
if ( line )
{
// should be the right one
wxASSERT( line->GetLineNumber() == index );
}
return line;
}
wxLayoutList *
wxLayoutList::Copy(const wxPoint &from,
const wxPoint &to)
@@ -2782,15 +2821,15 @@ wxLayoutList::GetSelection(wxLayoutDataObject *wxlo, bool invalidate)
{
wxString string;
wxLayoutExportObject *export;
wxLayoutExportObject *exp;
wxLayoutExportStatus status(llist);
while((export = wxLayoutExport( &status, WXLO_EXPORT_AS_OBJECTS)) != NULL)
while((exp = wxLayoutExport( &status, WXLO_EXPORT_AS_OBJECTS)) != NULL)
{
if(export->type == WXLO_EXPORT_EMPTYLINE)
if(exp->type == WXLO_EXPORT_EMPTYLINE)
; //FIXME missing support for linebreaks in string format
else
export->content.object->Write(string);
delete export;
exp->content.object->Write(string);
delete exp;
}
wxlo->SetData(string.c_str(), string.Length()+1);
@@ -2861,6 +2900,9 @@ wxLayoutPrintout::wxLayoutPrintout(wxLayoutList *llist,
// remove any highlighting which could interfere with printing:
m_llist->StartSelection();
m_llist->EndSelection();
// force a full layout of the list:
m_llist->ForceTotalLayout();
// layout is called in ScaleDC() when we have a DC
}
wxLayoutPrintout::~wxLayoutPrintout()
@@ -2927,14 +2969,15 @@ bool wxLayoutPrintout::OnPrintPage(int page)
{
int top, bottom;
top = (page - 1)*m_PrintoutHeight;
bottom = top + m_PrintoutHeight;
bottom = top + m_PrintoutHeight;
WXLO_DEBUG(("OnPrintPage(%d) printing from %d to %d", page, top,
bottom));
// SetDeviceOrigin() doesn't work here, so we need to manually
// translate all coordinates.
wxPoint translate(m_Offset.x,m_Offset.y-top);
m_llist->Draw(*dc, translate, top, bottom);
m_llist->Draw(*dc, translate, top, bottom, TRUE /* clip strictly
*/);
return true;
}
else
@@ -2947,14 +2990,19 @@ void wxLayoutPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom,
determine the correct paper size and scaling. We don't actually
print anything on it. */
#ifdef __WXMSW__
wxPrinterDC psdc("","",WXLLIST_TEMPFILE,false);
wxPrinterDC *psdc = new wxPrinterDC("","",WXLLIST_TEMPFILE,false);
#else
wxPostScriptDC psdc(WXLLIST_TEMPFILE,false);
wxPostScriptDC *psdc = new wxPostScriptDC(WXLLIST_TEMPFILE,false);
#endif
float scale = ScaleDC(&psdc);
psdc->StartDoc(m_title);
// before we draw anything, me must make sure the list is properly
// laid out
m_llist->Layout(*psdc);
psdc.GetSize(&m_PageWidth, &m_PageHeight);
float scale = ScaleDC(psdc);
psdc->GetSize(&m_PageWidth, &m_PageHeight);
// This sets a left/top origin of 15% and 5%:
m_Offset = wxPoint((15*m_PageWidth)/100, (5*m_PageHeight)/100);
@@ -2962,14 +3010,6 @@ void wxLayoutPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom,
// This is the length of the printable area.
m_PrintoutHeight = m_PageHeight - 2*m_Offset.y;
m_PrintoutHeight = (int)( m_PrintoutHeight / scale); // we want to use the real paper height
#if 0
// We should really use the margin settings of wxWindows somehow.
m_Offset = wxPoint(0,0);
// This is the length of the printable area.
m_PrintoutHeight = m_PageHeight;
m_PrintoutHeight = (int)( m_PrintoutHeight / scale); // we want to use the real paper height
#endif
m_NumOfPages = 1 +
(int)( m_llist->GetSize().y / (float)(m_PrintoutHeight));
@@ -2979,6 +3019,8 @@ void wxLayoutPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom,
*selPageFrom = 1;
*selPageTo = m_NumOfPages;
psdc->EndDoc();
delete psdc;
wxRemoveFile(WXLLIST_TEMPFILE);
}

View File

@@ -1,7 +1,7 @@
/*-*- c++ -*-********************************************************
* wxLayoutList.h - a formatted text rendering engine for wxWindows *
* *
* (C) 1999 by Karsten Ball<6C>der (Ballueder@usa.net) *
* (C) 1999 by Karsten Ball<6C>der (ballueder@gmx.net) *
* *
* $Id$
*******************************************************************/
@@ -28,6 +28,8 @@
# define WXMENU_LAYOUT_LCLICK 1111
# define WXMENU_LAYOUT_RCLICK 1112
# define WXMENU_LAYOUT_DBLCLICK 1113
#else // for Mahogany only:
# include "MObject.h"
#endif
// use the wxWindows caret class instead of home grown cursor whenever possible
@@ -96,6 +98,9 @@ class WXDLLEXPORT wxFont;
its size.
*/
class wxLayoutObject
#ifdef M_BASEDIR
: public MObject
#endif
{
public:
/** This structure can be used to contain data associated with the
@@ -210,6 +215,9 @@ public:
protected:
/// optional data for application's use
UserData *m_UserData;
#if defined (M_BASEDIR) && defined (DEBUG)
MOBJECT_NAME(wxLayoutObject)
#endif
};
/// Define a list type of wxLayoutObject pointers.
@@ -640,15 +648,6 @@ public:
CoordType GetHeight(void) const { return m_Height; }
/// Returns the width of this line.
CoordType GetWidth(void) const { return m_Width; }
/** This will recalculate the position and size of this line.
If called recursively it will abort if the position of an
object is unchanged, assuming that none of the following
objects need to move.
@param recurse if greater 0 then it will be used as the
minimum(!) recursion level, continue with all lines till the end of
the list or until the coordinates no longer changed.
*/
void RecalculatePositions(int recurse, wxLayoutList *llist);
/// Recalculates the position of this line on the canvas.
wxPoint RecalculatePosition(wxLayoutList *llist);
@@ -681,10 +680,6 @@ public:
m_Dirty = true;
}
/** Marks the following lines as dirty.
@param recurse if -1 recurse to end of list, otherwise depth of recursion.
*/
void MarkNextDirty(int recurse = 0);
/// Reset the dirty flag
void MarkClean() { m_Dirty = false; m_updateLeft = -1; }
@@ -699,17 +694,10 @@ private:
@param height new height
*/
void SetHeight(CoordType height, wxLayoutList *llist)
{ m_Height = height; RecalculatePositions(true, llist); }
{ m_Height = height; MarkDirty(); }
/** Moves the linenumbers one on, because a line has been inserted
or deleted.
@param delta either +1 or -1
*/
void MoveLines(int delta)
{
m_LineNumber += delta;
if(m_Next) m_Next->MoveLines(delta);
}
/** Updates the line numbers. */
void ReNumber(void);
//@}
private:
/// The line number.
@@ -776,6 +764,14 @@ public:
/// Empty: clear the list but leave font settings.
void Empty(void);
/** Enable or disable auto-formatting. Normally, while editing this
should be enabled which is the default. While
inserting/deleting lots of text, it makes sense to temporarily
disable this.
@param enable TRUE to enable, FALSE to disable
*/
void SetAutoFormatting(bool enable = TRUE)
{ m_AutoFormat = enable; }
/**@name Cursor Management */
//@{
/** Set new cursor position.
@@ -971,10 +967,13 @@ public:
@param offset an optional offset to shift printout
@param top optional y coordinate where to start drawing
@param bottom optional y coordinate where to stop drawing
@param clipStrictly if set, do not draw objects which reach
beyond "bottom". Set this when printing.
*/
void Draw(wxDC &dc,
const wxPoint &offset = wxPoint(0,0),
CoordType top = -1, CoordType bottom = -1);
CoordType top = -1, CoordType bottom = -1,
bool clipStrictly = false);
/** Calculates new layout for the list, like Draw() but does not
actually draw it.
@@ -989,6 +988,13 @@ public:
wxPoint *cpos = NULL,
wxPoint *csize = NULL);
/** Ensure that the whole list will be recalculate on the next call
to Layout() or Draw().
@param redrawAll TRUE or FALSE to reset it
*/
void ForceTotalLayout(bool redrawAll = TRUE)
{ m_ReLayoutAll = redrawAll; }
/** Returns the screen coordinates relating to a given cursor
position and the size of the cursor at that position.
@param dc for which to calculate it
@@ -1014,9 +1020,8 @@ public:
wxPoint GetSize(void) const;
/** Returns the cursor position on the screen.
@return cursor position in pixels
*/
wxPoint GetCursorScreenPos(wxDC &dc);
wxPoint GetCursorScreenPos(void) const;
/** Draws the cursor.
@param active If true, draw a bold cursor to mark window as
@@ -1134,25 +1139,7 @@ public:
void DecNumLines() { m_numLines--; }
/// get the line by number
wxLayoutLine *GetLine(CoordType index) const
{
wxASSERT_MSG( (0 <= index) && (index < (CoordType)m_numLines),
"invalid index" );
wxLayoutLine *line;
CoordType n = index;
for ( line = m_FirstLine; line && n-- > 0; line = line->GetNextLine() )
;
if ( line )
{
// should be the right one
wxASSERT( line->GetLineNumber() == index );
}
return line;
}
wxLayoutLine *GetLine(CoordType index) const;
private:
/// Clear the list.
void InternalClear(void);
@@ -1167,6 +1154,10 @@ private:
/// Is the update rectangle valid?
bool m_UpdateRectValid;
/// Shall we auto-format?
bool m_AutoFormat;
/// Shall we re-layout everything?
bool m_ReLayoutAll;
/**@name Cursor Management */
//@{
/// Where the text cursor (column,line) is.

View File

@@ -178,7 +178,7 @@ wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
int mode, int flags)
{
wxASSERT(status);
wxLayoutExportObject * export;
wxLayoutExportObject * exp;
if(status->m_iterator == NULLIT) // end of line
{
@@ -186,29 +186,29 @@ wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
// reached end of list
return NULL;
}
export = new wxLayoutExportObject();
exp = new wxLayoutExportObject();
wxLayoutObjectType type;
if(status->m_iterator != NULLIT)
{
type = (** status->m_iterator).GetType();
if( mode == WXLO_EXPORT_AS_OBJECTS || ! WXLO_IS_TEXT(type)) // simple case
{
export->type = WXLO_EXPORT_OBJECT;
export->content.object = *status->m_iterator;
exp->type = WXLO_EXPORT_OBJECT;
exp->content.object = *status->m_iterator;
status->m_iterator++;
return export;
return exp;
}
}
else
{ // iterator == NULLIT
if(mode == WXLO_EXPORT_AS_OBJECTS)
{
export->type = WXLO_EXPORT_EMPTYLINE;
export->content.object = NULL; //empty line
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 export;
return exp;
}
else
type = WXLO_TYPE_TEXT;
@@ -254,9 +254,9 @@ wxLayoutExportObject *wxLayoutExport(wxLayoutExportStatus *status,
status->m_iterator++;
}
export->type = (mode == WXLO_EXPORT_AS_HTML)
exp->type = (mode == WXLO_EXPORT_AS_HTML)
? WXLO_EXPORT_HTML : WXLO_EXPORT_TEXT;
export->content.text = str;
return export;
exp->content.text = str;
return exp;
}

View File

@@ -1,7 +1,7 @@
/*-*- c++ -*-********************************************************
* wxLwindow.h : a scrolled Window for displaying/entering rich text*
* *
* (C) 1998, 1999 by Karsten Ball<6C>der (Ballueder@usa.net) *
* (C) 1998, 1999 by Karsten Ball<6C>der (karsten@phy.hw.ac.uk) *
* *
* $Id$
*******************************************************************/
@@ -34,6 +34,9 @@
# endif // USE_PCH
# include "gui/wxlwindow.h"
# include "gui/wxlparser.h"
# include "MDialogs.h"
# include "strutil.h"
#else
# ifdef __WXMSW__
# include <wx/msw/private.h>
@@ -57,7 +60,7 @@
// macros
// ----------------------------------------------------------------------------
#ifdef WXLAYOUT_DEBUG
#ifdef DEBUG
# define WXLO_DEBUG(x) wxLogDebug x
#else
# define WXLO_DEBUG(x)
@@ -75,6 +78,10 @@
#define WXLO_ROFFSET 20
#define WXLO_BOFFSET 20
/// scroll margins when selecting with the mouse
#define WXLO_SCROLLMARGIN_X 10
#define WXLO_SCROLLMARGIN_Y 10
/// the size of one scrollbar page in pixels
static const int X_SCROLL_PAGE = 10;
static const int Y_SCROLL_PAGE = 20;
@@ -105,6 +112,8 @@ BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow)
EVT_SET_FOCUS(wxLayoutWindow::OnSetFocus)
EVT_KILL_FOCUS(wxLayoutWindow::OnKillFocus)
// EVT_IDLE(wxLayoutWindow::ResizeScrollbars)
END_EVENT_TABLE()
// ----------------------------------------------------------------------------
@@ -119,7 +128,7 @@ static bool IsDirectionKey(long keyCode);
// ============================================================================
#ifndef wxWANTS_CHARS
#define wxWANTS_CHARS 0
# define wxWANTS_CHARS 0
#endif
// ----------------------------------------------------------------------------
@@ -146,6 +155,9 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
m_llist = new wxLayoutList();
m_BGbitmap = NULL;
m_ScrollToCursor = false;
#ifndef __WXMSW__
m_FocusFollowMode = false;
#endif
SetWrapMargin(0);
// no scrollbars initially
@@ -194,8 +206,7 @@ wxLayoutWindow::Clear(int family,
wxScrolledWindow::Clear();
ResizeScrollbars(true);
SetDirty();
SetModified(false);
SetModified(FALSE);
if ( m_Editable )
m_CursorVisibility = 1;
@@ -204,15 +215,12 @@ wxLayoutWindow::Clear(int family,
GetCaret()->Show();
#endif // WXLAYOUT_USE_CARET
DoPaint((wxRect *)NULL);
RequestUpdate((wxRect *)NULL);
}
void wxLayoutWindow::Refresh(bool eraseBackground, const wxRect *rect)
{
wxScrolledWindow::Refresh(eraseBackground, rect);
ResizeScrollbars();
//FIXME is this needed? It causes problems... ScrollToCursor();
}
void
@@ -220,15 +228,12 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
{
wxClientDC dc( this );
PrepareDC( dc );
#ifdef __WXMSW__
if ( eventId != WXLOWIN_MENU_MOUSEMOVE )
if ( eventId != WXLOWIN_MENU_MOUSEMOVE
#ifndef __WXMSW__
|| m_FocusFollowMode
#endif
{
// moving the mouse in a window shouldn't give it the focus!
// Oh yes! wxGTK's focus handling is so broken, that this is the
// only sensible way to go.
)
SetFocus();
}
wxPoint findPos;
findPos.x = dc.DeviceToLogicalX(event.GetX());
@@ -238,12 +243,43 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
findPos.y -= WXLO_YOFFSET;
if(findPos.x < 0)
findPos.x = 0;
findPos.x = 0;
if(findPos.y < 0)
findPos.y = 0;
findPos.y = 0;
m_ClickPosition = wxPoint(event.GetX(), event.GetY());
// Scroll the window if the mouse is at the end of it:
if(m_Selecting && eventId == WXLOWIN_MENU_MOUSEMOVE)
{
//WXLO_DEBUG(("selecting at : %d/%d", (int) event.GetX(), (int)event.GetY()));
int left, top;
ViewStart(&left, &top);
wxSize size = GetClientSize();
int xdelta, ydelta;
if(event.GetX() < WXLO_SCROLLMARGIN_X)
xdelta = -(WXLO_SCROLLMARGIN_X-event.GetX());
else if(event.GetX() > size.x-WXLO_SCROLLMARGIN_X)
xdelta = event.GetX()-size.x+WXLO_SCROLLMARGIN_X;
else
xdelta = 0;
if(event.GetY() < WXLO_SCROLLMARGIN_Y)
ydelta = -(WXLO_SCROLLMARGIN_Y-event.GetY());
else if(event.GetY() > size.y-WXLO_SCROLLMARGIN_Y)
ydelta = event.GetY()-size.y+WXLO_SCROLLMARGIN_Y;
else
ydelta = 0;
//WXLO_DEBUG(("xdelta: %d", (int) xdelta));
if(xdelta != 0 || ydelta != 0)
{
top += ydelta; if(top < 0) top = 0;
left += xdelta; if(left < 0) left = 0;
Scroll(left, top);
}
}
wxPoint cursorPos;
bool found;
wxLayoutObject *obj = m_llist->FindObjectScreen(dc, findPos,
@@ -253,141 +289,132 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
// has the mouse only been moved?
switch ( eventId )
{
case WXLOWIN_MENU_MOUSEMOVE:
{
// this variables is used to only erase the message in the status
// bar if we had put it there previously - otherwise empting status
// bar might be undesirable
static bool s_hasPutMessageInStatusBar = false;
case WXLOWIN_MENU_MOUSEMOVE:
{
// this variables is used to only erase the message in the status
// bar if we had put it there previously - otherwise empting status
// bar might be undesirable
static bool s_hasPutMessageInStatusBar = false;
// found is only true if we are really over an object, not just
// behind it
if(found && u && ! m_Selecting)
// found is only true if we are really over an object, not just
// behind it
if(found && u && ! m_Selecting)
{
if(!m_HandCursor)
SetCursor(wxCURSOR_HAND);
m_HandCursor = TRUE;
if(m_StatusBar && m_StatusFieldLabel != -1)
{
const wxString &label = u->GetLabel();
if(label.Length())
{
if(!m_HandCursor)
SetCursor(wxCURSOR_HAND);
m_HandCursor = TRUE;
if(m_StatusBar && m_StatusFieldLabel != -1)
{
const wxString &label = u->GetLabel();
if(label.Length())
{
m_StatusBar->SetStatusText(label,
m_StatusFieldLabel);
s_hasPutMessageInStatusBar = true;
}
}
}
else
{
if(m_HandCursor)
SetCursor(wxCURSOR_IBEAM);
m_HandCursor = FALSE;
if( m_StatusBar && m_StatusFieldLabel != -1 &&
s_hasPutMessageInStatusBar )
{
m_StatusBar->SetStatusText("", m_StatusFieldLabel);
}
m_StatusBar->SetStatusText(label,
m_StatusFieldLabel);
s_hasPutMessageInStatusBar = true;
}
}
// selecting?
if ( event.LeftIsDown() )
}
else
{
if(m_HandCursor)
SetCursor(wxCURSOR_IBEAM);
m_HandCursor = FALSE;
if( m_StatusBar && m_StatusFieldLabel != -1 &&
s_hasPutMessageInStatusBar )
{
// m_Selecting might not be set if the button got pressed
// outside this window, so check for it:
if( m_Selecting )
{
m_llist->ContinueSelection(cursorPos, m_ClickPosition);
DoPaint(); // TODO: we don't have to redraw everything!
}
m_StatusBar->SetStatusText("", m_StatusFieldLabel);
}
}
}
if ( u )
{
u->DecRef();
u = NULL;
}
break;
// selecting?
if ( event.LeftIsDown() )
{
// m_Selecting might not be set if the button got pressed
// outside this window, so check for it:
if( m_Selecting )
{
m_llist->ContinueSelection(cursorPos, m_ClickPosition);
RequestUpdate(); // TODO: we don't have to redraw everything!
}
}
case WXLOWIN_MENU_LDOWN:
{
// always move cursor to mouse click:
// if ( obj )
{
// we have found the real position
m_llist->MoveCursorTo(cursorPos);
}
// else
// {
// // click beyond the end of the text
// m_llist->MoveCursorToEnd();
// }
if ( u )
{
u->DecRef();
u = NULL;
}
break;
// clicking a mouse removes the selection
if ( m_llist->HasSelection() )
{
m_llist->DiscardSelection();
m_Selecting = false;
DoPaint(); // TODO: we don't have to redraw everything!
}
case WXLOWIN_MENU_LDOWN:
{
// always move cursor to mouse click:
m_llist->MoveCursorTo(cursorPos);
// Calculate where the top of the visible area is:
int x0, y0;
ViewStart(&x0,&y0);
int dx, dy;
GetScrollPixelsPerUnit(&dx, &dy);
x0 *= dx; y0 *= dy;
// clicking a mouse removes the selection
if ( m_llist->HasSelection() )
{
m_llist->DiscardSelection();
m_Selecting = false;
RequestUpdate(); // TODO: we don't have to redraw everything!
}
// Calculate where the top of the visible area is:
int x0, y0;
ViewStart(&x0,&y0);
int dx, dy;
GetScrollPixelsPerUnit(&dx, &dy);
x0 *= dx; y0 *= dy;
wxPoint offset(-x0+WXLO_XOFFSET, -y0+WXLO_YOFFSET);
wxPoint offset(-x0+WXLO_XOFFSET, -y0+WXLO_YOFFSET);
if(m_CursorVisibility == -1)
m_CursorVisibility = 1;
if(m_CursorVisibility == -1)
m_CursorVisibility = 1;
#ifdef WXLAYOUT_USE_CARET
if ( m_CursorVisibility == 1 )
GetCaret()->Show();
if ( m_CursorVisibility == 1 )
GetCaret()->Show();
#endif // WXLAYOUT_USE_CARET
if(m_CursorVisibility)
{
// draw a thick cursor for editable windows with focus
m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset);
}
if(m_CursorVisibility)
{
// draw a thick cursor for editable windows with focus
m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset);
}
#ifdef __WXGTK__
DoPaint(); // DoPaint suppresses flicker under GTK
RequestUpdate(); // RequestUpdate suppresses flicker under GTK
#endif // wxGTK
// start selection
m_llist->StartSelection(wxPoint(-1, -1), m_ClickPosition);
m_Selecting = true;
}
break;
// start selection
m_llist->StartSelection(wxPoint(-1, -1), m_ClickPosition);
m_Selecting = true;
}
break;
case WXLOWIN_MENU_LUP:
if ( m_Selecting )
{
m_llist->EndSelection();
m_Selecting = false;
DoPaint(); // TODO: we don't have to redraw everything!
}
break;
case WXLOWIN_MENU_MDOWN:
Paste(TRUE);
break;
case WXLOWIN_MENU_DBLCLICK:
// select a word under cursor
m_llist->MoveCursorTo(cursorPos);
m_llist->MoveCursorWord(-1);
m_llist->StartSelection();
m_llist->MoveCursorWord(1, false);
case WXLOWIN_MENU_LUP:
if ( m_Selecting )
{
m_llist->EndSelection();
m_Selecting = false;
DoPaint(); // TODO: we don't have to redraw everything!
break;
RequestUpdate(); // TODO: we don't have to redraw everything!
}
break;
case WXLOWIN_MENU_MDOWN:
Paste(TRUE);
break;
case WXLOWIN_MENU_DBLCLICK:
// select a word under cursor
m_llist->MoveCursorTo(cursorPos);
m_llist->MoveCursorWord(-1);
m_llist->StartSelection();
m_llist->MoveCursorWord(1, false);
m_llist->EndSelection();
m_Selecting = false;
RequestUpdate(); // TODO: we don't have to redraw everything!
break;
}
// notify about mouse events?
@@ -440,6 +467,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
{
m_Selecting = false;
m_llist->EndSelection();
m_llist->DiscardSelection(); //FIXME: correct?
}
// If we deleted the selection here, we must not execute the
@@ -455,14 +483,15 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
{
m_llist->DeleteSelection();
deletedSelection = true;
SetDirty();
}
// <Shift>+<arrow> starts selection
if ( IsDirectionKey(keyCode) )
{
// just continue the old selection
if ( m_Selecting )
{
// just continue the old selection
if( event.ShiftDown() )
m_llist->ContinueSelection();
else
@@ -476,7 +505,6 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
m_Selecting = true;
m_llist->StartSelection();
}
}
// If needed, make cursor visible:
@@ -526,18 +554,33 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
else
m_llist->MoveCursorToEndOfLine();
break;
default:
if(keyCode == 'c' && ctrlDown)
{
// this should work even in read-only mode
Copy();
}
if(ctrlDown && ! IsEditable())
switch(keyCode)
{
case 'c':
// this should work even in read-only mode
Copy();
break;
#ifdef M_BASEDIR
case 's': // search
Find("");
break;
case 't': // search again
FindAgain();
break;
#endif
default:
;
}
else if( IsEditable() )
{
/* First, handle control keys */
if(ctrlDown && ! event.AltDown())
{
if(keyCode >= 'A' && keyCode <= 'Z')
keyCode = tolower(keyCode);
switch(keyCode)
{
case WXK_INSERT:
@@ -545,23 +588,44 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
break;
case WXK_DELETE :
if(! deletedSelection)
{
m_llist->DeleteWord();
SetDirty();
}
break;
case 'd':
if(! deletedSelection) // already done
{
m_llist->Delete(1);
SetDirty();
}
break;
case 'y':
m_llist->DeleteLines(1);
SetDirty();
break;
case 'h': // like backspace
if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1);
if(m_llist->MoveCursorHorizontally(-1))
{
m_llist->Delete(1);
SetDirty();
}
break;
case 'u':
#ifdef M_BASEDIR
case 's': // search
Find("");
break;
case 't': // search again
FindAgain();
break;
#endif
case 'u':
m_llist->DeleteToBeginOfLine();
SetDirty();
break;
case 'k':
m_llist->DeleteToEndOfLine();
SetDirty();
break;
case 'v':
Paste();
@@ -586,6 +650,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
case WXK_DELETE:
case 'd':
m_llist->DeleteWord();
SetDirty();
break;
default:
;
@@ -605,45 +670,57 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
Cut();
else
if(! deletedSelection)
{
m_llist->Delete(1);
SetDirty();
}
break;
case WXK_BACK: // backspace
if(! deletedSelection)
if(m_llist->MoveCursorHorizontally(-1))
{
m_llist->Delete(1);
SetDirty();
}
break;
case WXK_RETURN:
if(m_WrapMargin > 0)
m_llist->WrapLine(m_WrapMargin);
m_llist->LineBreak();
SetDirty();
break;
case WXK_TAB:
if ( !event.ShiftDown() )
{
// TODO should be configurable
static const int tabSize = 8;
// TODO should be configurable
static const int tabSize = 8;
CoordType x = m_llist->GetCursorPos().x;
size_t numSpaces = tabSize - x % tabSize;
m_llist->Insert(wxString(' ', numSpaces));
CoordType x = m_llist->GetCursorPos().x;
size_t numSpaces = tabSize - x % tabSize;
m_llist->Insert(wxString(' ', numSpaces));
SetDirty();
}
break;
default:
if((!(event.ControlDown() || event.AltDown() || event.MetaDown()))
if((!(event.ControlDown() || event.AltDown()
//#if 0
///FIXME: wxGTK reports MetaDown always
|| event.MetaDown()
//#endif
))
&& (keyCode < 256 && keyCode >= 32)
)
{
if(m_WrapMargin > 0 && isspace(keyCode))
m_llist->WrapLine(m_WrapMargin);
m_llist->Insert((char)keyCode);
SetDirty();
}
break;
}
}
SetDirty();
SetModified();
}// if(IsEditable())
}// first switch()
@@ -652,14 +729,9 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
// continue selection to the current (new) cursor position
m_llist->ContinueSelection();
}
// we must call ResizeScrollbars() before ScrollToCursor(), otherwise the
// ne cursor position might be outside the current scrolllbar range
ResizeScrollbars();
ScrollToCursor();
// refresh the screen
DoPaint(m_llist->GetUpdateRect());
RequestUpdate(m_llist->GetUpdateRect());
}
void
@@ -678,8 +750,9 @@ wxLayoutWindow::OnKeyUp(wxKeyEvent& event)
void
wxLayoutWindow::ScrollToCursor(void)
{
wxClientDC dc( this );
PrepareDC( dc );
//is always needed to make sure we know where the cursor is
//if(IsDirty())
RequestUpdate(m_llist->GetUpdateRect());
int x0,y0,x1,y1, dx, dy;
@@ -693,13 +766,10 @@ wxLayoutWindow::ScrollToCursor(void)
// Get the size of the visible window:
GetClientSize(&x1, &y1);
// update the cursor screen position
m_llist->Layout(dc);
// Make sure that the scrollbars are at a position so that the cursor is
// visible if we are editing
WXLO_DEBUG(("m_ScrollToCursor = %d", (int) m_ScrollToCursor));
wxPoint cc = m_llist->GetCursorScreenPos(dc);
wxPoint cc = m_llist->GetCursorScreenPos();
// the cursor should be completely visible in both directions
wxPoint cs(m_llist->GetCursorSize());
@@ -723,9 +793,9 @@ wxLayoutWindow::ScrollToCursor(void)
{
// set new view start
Scroll(nx == -1 ? -1 : (nx+dx-1)/dx, ny == -1 ? -1 : (ny+dy-1)/dy);
// avoid recursion
m_ScrollToCursor = false;
RequestUpdate();
}
}
@@ -737,7 +807,7 @@ wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event))
}
void
wxLayoutWindow::DoPaint(const wxRect *updateRect)
wxLayoutWindow::RequestUpdate(const wxRect *updateRect)
{
#ifdef __WXGTK__
// Calling Refresh() causes bad flicker under wxGTK!!!
@@ -782,10 +852,18 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
}
if(IsDirty())
{
WXLO_DEBUG(("InternalPaint, isdirty, list size: %ld,%ld",
(unsigned long) m_llist->GetSize().x,
(unsigned long) m_llist->GetSize().y));
// m_llist->ForceTotalLayout();
m_llist->Layout(dc);
WXLO_DEBUG(("InternalPaint, isdirty, list size after layout: %ld,%ld",
(unsigned long) m_llist->GetSize().x,
(unsigned long) m_llist->GetSize().y));
ResizeScrollbars();
ResetDirty();
}
/* 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)
@@ -881,7 +959,6 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
#endif // WXLAYOUT_USE_CARET
ResetDirty();
m_ScrollToCursor = false;
if ( m_StatusBar && m_StatusFieldCursor != -1 )
{
@@ -905,9 +982,7 @@ void
wxLayoutWindow::OnSize(wxSizeEvent &event)
{
if ( m_llist )
{
ResizeScrollbars();
}
event.Skip();
}
@@ -916,6 +991,17 @@ wxLayoutWindow::OnSize(wxSizeEvent &event)
void
wxLayoutWindow::ResizeScrollbars(bool exact)
{
if(IsDirty())
{
wxClientDC dc( this );
PrepareDC( dc );
// m_llist->ForceTotalLayout();
m_llist->Layout(dc);
ResetDirty();
RequestUpdate();
}
wxPoint max = m_llist->GetSize();
wxSize size = GetClientSize();
@@ -1016,6 +1102,7 @@ wxLayoutWindow::Paste(bool primary)
wxTheClipboard->GetData(&data);
wxString text = data.GetText();
wxLayoutImportText( m_llist, text);
SetDirty();
}
}
wxTheClipboard->Close();
@@ -1039,13 +1126,13 @@ wxLayoutWindow::Copy(bool invalidate)
return FALSE;
// Export selection as text:
wxString text;
wxLayoutExportObject *export;
wxLayoutExportObject *exp;
wxLayoutExportStatus status(llist);
while((export = wxLayoutExport( &status, WXLO_EXPORT_AS_TEXT)) != NULL)
while((exp = wxLayoutExport( &status, WXLO_EXPORT_AS_TEXT)) != NULL)
{
if(export->type == WXLO_EXPORT_TEXT)
text << *(export->content.text);
delete export;
if(exp->type == WXLO_EXPORT_TEXT)
text << *(exp->content.text);
delete exp;
}
delete llist;
@@ -1080,6 +1167,7 @@ wxLayoutWindow::Cut(void)
if(Copy(false)) // do not invalidate selection after copy
{
m_llist->DeleteSelection();
SetDirty();
return TRUE;
}
else
@@ -1090,16 +1178,31 @@ wxLayoutWindow::Cut(void)
// searching
// ----------------------------------------------------------------------------
#ifdef M_BASEDIR
bool
wxLayoutWindow::Find(const wxString &needle,
wxPoint * fromWhere)
wxPoint * fromWhere,
const wxString &configPath)
{
wxPoint found;
if(fromWhere == NULL)
found = m_llist->FindText(needle, m_llist->GetCursorPos());
if(needle.Length() == 0)
{
if( ! MInputBox(&m_FindString,
_("Find text"),
_(" Find:"),
this,
configPath, "")
|| strutil_isempty(m_FindString))
return true;
}
else
found = m_llist->FindText(needle, *fromWhere);
m_FindString = needle;
if(fromWhere == NULL)
found = m_llist->FindText(m_FindString, m_llist->GetCursorPos());
else
found = m_llist->FindText(m_FindString, *fromWhere);
if(found.x != -1)
{
if(fromWhere)
@@ -1109,11 +1212,21 @@ wxLayoutWindow::Find(const wxString &needle,
}
m_llist->MoveCursorTo(found);
ScrollToCursor();
RequestUpdate();
return true;
}
return false;
}
bool
wxLayoutWindow::FindAgain(void)
{
bool rc = Find(m_FindString);
return rc;
}
#endif
// ----------------------------------------------------------------------------
// popup menu stuff
// ----------------------------------------------------------------------------
@@ -1157,21 +1270,21 @@ void wxLayoutWindow::OnMenu(wxCommandEvent& event)
switch (event.GetId())
{
case WXLOWIN_MENU_LARGER:
m_llist->SetFontLarger(); DoPaint(); break;
m_llist->SetFontLarger(); RequestUpdate(); break;
case WXLOWIN_MENU_SMALLER:
m_llist->SetFontSmaller(); DoPaint(); break;
m_llist->SetFontSmaller(); RequestUpdate(); break;
case WXLOWIN_MENU_UNDERLINE:
m_llist->ToggleFontUnderline(); DoPaint(); break;
m_llist->ToggleFontUnderline(); RequestUpdate(); break;
case WXLOWIN_MENU_BOLD:
m_llist->ToggleFontWeight(); DoPaint(); break;
m_llist->ToggleFontWeight(); RequestUpdate(); break;
case WXLOWIN_MENU_ITALICS:
m_llist->ToggleFontItalics(); DoPaint(); break;
m_llist->ToggleFontItalics(); RequestUpdate(); break;
case WXLOWIN_MENU_ROMAN:
m_llist->SetFontFamily(wxROMAN); DoPaint(); break;
m_llist->SetFontFamily(wxROMAN); RequestUpdate(); break;
case WXLOWIN_MENU_TYPEWRITER:
m_llist->SetFontFamily(wxFIXED); DoPaint(); break;
m_llist->SetFontFamily(wxFIXED); RequestUpdate(); break;
case WXLOWIN_MENU_SANSSERIF:
m_llist->SetFontFamily(wxSWISS); DoPaint(); break;
m_llist->SetFontFamily(wxSWISS); RequestUpdate(); break;
}
}
@@ -1184,7 +1297,7 @@ wxLayoutWindow::OnSetFocus(wxFocusEvent &ev)
{
m_HaveFocus = true;
ev.Skip();
DoPaint(); // cursor must change
RequestUpdate(); // cursor must change
}
void
@@ -1192,7 +1305,7 @@ wxLayoutWindow::OnKillFocus(wxFocusEvent &ev)
{
m_HaveFocus = false;
ev.Skip();
DoPaint();// cursor must change
RequestUpdate();// cursor must change
}
// ----------------------------------------------------------------------------

View File

@@ -1,7 +1,7 @@
/*-*- c++ -*-********************************************************
* wxLwindow.h : a scrolled Window for displaying/entering rich text*
* *
* (C) 1998,1999 by Karsten Ball<6C>der (Ballueder@usa.net) *
* (C) 1998-1999 by Karsten Ball<6C>der (karsten@phy.hw.ac.uk) *
* *
* $Id$
*******************************************************************/
@@ -106,8 +106,15 @@ public:
bool Cut(void);
//@}
#ifdef M_BASEDIR
/// find string in buffer
bool Find(const wxString &needle,
wxPoint * fromWhere = NULL);
wxPoint * fromWhere = NULL,
const wxString &configPath = "MsgViewFindString");
/// find the same string again
bool FindAgain(void);
#endif
void EnablePopup(bool enable = true) { m_DoPopupMenu = enable; }
@@ -120,7 +127,7 @@ public:
Internally, this stores the parameter and calls a refresh on
wxMSW, draws directly on wxGTK.
*/
void DoPaint(const wxRect *updateRect = NULL);
void RequestUpdate(const wxRect *updateRect = NULL);
/// if exact == false, assume 50% extra size for the future
void ResizeScrollbars(bool exact = false); // don't change this to true!
@@ -155,22 +162,9 @@ public:
/// Creates a wxMenu for use as a format popup.
static wxMenu * MakeFormatMenu(void);
/**@name Dirty flag handling for optimisations. */
//@{
/// Set dirty flag.
void SetDirty(void) { m_Dirty = true; }
/// Query whether window needs redrawing.
bool IsDirty(void) const { return m_Dirty; }
/// Reset dirty flag.
void ResetDirty(void) { m_Dirty = false; }
//@}
/// Redraws the window, used by DoPaint() or OnPaint().
/// Redraws the window, used by RequestUpdate() or OnPaint().
void InternalPaint(const wxRect *updateRect);
/// Has list been modified/edited?
bool IsModified(void) const { return m_Modified; }
/// Mark list as modified or unchanged.
void SetModified(bool modified = true) { m_Modified = modified; }
/** Tell window to update a wxStatusBar with UserData labels and
cursor positions.
@param bar wxStatusBar pointer
@@ -184,7 +178,36 @@ public:
m_StatusBar = bar; m_StatusFieldLabel = labelfield;
m_StatusFieldCursor = cursorfield;
}
#ifndef __WXMSW__
/// Enable or disable focus follow mode under non-MSW
void SetFocusFollowMode(bool enable = TRUE)
{ m_FocusFollowMode = enable; }
#endif
/**@name Modified flag handling, will not get reset by list unless
in Clear() */
//@{
/// Set dirty flag.
void SetModified(bool modified = TRUE) { m_Modified = modified; }
/// Query whether window needs redrawing.
bool IsModified(void) const { return m_Modified; }
//@}
/**@name Dirty flag handling for optimisations.
Normally one should only need to call SetDirty(), e.g. when
manipulating the wxLayoutList directly, so the window will update
itself. ResetDirty() and IsDirty() should only be used
internally. */
//@{
/// Set dirty flag.
void SetDirty(void) { m_Dirty = true; m_Modified = true; }
/// Query whether window needs redrawing.
bool IsDirty(void) const { return m_Dirty; }
/// Reset dirty flag.
void ResetDirty(void) { m_Dirty = false; }
//@}
protected:
/// generic function for mouse events processing
void OnMouse(int eventId, wxMouseEvent& event);
@@ -237,10 +260,10 @@ private:
bool m_Selecting;
/// wrap margin
CoordType m_WrapMargin;
/// Is list dirty (for redraws, internal use)?
bool m_Dirty;
/// Has list been edited?
bool m_Modified;
/// Has list changed since last redraw, e.g. in size?
bool m_Dirty;
/// Has the list ever been modified?
bool m_Modified;
wxMemoryDC *m_memDC;
wxBitmap *m_bitmap;
wxPoint m_bitmapSize;
@@ -256,7 +279,13 @@ private:
//@{
/// Do we want to auto-replace the selection with new text?
bool m_AutoDeleteSelection;
//@}
#ifndef __WXMSW__
/// Do we want the focus to follow the mouse?
bool m_FocusFollowMode;
#endif
/// For finding text and finding it again:
wxString m_FindString;
//@}
DECLARE_EVENT_TABLE()
};

View File

@@ -472,36 +472,42 @@ wxDialUpManagerImpl::CheckStatusInternal(void)
// This can be used under Win 9x, too!
struct hostent *hp;
struct sockaddr_in serv_addr;
int sockfd;
m_IsOnline = 0; // assume false
if((hp = gethostbyname(m_BeaconHost)) == NULL)
return; // no DNS no net
serv_addr.sin_family = hp->h_addrtype;
serv_addr.sin_family = hp->h_addrtype;
memcpy(&serv_addr.sin_addr,hp->h_addr, hp->h_length);
serv_addr.sin_port = htons(m_BeaconPort);
if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
{
serv_addr.sin_port = htons(m_BeaconPort);
// PING method:
int sockfd;
if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
{
// sys_error("cannot create socket for gw");
return;
}
// PING method:
if(sendto(sockfd, "hello", strlen("hello"), /* flags */ 0,
(struct sockaddr *)&serv_addr,
if(sendto(sockfd, "hello",
strlen("hello"), /* flags */ 0,
(struct sockaddr *) &serv_addr,
sizeof(serv_addr)) == -1)
{
close(sockfd);
return;
#if 0
}
#if 0
if( connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
//sys_error("cannot connect to server");
return;
}
//connected!
close(sockfd);
#endif
close(sockfd);
m_IsOnline = TRUE;
}