NamedObjs.cpp 5.3 KB

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