FormatState Class Reference

encapsulates state when wrapping/formatting a text line More...

#include <nodetxtl.h>

List of all members.

Public Member Functions

 FormatState (MILLIPOINT AvailableWidth, BOOL SetPositions, VisibleTextNode *pFirstNode, MILLIPOINT Indent, MILLIPOINT _CharPosOffset, MILLIPOINT _ExtraOnChars, MILLIPOINT _ExtraOnSpaces)
void AdvanceBy (MILLIPOINT Advance, BOOL IsADecimalPoint)
 Account for a char with width CharWidth to be fitted into the current line. See also: TextLine::FindBreakChar for a description of the formatting algorithm used.
BOOL FinishTabSection (VisibleTextNode *pLastFormattedNode, BOOL IsLastTabSection)
 This routine is called when a tab or the end of the line is encountered, so the text after the previous tab (or the start of the line) can be finally formatted. The Width/Advance of the Tab is always set and if SetCharPositions is TRUE, then all the character positions are set.
BOOL IsAvailable (MILLIPOINT CharWidth, BOOL IsATab, BOOL IsADecimalPoint)
 Test whether a char with width CharWidth can be fitted into the current line.

Public Attributes

const BOOL SetCharPositions
const MILLIPOINT FitWidth
VisibleTextNode *const pFirstVTN
const MILLIPOINT CharPosOffset
const MILLIPOINT ExtraOnChars
const MILLIPOINT ExtraOnSpaces
MILLIPOINT Width
TxtTabType ActiveTabType
MILLIPOINT ActiveTabPos
VisibleTextNodepLastTabVTN
MILLIPOINT AnchorPos
MILLIPOINT RemainingSpace
WCHAR DecimalPointChar
BOOL DecimalPointFound


Detailed Description

encapsulates state when wrapping/formatting a text line

Author:
Martin Wuerthner <xara@mw-software.com>
Date:
21/06/06

Definition at line 198 of file nodetxtl.h.


Constructor & Destructor Documentation

FormatState::FormatState MILLIPOINT  AvailableWidth,
BOOL  SetPositions,
VisibleTextNode pFirstNode,
MILLIPOINT  Indent,
MILLIPOINT  _CharPosOffset,
MILLIPOINT  _ExtraOnChars,
MILLIPOINT  _ExtraOnSpaces
[inline]
 

Definition at line 231 of file nodetxtl.h.

00233                                                                     :
00234         SetCharPositions(SetPositions),
00235         FitWidth(AvailableWidth), pFirstVTN(pFirstNode),
00236         CharPosOffset(_CharPosOffset),
00237         ExtraOnChars(_ExtraOnChars), ExtraOnSpaces(_ExtraOnSpaces),
00238         Width(Indent), ActiveTabType(LeftTab), ActiveTabPos(0), 
00239         pLastTabVTN(NULL), AnchorPos(Indent) {};
    void AdvanceBy(MILLIPOINT Advance, BOOL IsADecimalPoint);


Member Function Documentation

void FormatState::AdvanceBy MILLIPOINT  CharWidth,
BOOL  IsADecimalPoint
 

Account for a char with width CharWidth to be fitted into the current line. See also: TextLine::FindBreakChar for a description of the formatting algorithm used.

Author:
Martin Wuerthner <xara@mw-software.com>
Date:
23/06/06
Parameters:
CharWidth - the amount to advance by [INPUTS] IsADecimalPoint - TRUE if the currently active tab is a decimal tab and the character to be formatted is its decimal point character

Definition at line 1133 of file nodetxtl.cpp.

01134 {
01135     // Note: This routine may only update Width and RemainingSpace, otherwise
01136     // the backtracking in IsAvailable() does not work as expected.
01137     if (ActiveTabType == CentreTab && RemainingSpace > 0)
01138     {
01139         MILLIPOINT SpaceToLeftUsed = 0;
01140         // half the width is distributed into RemainingSpace, if it is big enough
01141         if (RemainingSpace >= CharWidth / 2)
01142         {
01143             // half the width fully fits into RemainingSpace
01144             SpaceToLeftUsed = CharWidth / 2;
01145         }
01146         else
01147         {
01148             // does not fit, so use up all of RemainingSpace
01149             SpaceToLeftUsed = RemainingSpace;
01150         }
01151         // distribute some of the character to the left
01152         RemainingSpace -= SpaceToLeftUsed;
01153         // and the remainder to the right
01154         Width += CharWidth - SpaceToLeftUsed;
01155     }
01156     else if ((ActiveTabType == RightTab || (ActiveTabType == DecimalTab && !DecimalPointFound
01157                                             && !IsADecimalPoint))
01158              && RemainingSpace > 0)
01159     {
01160         if (RemainingSpace >= CharWidth) RemainingSpace -= CharWidth;
01161         else
01162         {
01163             Width += CharWidth - RemainingSpace;
01164             RemainingSpace = 0;
01165         }
01166     }
01167     else
01168     {
01169         // We end up here if:
01170         // - the last tab was left tab, or
01171         // - the last tab was a decimal tab and we have already found the decimal point, or
01172         // - the last tab was a decimal tab and this is a decimal point character (NB. - the
01173         //   decimal point is always formatted to the right of the tab position), or, finally,
01174         // - this is any kind of tab and we have no more remaining space to the left of it
01175         // In all these cases, we simply format the character to the right of the current position,
01176         // which is the easiest thing to do anyway
01177         Width += CharWidth;
01178     }
01179 }

BOOL FormatState::FinishTabSection VisibleTextNode pLastFormattedNode,
BOOL  IsLastTabSection
 

