Leaked source code of windows server 2003
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

  1. /**************************************************************************\
  2. *
  3. * Copyright (c) 1998 Microsoft Corporation
  4. *
  5. * Module Name:
  6. *
  7. * stringFormat.cpp
  8. *
  9. * Abstract:
  10. *
  11. * Implementation for the string formatting class
  12. *
  13. * Revision History:
  14. *
  15. * 12 April 2000 dbrown
  16. * Created it.
  17. *
  18. \**************************************************************************/
  19. #include "precomp.hpp"
  20. GpStringFormat *GpStringFormat::GenericDefaultPointer = NULL;
  21. GpStringFormat *GpStringFormat::GenericTypographicPointer = NULL;
  22. BYTE GpStringFormat::GenericDefaultStaticBuffer [sizeof(GpStringFormat)] = {0};
  23. BYTE GpStringFormat::GenericTypographicStaticBuffer[sizeof(GpStringFormat)] = {0};
  24. GpStringFormat *GpStringFormat::GenericDefault()
  25. {
  26. if (GenericDefaultPointer != NULL)
  27. {
  28. return GenericDefaultPointer;
  29. }
  30. // Initialise static GpStringFormat class
  31. // Create the GpStringFormat without allocating memory by using object placement
  32. GenericDefaultPointer = new(GenericDefaultStaticBuffer) GpStringFormat();
  33. ASSERT(GenericDefaultPointer->Flags == DefaultFormatFlags);
  34. GenericDefaultPointer->LeadingMargin = DefaultMargin;
  35. GenericDefaultPointer->TrailingMargin = DefaultMargin;
  36. GenericDefaultPointer->Tracking = DefaultTracking;
  37. GenericDefaultPointer->Trimming = StringTrimmingCharacter;
  38. GenericDefaultPointer->Permanent = TRUE;
  39. return GenericDefaultPointer;
  40. }
  41. GpStringFormat *GpStringFormat::GenericTypographic()
  42. {
  43. if (GenericTypographicPointer != NULL)
  44. {
  45. return GenericTypographicPointer;
  46. }
  47. // Initialise static GpStringFormat class
  48. // Create the GpStringFormat without allocating memory by using object placement
  49. GenericTypographicPointer = new(GenericTypographicStaticBuffer) GpStringFormat();
  50. GenericTypographicPointer->Flags |= (StringFormatFlagsNoFitBlackBox | StringFormatFlagsNoClip | StringFormatFlagsLineLimit);
  51. GenericTypographicPointer->LeadingMargin = 0.0;
  52. GenericTypographicPointer->TrailingMargin = 0.0;
  53. GenericTypographicPointer->Tracking = 1.0;
  54. GenericTypographicPointer->Trimming = StringTrimmingNone;
  55. GenericTypographicPointer->Permanent = TRUE;
  56. return GenericTypographicPointer;
  57. }
  58. GpStringFormat *GpStringFormat::Clone() const
  59. {
  60. // Get a binary copy
  61. GpStringFormat *newFormat = new GpStringFormat();
  62. if (newFormat)
  63. {
  64. newFormat->Flags = Flags;
  65. newFormat->Language = Language;
  66. newFormat->StringAlign = StringAlign;
  67. newFormat->LineAlign = LineAlign;
  68. newFormat->DigitSubstitute = DigitSubstitute;
  69. newFormat->DigitLanguage = DigitLanguage;
  70. newFormat->FirstTabOffset = FirstTabOffset;
  71. newFormat->TabStops = NULL;
  72. newFormat->CountTabStops = CountTabStops;
  73. newFormat->HotkeyPrefix = HotkeyPrefix;
  74. newFormat->LeadingMargin = LeadingMargin;
  75. newFormat->TrailingMargin = TrailingMargin;
  76. newFormat->Tracking = Tracking;
  77. newFormat->Trimming = Trimming;
  78. newFormat->RangeCount = RangeCount;
  79. newFormat->Permanent = NULL;
  80. newFormat->UpdateUid();
  81. if (TabStops)
  82. {
  83. REAL *newTabStops = NULL;
  84. newTabStops = new REAL [CountTabStops];
  85. if (newTabStops)
  86. {
  87. newFormat->TabStops = newTabStops;
  88. GpMemcpy(newFormat->TabStops, TabStops, sizeof(REAL) * CountTabStops);
  89. }
  90. else
  91. {
  92. delete newFormat;
  93. return NULL;
  94. }
  95. }
  96. if (Ranges)
  97. {
  98. CharacterRange *newRanges = NULL;
  99. newRanges = new CharacterRange [RangeCount];
  100. if (newRanges)
  101. {
  102. newFormat->Ranges = newRanges;
  103. for (INT i = 0; i < RangeCount; i++)
  104. {
  105. newFormat->Ranges[i] = Ranges[i];
  106. }
  107. }
  108. else
  109. {
  110. if (TabStops)
  111. {
  112. delete [] TabStops;
  113. }
  114. delete newFormat;
  115. newFormat = NULL;
  116. }
  117. }
  118. }
  119. return newFormat;
  120. }
  121. GpStatus GpStringFormat::SetMeasurableCharacterRanges(
  122. INT rangeCount,
  123. const CharacterRange *ranges
  124. )
  125. {
  126. BOOL updated = FALSE;
  127. CharacterRange *newRanges = NULL;
  128. if (ranges && rangeCount > 0)
  129. {
  130. newRanges = new CharacterRange [rangeCount];
  131. if (!newRanges)
  132. {
  133. return OutOfMemory;
  134. }
  135. }
  136. if (Ranges)
  137. {
  138. // Clear old ranges
  139. delete [] Ranges;
  140. Ranges = NULL;
  141. RangeCount = 0;
  142. updated = TRUE;
  143. }
  144. if (newRanges)
  145. {
  146. for (INT i = 0; i < rangeCount; i++)
  147. {
  148. newRanges[i] = ranges[i];
  149. }
  150. Ranges = newRanges;
  151. RangeCount = rangeCount;
  152. updated = TRUE;
  153. }
  154. if (updated)
  155. {
  156. UpdateUid();
  157. }
  158. return Ok;
  159. }