123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "Common.h"
- #include "NamedObjs.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- //---------------------------------------------------------------------------
- int __fastcall NamedObjectSortProc(void * Item1, void * Item2)
- {
- return static_cast<TNamedObject *>(Item1)->Compare(static_cast<TNamedObject *>(Item2));
- }
- //--- TNamedObject ----------------------------------------------------------
- __fastcall TNamedObject::TNamedObject(UnicodeString AName)
- {
- Name = AName;
- }
- //---------------------------------------------------------------------------
- void __fastcall TNamedObject::SetName(UnicodeString value)
- {
- FHidden = (value.SubString(1, TNamedObjectList::HiddenPrefix.Length()) == TNamedObjectList::HiddenPrefix);
- FName = value;
- }
- //---------------------------------------------------------------------------
- int __fastcall TNamedObject::Compare(TNamedObject * Other)
- {
- int Result;
- if (Hidden && !Other->Hidden)
- {
- Result = -1;
- }
- else if (!Hidden && Other->Hidden)
- {
- Result = 1;
- }
- else
- {
- Result = CompareLogicalText(Name, Other->Name, true);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TNamedObject::IsSameName(const UnicodeString & AName)
- {
- return (Name.CompareIC(AName) == 0);
- }
- //---------------------------------------------------------------------------
- void __fastcall TNamedObject::MakeUniqueIn(TNamedObjectList * List)
- {
- // This object can't be item of list, it would create infinite loop
- if (List && (List->IndexOf(this) == -1))
- while (List->FindByName(Name))
- {
- Integer N = 0, P = 0; // shut up
- // If name already contains number parenthesis remove it (and remember it)
- if ((Name[Name.Length()] == L')') && ((P = Name.LastDelimiter(L'(')) > 0))
- try
- {
- N = StrToInt(Name.SubString(P + 1, Name.Length() - P - 1));
- Name.Delete(P, Name.Length() - P + 1);
- Name = Name.TrimRight();
- }
- catch (Exception &)
- {
- N = 0;
- }
- Name += L" (" + IntToStr(N+1) + L")";
- }
- }
- //--- TNamedObjectList ------------------------------------------------------
- const UnicodeString TNamedObjectList::HiddenPrefix = L"_!_";
- //---------------------------------------------------------------------------
- __fastcall TNamedObjectList::TNamedObjectList():
- TObjectList()
- {
- AutoSort = True;
- FHiddenCount = 0;
- FControlledAdd = false;
- }
- //---------------------------------------------------------------------------
- TNamedObject * __fastcall TNamedObjectList::AtObject(Integer Index)
- {
- return (TNamedObject *)Items[Index+FHiddenCount];
- }
- //---------------------------------------------------------------------------
- void __fastcall TNamedObjectList::Recount()
- {
- int i = 0;
- while ((i < TObjectList::Count) && ((TNamedObject *)Items[i])->Hidden) i++;
- FHiddenCount = i;
- }
- //---------------------------------------------------------------------------
- void __fastcall TNamedObjectList::AlphaSort()
- {
- Sort(NamedObjectSortProc);
- Recount();
- }
- //---------------------------------------------------------------------------
- int __fastcall TNamedObjectList::Add(TObject * AObject)
- {
- int Result;
- TAutoFlag ControlledAddFlag(FControlledAdd);
- TNamedObject * NamedObject = static_cast<TNamedObject *>(AObject);
- // If temporarily not auto-sorting (when loading session list),
- // keep the hidden objects in front, so that HiddenCount is correct
- if (!AutoSort && NamedObject->Hidden)
- {
- Result = 0;
- Insert(Result, AObject);
- FHiddenCount++;
- }
- else
- {
- Result = TObjectList::Add(AObject);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TNamedObjectList::Notify(void *Ptr, TListNotification Action)
- {
- if (Action == lnDeleted)
- {
- TNamedObject * NamedObject = static_cast<TNamedObject *>(Ptr);
- if (NamedObject->Hidden && (FHiddenCount >= 0))
- {
- FHiddenCount--;
- }
- }
- TObjectList::Notify(Ptr, Action);
- if (Action == lnAdded)
- {
- if (!FControlledAdd)
- {
- FHiddenCount = -1;
- }
- if (AutoSort)
- {
- AlphaSort();
- }
- }
- }
- //---------------------------------------------------------------------------
- TNamedObject * __fastcall TNamedObjectList::FindByName(const UnicodeString & Name)
- {
- // This should/can be optimized when list is sorted
- for (Integer Index = 0; Index < CountIncludingHidden; Index++)
- {
- // Not using AtObject as we iterate even hidden objects here
- TNamedObject * NamedObject = static_cast<TNamedObject *>(Items[Index]);
- if (NamedObject->IsSameName(Name))
- {
- return NamedObject;
- }
- }
- return NULL;
- }
- //---------------------------------------------------------------------------
- int __fastcall TNamedObjectList::GetCount()
- {
- DebugAssert(FHiddenCount >= 0);
- return TObjectList::Count - FHiddenCount;
- }
- //---------------------------------------------------------------------------
- int __fastcall TNamedObjectList::GetCountIncludingHidden()
- {
- DebugAssert(FHiddenCount >= 0);
- return TObjectList::Count;
- }
|