NamedObjs.cpp 5.2 KB

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