1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/core/NamedObjs.cpp
Martin Prikryl e5efed8955 Refactoring old-style casts
Source commit: 3c37b3a958525c595ad44b081b2e0f3b288b8eb0
2025-12-18 01:20:33 +01:00

167 lines
5.2 KiB
C++

//---------------------------------------------------------------------------
#include <CorePCH.h>
#pragma hdrstop
#include "NamedObjs.h"
//---------------------------------------------------------------------------
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 CLANG_INITIALIZE(0);
// 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 static_cast<TNamedObject *>(Items[Index+FHiddenCount]);
}
//---------------------------------------------------------------------------
void __fastcall TNamedObjectList::Recount()
{
int i = 0;
while ((i < TObjectList::Count) && static_cast<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;
}