You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.2 KiB
195 lines
5.2 KiB
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1998 Microsoft Corporation
|
|
*
|
|
* Module Name:
|
|
*
|
|
* stringFormat.cpp
|
|
*
|
|
* Abstract:
|
|
*
|
|
* Implementation for the string formatting class
|
|
*
|
|
* Revision History:
|
|
*
|
|
* 12 April 2000 dbrown
|
|
* Created it.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "precomp.hpp"
|
|
|
|
|
|
GpStringFormat *GpStringFormat::GenericDefaultPointer = NULL;
|
|
GpStringFormat *GpStringFormat::GenericTypographicPointer = NULL;
|
|
|
|
BYTE GpStringFormat::GenericDefaultStaticBuffer [sizeof(GpStringFormat)] = {0};
|
|
BYTE GpStringFormat::GenericTypographicStaticBuffer[sizeof(GpStringFormat)] = {0};
|
|
|
|
|
|
GpStringFormat *GpStringFormat::GenericDefault()
|
|
{
|
|
if (GenericDefaultPointer != NULL)
|
|
{
|
|
return GenericDefaultPointer;
|
|
}
|
|
|
|
// Initialise static GpStringFormat class
|
|
|
|
// Create the GpStringFormat without allocating memory by using object placement
|
|
GenericDefaultPointer = new(GenericDefaultStaticBuffer) GpStringFormat();
|
|
ASSERT(GenericDefaultPointer->Flags == DefaultFormatFlags);
|
|
GenericDefaultPointer->LeadingMargin = DefaultMargin;
|
|
GenericDefaultPointer->TrailingMargin = DefaultMargin;
|
|
GenericDefaultPointer->Tracking = DefaultTracking;
|
|
GenericDefaultPointer->Trimming = StringTrimmingCharacter;
|
|
GenericDefaultPointer->Permanent = TRUE;
|
|
|
|
return GenericDefaultPointer;
|
|
}
|
|
|
|
GpStringFormat *GpStringFormat::GenericTypographic()
|
|
{
|
|
if (GenericTypographicPointer != NULL)
|
|
{
|
|
return GenericTypographicPointer;
|
|
}
|
|
|
|
// Initialise static GpStringFormat class
|
|
|
|
// Create the GpStringFormat without allocating memory by using object placement
|
|
GenericTypographicPointer = new(GenericTypographicStaticBuffer) GpStringFormat();
|
|
GenericTypographicPointer->Flags |= (StringFormatFlagsNoFitBlackBox | StringFormatFlagsNoClip | StringFormatFlagsLineLimit);
|
|
GenericTypographicPointer->LeadingMargin = 0.0;
|
|
GenericTypographicPointer->TrailingMargin = 0.0;
|
|
GenericTypographicPointer->Tracking = 1.0;
|
|
GenericTypographicPointer->Trimming = StringTrimmingNone;
|
|
GenericTypographicPointer->Permanent = TRUE;
|
|
|
|
return GenericTypographicPointer;
|
|
}
|
|
|
|
GpStringFormat *GpStringFormat::Clone() const
|
|
{
|
|
// Get a binary copy
|
|
GpStringFormat *newFormat = new GpStringFormat();
|
|
|
|
if (newFormat)
|
|
{
|
|
newFormat->Flags = Flags;
|
|
newFormat->Language = Language;
|
|
newFormat->StringAlign = StringAlign;
|
|
newFormat->LineAlign = LineAlign;
|
|
newFormat->DigitSubstitute = DigitSubstitute;
|
|
newFormat->DigitLanguage = DigitLanguage;
|
|
newFormat->FirstTabOffset = FirstTabOffset;
|
|
newFormat->TabStops = NULL;
|
|
newFormat->CountTabStops = CountTabStops;
|
|
newFormat->HotkeyPrefix = HotkeyPrefix;
|
|
newFormat->LeadingMargin = LeadingMargin;
|
|
newFormat->TrailingMargin = TrailingMargin;
|
|
newFormat->Tracking = Tracking;
|
|
newFormat->Trimming = Trimming;
|
|
newFormat->RangeCount = RangeCount;
|
|
newFormat->Permanent = NULL;
|
|
|
|
newFormat->UpdateUid();
|
|
|
|
if (TabStops)
|
|
{
|
|
REAL *newTabStops = NULL;
|
|
|
|
newTabStops = new REAL [CountTabStops];
|
|
|
|
if (newTabStops)
|
|
{
|
|
newFormat->TabStops = newTabStops;
|
|
|
|
GpMemcpy(newFormat->TabStops, TabStops, sizeof(REAL) * CountTabStops);
|
|
}
|
|
else
|
|
{
|
|
delete newFormat;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
if (Ranges)
|
|
{
|
|
CharacterRange *newRanges = NULL;
|
|
|
|
newRanges = new CharacterRange [RangeCount];
|
|
|
|
if (newRanges)
|
|
{
|
|
newFormat->Ranges = newRanges;
|
|
|
|
for (INT i = 0; i < RangeCount; i++)
|
|
{
|
|
newFormat->Ranges[i] = Ranges[i];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (TabStops)
|
|
{
|
|
delete [] TabStops;
|
|
}
|
|
delete newFormat;
|
|
newFormat = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
return newFormat;
|
|
}
|
|
|
|
|
|
GpStatus GpStringFormat::SetMeasurableCharacterRanges(
|
|
INT rangeCount,
|
|
const CharacterRange *ranges
|
|
)
|
|
{
|
|
BOOL updated = FALSE;
|
|
CharacterRange *newRanges = NULL;
|
|
|
|
if (ranges && rangeCount > 0)
|
|
{
|
|
newRanges = new CharacterRange [rangeCount];
|
|
|
|
if (!newRanges)
|
|
{
|
|
return OutOfMemory;
|
|
}
|
|
}
|
|
|
|
if (Ranges)
|
|
{
|
|
// Clear old ranges
|
|
|
|
delete [] Ranges;
|
|
|
|
Ranges = NULL;
|
|
RangeCount = 0;
|
|
updated = TRUE;
|
|
}
|
|
|
|
if (newRanges)
|
|
{
|
|
for (INT i = 0; i < rangeCount; i++)
|
|
{
|
|
newRanges[i] = ranges[i];
|
|
}
|
|
|
|
Ranges = newRanges;
|
|
RangeCount = rangeCount;
|
|
updated = TRUE;
|
|
}
|
|
|
|
if (updated)
|
|
{
|
|
UpdateUid();
|
|
}
|
|
return Ok;
|
|
}
|
|
|