This routine is called when a tab or the end of the line is encountered, so the text after the previous tab (or the start of the line) can be finally formatted. The Width/Advance of the Tab is always set and if SetCharPositions is TRUE, then all the character positions are set.

Author:
Martin Wuerthner <xara@mw-software.com>
Date:
23/06/06
Parameters:
pLastFormattedNode - the most recently fitted node [INPUTS] IsLastTabSection - TRUE if this section has been terminated by EOL or a line break (i.e., not by a Tab), which means we should add ExtraSpaceOnChars/Space here)
Returns:
ptr to char to break at (or NULL if ERROR)

Definition at line 1086 of file nodetxtl.cpp.

01087 {
01088     // first, set the Tab character's width - this is only necessary for non-Left tabs
01089     // (for left tabs we have already set it when encountering the tab)
01090     if (ActiveTabType != LeftTab)
01091     {
01092         // pLastTabVTN can only be undefined for ActiveTabType == LeftTab
01093         ((HorizontalTab*)pLastTabVTN)->SetCharWidth(RemainingSpace);
01094         ((HorizontalTab*)pLastTabVTN)->SetCharAdvance(RemainingSpace);
01095     }
01096     if (!SetCharPositions) return TRUE;
01097 
01098     // full formatting desired
01099     VisibleTextNode* pVTN = pLastTabVTN ? pLastTabVTN : pFirstVTN;
01100     MILLIPOINT Pos = AnchorPos;
01101     do
01102     {
01103         ERROR2IF(pVTN == NULL, FALSE, "FinishTabSection - unexpected end of line");
01104         if (Pos + CharPosOffset != pVTN->GetPosInLine())
01105         {
01106             pVTN->SetPosInLine(Pos + CharPosOffset);
01107             pVTN->FlagNodeAndDescendantsAffectedAndParentsHaveDescendantAffected(); 
01108         }
01109         Pos += pVTN->GetCharAdvance();
01110         
01111         if (IsLastTabSection && IS_A(pVTN,TextChar))
01112             Pos += ExtraOnChars;
01113         if (IsLastTabSection && pVTN->IsASpace())
01114             Pos += ExtraOnSpaces;
01115         if (pVTN == pLastFormattedNode) break;
01116         pVTN = pVTN->FindNextVTNInLine();
01117     } while(1);
01118     return TRUE;
01119 }

BOOL FormatState::IsAvailable MILLIPOINT  CharWidth,
BOOL  IsATab,
BOOL  IsADecimalPoint
 

Test whether a char with width CharWidth can be fitted into the current line.

Author:
Martin Wuerthner <xara@mw-software.com>
Date:
23/06/06
Parameters:
CharWidth - the amount to advance by [INPUTS] IsATab - TRUE if the character to be fitted is a tab IsADecimalPoint - TRUE if the currently active tab is a decimal tab and the character to be formatted is its decimal point character

Definition at line 1193 of file nodetxtl.cpp.

01194 {
01195     // If the full CharWidth still fits, then we can return TRUE straight away
01196     // without having to look at the active tab type
01197     if (Width + CharWidth < FitWidth) return TRUE;
01198     // If the above did not succeed there is no hope in the standard case (last
01199     // tab was left tab or the beginning of the line) - the same is true for a
01200     // tab character because it will start a new tab section, so none of its width
01201     // can go to the left of the current formatting position
01202     if (ActiveTabType == LeftTab || IsATab) return FALSE;
01203 
01204     // For other tab types, things are a bit more complicated because half or
01205     // all of the character can go to the left of the tab stop. Rather than
01206     // duplicating all the AdvanceBy code, we simply advance and backtrack.
01207     MILLIPOINT OldWidth = Width;
01208     MILLIPOINT OldRemainingSpace = RemainingSpace;
01209     AdvanceBy(CharWidth, IsADecimalPoint);
01210     MILLIPOINT NewWidth = Width;
01211     Width = OldWidth;
01212     RemainingSpace = OldRemainingSpace;
01213     return NewWidth < FitWidth;
01214 }


Member Data Documentation

MILLIPOINT FormatState::ActiveTabPos
 

Definition at line 213 of file nodetxtl.h.

TxtTabType FormatState::ActiveTabType
 

Definition at line 212 of file nodetxtl.h.

MILLIPOINT FormatState::AnchorPos
 

Definition at line 219 of file nodetxtl.h.

const MILLIPOINT FormatState::CharPosOffset
 

Definition at line 204 of file nodetxtl.h.

WCHAR FormatState::DecimalPointChar
 

Definition at line 227 of file nodetxtl.h.

BOOL FormatState::DecimalPointFound
 

Definition at line 228 of file nodetxtl.h.

const MILLIPOINT FormatState::ExtraOnChars
 

Definition at line 205 of file nodetxtl.h.

const MILLIPOINT FormatState::ExtraOnSpaces
 

Definition at line 206 of file nodetxtl.h.

const MILLIPOINT FormatState::FitWidth
 

Definition at line 202 of file nodetxtl.h.

VisibleTextNode* const FormatState::pFirstVTN
 

Definition at line 203 of file nodetxtl.h.

VisibleTextNode* FormatState::pLastTabVTN
 

Definition at line 214 of file nodetxtl.h.

MILLIPOINT FormatState::RemainingSpace
 

Definition at line 224 of file nodetxtl.h.

const BOOL FormatState::SetCharPositions
 

Definition at line 201 of file nodetxtl.h.

MILLIPOINT FormatState::Width
 

Definition at line 207 of file nodetxtl.h.


The documentation for this class was generated from the following files:
Generated on Sat Nov 10 03:54:32 2007 for Camelot by  doxygen 1.4.4