NamedObjs.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Common.h"
  5. #include "NamedObjs.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. //---------------------------------------------------------------------------
  9. int __fastcall NamedObjectSortProc(void * Item1, void * Item2)
  10. {
  11. return static_cast<TNamedObject *>(Item1)->Compare(static_cast<TNamedObject *>(Item2));
  12. }
  13. //--- TNamedObject ----------------------------------------------------------
  14. __fastcall TNamedObject::TNamedObject(UnicodeString AName)
  15. {
  16. Name = AName;
  17. }
  18. //---------------------------------------------------------------------------
  19. void __fastcall TNamedObject::SetName(UnicodeString value)
  20. {
  21. FHidden = (value.SubString(1, TNamedObjectList::HiddenPrefix.Length()) == TNamedObjectList::HiddenPrefix);
  22. FName = value;
  23. }
  24. //---------------------------------------------------------------------------
  25. int __fastcall TNamedObject::Compare(TNamedObject * Other)
  26. {
  27. int Result;
  28. if (Hidden && !Other->Hidden)
  29. {
  30. Result = -1;
  31. }
  32. else if (!Hidden && Other->Hidden)
  33. {
  34. Result = 1;
  35. }
  36. else
  37. {
  38. Result = CompareLogicalText(Name, Other->Name, true);
  39. }
  40. return Result;
  41. }
  42. //---------------------------------------------------------------------------
  43. bool __fastcall TNamedObject::IsSameName(const UnicodeString & AName)
  44. {
  45. return (Name.CompareIC(AName) == 0);
  46. }
  47. //---------------------------------------------------------------------------
  48. void __fastcall TNamedObject::MakeUniqueIn(TNamedObjectList * List)
  49. {
  50. // This object can't be item of list, it would create infinite loop
  51. if (List && (List->IndexOf(this) == -1))
  52. while (List->FindByName(Name))
  53. {
  54. Integer N = 0, P = 0; // shut up
  55. // If name already contains number parenthesis remove it (and remember it)
  56. if ((Name[Name.Length()] == L')') && ((P = Name.LastDelimiter(L'(')) > 0))
  57. try
  58. {
  59. N = StrToInt(Name.SubString(P + 1, Name.Length() - P - 1));
  60. Name.Delete(P, Name.Length() - P + 1);
  61. Name = Name.TrimRight();
  62. }
  63. catch (Exception &)
  64. {
  65. N = 0;
  66. }
  67. Name += L" (" + IntToStr(N+1) + L")";
  68. }
  69. }
  70. //--- TNamedObjectList ------------------------------------------------------
  71. const UnicodeString TNamedObjectList::HiddenPrefix = L"_!_";
  72. //---------------------------------------------------------------------------
  73. __fastcall TNamedObjectList::TNamedObjectList():
  74. TObjectList()
  75. {
  76. AutoSort = True;
  77. FHiddenCount = 0;
  78. FControlledAdd = false;
  79. }
  80. //---------------------------------------------------------------------------
  81. TNamedObject * __fastcall TNamedObjectList::AtObject(Integer Index)
  82. {
  83. return (TNamedObject *)Items[Index+FHiddenCount];
  84. }
  85. //---------------------------------------------------------------------------
  86. void __fastcall TNamedObjectList::Recount()
  87. {
  88. int i = 0;
  89. while ((i < TObjectList::Count) && ((TNamedObject *)Items[i])->Hidden) i++;
  90. FHiddenCount = i;
  91. }
  92. //---------------------------------------------------------------------------
  93. void __fastcall TNamedObjectList::AlphaSort()
  94. {
  95. Sort(NamedObjectSortProc);
  96. Recount();
  97. }
  98. //---------------------------------------------------------------------------
  99. int __fastcall TNamedObjectList::Add(TObject * AObject)
  100. {
  101. int Result;
  102. TAutoFlag ControlledAddFlag(FControlledAdd);
  103. TNamedObject * NamedObject = static_cast<TNamedObject *>(AObject);
  104. // If temporarily not auto-sorting (when loading session list),
  105. // keep the hidden objects in front, so that HiddenCount is correct
  106. if (!AutoSort && NamedObject->Hidden)
  107. {
  108. Result = 0;
  109. Insert(Result, AObject);
  110. FHiddenCount++;
  111. }
  112. else
  113. {
  114. Result = TObjectList::Add(AObject);
  115. }
  116. return Result;
  117. }
  118. //---------------------------------------------------------------------------
  119. void __fastcall TNamedObjectList::Notify(void *Ptr, TListNotification Action)
  120. {
  121. if (Action == lnDeleted)
  122. {
  123. TNamedObject * NamedObject = static_cast<TNamedObject *>(Ptr);
  124. if (NamedObject->Hidden && (FHiddenCount >= 0))
  125. {
  126. FHiddenCount--;
  127. }
  128. }
  129. TObjectList::Notify(Ptr, Action);
  130. if (Action == lnAdded)
  131. {
  132. if (!FControlledAdd)
  133. {
  134. FHiddenCount = -1;
  135. }
  136. if (AutoSort)
  137. {
  138. AlphaSort();
  139. }
  140. }
  141. }
  142. //---------------------------------------------------------------------------
  143. TNamedObject * __fastcall TNamedObjectList::FindByName(const UnicodeString & Name)
  144. {
  145. // This should/can be optimized when list is sorted
  146. for (Integer Index = 0; Index < CountIncludingHidden; Index++)
  147. {
  148. // Not using AtObject as we iterate even hidden objects here
  149. TNamedObject * NamedObject = static_cast<TNamedObject *>(Items[Index]);
  150. if (NamedObject->IsSameName(Name))
  151. {
  152. return NamedObject;
  153. }
  154. }
  155. return NULL;
  156. }
  157. //---------------------------------------------------------------------------
  158. int __fastcall TNamedObjectList::GetCount()
  159. {
  160. DebugAssert(FHiddenCount >= 0);
  161. return TObjectList::Count - FHiddenCount;
  162. }
  163. //---------------------------------------------------------------------------
  164. int __fastcall TNamedObjectList::GetCountIncludingHidden()
  165. {
  166. DebugAssert(FHiddenCount >= 0);
  167. return TObjectList::Count;
  168. }