xmake.repo/packages/n/noesis/latest/Include/NsGui/ItemCollection.h

166 lines
5.2 KiB
C
Raw Normal View History

2024-12-22 19:15:02 +08:00
////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_ITEMCOLLECTION_H__
#define __GUI_ITEMCOLLECTION_H__
#include <NsCore/Noesis.h>
#include <NsCore/BaseComponent.h>
#include <NsCore/ReflectionDeclare.h>
#include <NsCore/Delegate.h>
#include <NsGui/CoreApi.h>
#include <NsGui/ICollectionView.h>
#include <NsGui/IList.h>
#include <NsGui/INotifyCollectionChanged.h>
#include <NsGui/IComponentInitializer.h>
#include <NsGui/IUITreeNode.h>
namespace Noesis
{
class DependencyObject;
class ItemsControl;
template<class T> class UICollection;
class CollectionView;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251 4275)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Holds the list of items that constitute the content of an ItemsControl.
///
/// https://msdn.microsoft.com/en-us/library/system.windows.controls.itemcollection.aspx
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_CORE_API ItemCollection: public BaseComponent, public IList, public ICollectionView,
public INotifyCollectionChanged, public IComponentInitializer,
public IUITreeNode
{
public:
ItemCollection(ItemsControl* itemsControl);
~ItemCollection();
/// To be called from ItemsControl when the ItemsSource is assigned with a CollectionView
void SetView(CollectionView* view);
/// Check if the itemcollection is related to an external collection, and so it is readonly
bool IsReadOnly() const;
/// Gets the item at the specified index
Ptr<BaseComponent> GetItemAt(uint32_t index) const;
/// Sets the item at the specified index
void Set(uint32_t index, BaseComponent* item);
/// Adds an item to the collection. Returns The position into which the new element was
/// inserted, or -1 to indicate that the item was not inserted into the collection
int Add(BaseComponent* item);
/// Inserts an item to the collection at the specified index
void Insert(uint32_t index, BaseComponent* item);
/// Determines the index of a specific item in the collection. Returns -1 if not found
int IndexOf(const BaseComponent* item) const;
/// Removes the first occurrence of a specific object from the collection. Returns true if item
/// was removed, false to indicate that the item was not found in the collection
bool Remove(const BaseComponent* item);
/// From IList
//@{
Ptr<BaseComponent> GetComponent(uint32_t index) const final;
void SetComponent(uint32_t index, BaseComponent* item) final;
int AddComponent(BaseComponent* item) final;
void InsertComponent(uint32_t index, BaseComponent* item) final;
int IndexOfComponent(const BaseComponent* item) const final;
void RemoveAt(uint32_t index) final;
int Count() const final;
void Clear() final;
//@}
/// From ICollectionView
//@{
bool CanFilter() const final;
bool CanGroup() const final;
bool CanSort() const final;
bool Contains(const BaseComponent* item) const final;
Ptr<BaseComponent> CurrentItem() const final;
int CurrentPosition() const final;
bool IsCurrentAfterLast() const final;
bool IsCurrentBeforeFirst() const final;
bool IsEmpty() const final;
bool MoveCurrentTo(BaseComponent* item) final;
bool MoveCurrentToFirst() final;
bool MoveCurrentToLast() final;
bool MoveCurrentToNext() final;
bool MoveCurrentToPosition(int position) final;
bool MoveCurrentToPrevious() final;
void Refresh() final;
EventHandler& CurrentChanged() final;
//@}
/// From INotifyCollectionChanged
//@{
NotifyCollectionChangedEventHandler& CollectionChanged() final;
//@}
/// From IComponentInitializer
//@{
bool IsInitialized() const override;
void Init() override;
void BeginInit() override;
void EndInit() override;
//@}
/// From IUITreeNode
//@{
IUITreeNode* GetNodeParent() const final;
void SetNodeParent(IUITreeNode* parent) final;
BaseComponent* FindNodeResource(const char* key, bool fullElementSearch) const final;
ObjectWithNameScope FindNodeName(const char* name) const final;
//@}
NS_IMPLEMENT_INTERFACE_FIXUP
private:
bool CheckReadOnly() const;
void ConnectChildren() const;
void DisconnectChildren() const;
void OnCollectionChanged(BaseComponent* sender,
const NotifyCollectionChangedEventArgs& args);
void OnCurrentChanged(BaseComponent* sender, const EventArgs& args);
void ConnectCollection();
void DisconnectCollection();
void RegisterDelegates();
void UnregisterDelegates();
void Reset(DependencyObject* d);
private:
bool mIsInitialized;
ItemsControl* mItemsControl;
Ptr<UICollection<BaseComponent>> mLocalCollection;
Ptr<CollectionView> mEffectiveCollectionView;
EventHandler mCurrentChanged;
NotifyCollectionChangedEventHandler mCollectionChanged;
NS_DECLARE_REFLECTION(ItemCollection, BaseComponent)
};
NS_WARNING_POP
}
#endif