NamedObjs.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //---------------------------------------------------------------------------
  2. #include <vcl.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. bool HasPrefix1 = TNamedObjectList::IsHidden((TNamedObject *)Item1);
  11. bool HasPrefix2 = TNamedObjectList::IsHidden((TNamedObject *)Item2);
  12. if (HasPrefix1 && !HasPrefix2) return -1;
  13. else
  14. if (!HasPrefix1 && HasPrefix2) return 1;
  15. else
  16. return AnsiCompareStr(((TNamedObject *)Item1)->Name, ((TNamedObject *)Item2)->Name);
  17. }
  18. //--- TNamedObject ----------------------------------------------------------
  19. Integer __fastcall TNamedObject::CompareName(AnsiString aName,
  20. Boolean CaseSensitive)
  21. {
  22. if (CaseSensitive)
  23. return Name.AnsiCompare(aName);
  24. else
  25. return Name.AnsiCompareIC(aName);
  26. }
  27. //---------------------------------------------------------------------------
  28. void __fastcall TNamedObject::MakeUniqueIn(TNamedObjectList * List)
  29. {
  30. // This object can't be item of list, it would create infinite loop
  31. if (List && (List->IndexOf(this) == -1))
  32. while (List->FindByName(Name))
  33. {
  34. Integer N = 0, P;
  35. // If name already contains number parenthesis remove it (and remember it)
  36. if ((Name[Name.Length()] == ')') && ((P = Name.LastDelimiter('(')) > 0))
  37. try {
  38. N = StrToInt(Name.SubString(P + 1, Name.Length() - P - 1));
  39. Name.Delete(P, Name.Length() - P + 1);
  40. Name = Name.TrimRight();
  41. } catch (Exception &E) { N = 0; };
  42. Name += " (" + IntToStr(N+1) + ")";
  43. }
  44. }
  45. //--- TNamedObjectList ------------------------------------------------------
  46. const AnsiString TNamedObjectList::HiddenPrefix = "_!_";
  47. //---------------------------------------------------------------------------
  48. bool __fastcall TNamedObjectList::IsHidden(TNamedObject * Object)
  49. {
  50. return (Object->Name.SubString(1, HiddenPrefix.Length()) == HiddenPrefix);
  51. }
  52. //---------------------------------------------------------------------------
  53. __fastcall TNamedObjectList::TNamedObjectList():
  54. TObjectList()
  55. {
  56. AutoSort = True;
  57. }
  58. //---------------------------------------------------------------------------
  59. TNamedObject * __fastcall TNamedObjectList::AtObject(Integer Index)
  60. {
  61. return (TNamedObject *)Items[Index+HiddenCount];
  62. }
  63. //---------------------------------------------------------------------------
  64. void __fastcall TNamedObjectList::Recount()
  65. {
  66. int i = 0;
  67. while ((i < TObjectList::Count) && IsHidden((TNamedObject *)Items[i])) i++;
  68. FHiddenCount = i;
  69. }
  70. //---------------------------------------------------------------------------
  71. void __fastcall TNamedObjectList::AlphaSort()
  72. {
  73. Sort(NamedObjectSortProc);
  74. }
  75. //---------------------------------------------------------------------------
  76. void __fastcall TNamedObjectList::Notify(void *Ptr, TListNotification Action)
  77. {
  78. TObjectList::Notify(Ptr, Action);
  79. if (AutoSort && (Action == lnAdded)) AlphaSort();
  80. Recount();
  81. }
  82. //---------------------------------------------------------------------------
  83. TNamedObject * __fastcall TNamedObjectList::FindByName(AnsiString Name,
  84. Boolean CaseSensitive)
  85. {
  86. for (Integer Index = 0; Index < TObjectList::Count; Index++)
  87. if (!((TNamedObject *)Items[Index])->CompareName(Name, CaseSensitive))
  88. return (TNamedObject *)Items[Index];
  89. return NULL;
  90. }
  91. //---------------------------------------------------------------------------
  92. void __fastcall TNamedObjectList::SetCount(int value)
  93. {
  94. TObjectList::SetCount(value/*+HiddenCount*/);
  95. }
  96. //---------------------------------------------------------------------------
  97. int __fastcall TNamedObjectList::GetCount()
  98. {
  99. return TObjectList::Count - HiddenCount;
  100. }