123
This commit is contained in:
388
Editor/XT/Include/XTTabCtrlBar.h
Normal file
388
Editor/XT/Include/XTTabCtrlBar.h
Normal file
@@ -0,0 +1,388 @@
|
||||
// XTTabCtrlBar.h interface for the CXTTabCtrlBar class.
|
||||
//
|
||||
// This file is a part of the Xtreme Toolkit for MFC.
|
||||
// <20>1998-2003 Codejock Software, All Rights Reserved.
|
||||
//
|
||||
// This source code can only be used under the terms and conditions
|
||||
// outlined in the accompanying license agreement.
|
||||
//
|
||||
// support@codejock.com
|
||||
// http://www.codejock.com
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if !defined(__XTTABCTRLBAR_H__)
|
||||
#define __XTTABCTRLBAR_H__
|
||||
|
||||
#if _MSC_VER >= 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER >= 1000
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Summary: CXTTabCtrlBar is a CXTDockWindow derived class. It is used to implement
|
||||
// a tabbed window similar to Visual Studio's workspace window.
|
||||
class _XT_EXT_CLASS CXTTabCtrlBar : public CXTDockWindow
|
||||
{
|
||||
DECLARE_DYNAMIC(CXTTabCtrlBar)
|
||||
|
||||
public:
|
||||
|
||||
// Summary: Constructs a CXTTabCtrlBar object.
|
||||
CXTTabCtrlBar();
|
||||
|
||||
// Summary: Destroys a CXTTabCtrlBar object, handles cleanup and de-allocation.
|
||||
virtual ~CXTTabCtrlBar();
|
||||
|
||||
protected:
|
||||
|
||||
CXTTabCtrl m_tabCtrl; // The tab control.
|
||||
|
||||
public:
|
||||
|
||||
// Returns: A reference to the CXTTabCtrl object associated with this view.
|
||||
// Summary: Call this member function to return a reference pointer to the CXTTabCtrl
|
||||
// object associated with this view.
|
||||
virtual CXTTabCtrl& GetTabCtrl () const;
|
||||
|
||||
// Input: pImageList - Pointer to the image list to be assigned to the tab control.
|
||||
// Returns: A pointer to the previous image list, or NULL, if there is no previous
|
||||
// image list.
|
||||
// Summary: Call this member function to assign an image list to the tab control
|
||||
// associated with this view.
|
||||
virtual CImageList* SetTabImageList(CImageList *pImageList);
|
||||
|
||||
// Input: popupMenuID - ID for the tab control popup menu.
|
||||
// nPos - Index position in the menu resource.
|
||||
// Summary: This member function is used to set the resource ID for the popup menu
|
||||
// used by the tab control.
|
||||
virtual void SetTabMenuID(UINT popupMenuID,int nPos=0);
|
||||
|
||||
// Returns: The resource ID of the menu associated with the tab control.
|
||||
// Summary: This member function returns the menu resource associated with the
|
||||
// tab control.
|
||||
virtual UINT GetTabMenuID();
|
||||
|
||||
// Input: rcChild - A reference to a CRect object to receive the client coordinates.
|
||||
// Summary: This member function copies the child coordinates of the CTabCtrl client
|
||||
// area into the object referenced by 'rcChild'. The client coordinates
|
||||
// specify the upper-left and lower-right corners of the client area.
|
||||
virtual void GetChildRect(CRect& rcChild) const;
|
||||
|
||||
// Input: pView - A pointer to a CWnd object to be resized.
|
||||
// Summary: Call this member function to resize the tab view specified by 'pView'.
|
||||
virtual void ResizeTabView(CWnd* pView);
|
||||
|
||||
// Summary: This member function is called to initialize the font for the tab control
|
||||
// associated with this view.
|
||||
virtual void InitializeFont();
|
||||
|
||||
// Input: dwRemove - Specifies window styles to be removed during style modification.
|
||||
// dwAdd - Specifies window styles to be added during style modification.
|
||||
// nFlags - Flags to be passed to SetWindowPos, or zero if SetWindowPos
|
||||
// should not be called. The default is zero. See CWnd::ModifyStyle
|
||||
// for more details.
|
||||
// Returns: Nonzero if style was successfully modified, otherwise returns zero.
|
||||
// Summary: This member function will modify the style for the tab control associated
|
||||
// with this view and set the appropriate font depending on the tab's
|
||||
// orientation.
|
||||
virtual BOOL ModifyTabStyle(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0);
|
||||
|
||||
// Returns: The handle of the tooltip control if successful, otherwise returns NULL.
|
||||
// Summary: This member function retrieves the handle of the tooltip control associated
|
||||
// with the tab control. The tab control creates a tooltip control if
|
||||
// it has the TCS_TOOLTIPS style. You can also assign a tooltip control
|
||||
// to a tab control by using the SetToolTips member function.
|
||||
virtual CToolTipCtrl* GetTips();
|
||||
|
||||
// Input: pWndTip - Handle of the tooltip control.
|
||||
// Summary: Call this function to assign a tooltip control to the tab control.
|
||||
// You can associate the tooltip control with a tab control by making
|
||||
// a call to GetToolTips.
|
||||
virtual void SetTips(CToolTipCtrl* pWndTip);
|
||||
|
||||
// Input: nIDTab - Index of the tab.
|
||||
// lpszText - Pointer to the text for the tool.
|
||||
// Summary: Call this function to register a tab with the tooltip control, so
|
||||
// that the information stored in the tooltip is displayed when the cursor
|
||||
// is on the tab.
|
||||
virtual void AddToolTip(UINT nIDTab,LPCTSTR lpszText);
|
||||
|
||||
// Input: nIDTab - Index of the tab.
|
||||
// lpszText - Pointer to the text for the tool.
|
||||
// Summary: Call this function to update the tooltip text for the specified tab.
|
||||
virtual void UpdateToolTip(int nIDTab,LPCTSTR lpszText);
|
||||
|
||||
// Input: pViewClass - CRuntimeClass associated with the tab.
|
||||
// lpszText - Pointer to the text for the tool.
|
||||
// Summary: Call this function to update the tooltip text for the tab specified
|
||||
// by 'pViewClass'.
|
||||
virtual void UpdateToolTip(CRuntimeClass *pViewClass,LPCTSTR lpszText);
|
||||
|
||||
// Summary: This member function is called to reset the values for the tooltip
|
||||
// control based upon the information stored for each tab.
|
||||
virtual void ResetToolTips();
|
||||
|
||||
// Input: bEnable - TRUE to enable tooltip usage.
|
||||
// Returns: TRUE if the tooltip control was found and updated, otherwise returns
|
||||
// FALSE.
|
||||
// Summary: Call this member function to enable or disable tooltip usage.
|
||||
virtual BOOL EnableToolTips(BOOL bEnable);
|
||||
|
||||
// Input: lpszLabel - Pointer to the text for the tab associated with the view.
|
||||
// pViewClass - CView runtime class associated with the tab.
|
||||
// pDoc - CDocument associated with the view.
|
||||
// pContext - Create context for the view.
|
||||
// iIndex - Tab index of where to insert the new view. The default is -1 to
|
||||
// insert the new view at the end.
|
||||
// iIconIndex - Icon index for the tab. If -1, 'iIndex' is used to determine
|
||||
// the index.
|
||||
// Returns: TRUE if successful, otherwise returns FALSE.
|
||||
// Summary: Call this member function to add a view to the tab control associated
|
||||
// with this view.
|
||||
virtual BOOL AddView(LPCTSTR lpszLabel,CRuntimeClass *pViewClass,CDocument* pDoc=NULL,CCreateContext* pContext=NULL,int iIndex=-1,int iIconIndex=-1);
|
||||
|
||||
// Input: lpszLabel - Pointer to the text for the tab associated with the view.
|
||||
// pView - An existing view to be added to the tab control.
|
||||
// iIndex - Tab index of where to insert the new view. The default is -1 to
|
||||
// insert the new view at the end.
|
||||
// iIconIndex - Icon index for the tab. If -1, 'iIndex' is used to determine
|
||||
// the index.
|
||||
// Returns: TRUE if successful, otherwise returns FALSE.
|
||||
// Summary: Call this member function to add a view to the tab control associated
|
||||
// with this view.
|
||||
virtual BOOL AddView(LPCTSTR lpszLabel,CView* pView,int iIndex=-1,int iIconIndex=-1);
|
||||
|
||||
// Input: lpszLabel - Pointer to the text for the tab associated with the view.
|
||||
// pView - CWnd object associated with the tab.
|
||||
// iIndex - Tab index of where to insert the new view. The default is -1 to
|
||||
// add the new view to the end.
|
||||
// iIconIndex - Icon index for the tab. If -1, 'iIndex' is used to determine
|
||||
// the index.
|
||||
// Returns: TRUE if successful, otherwise returns FALSE.
|
||||
// Summary: This member function is called to add a control to the tab control
|
||||
// associated with this view.
|
||||
virtual BOOL AddControl(LPCTSTR lpszLabel,CWnd* pView,int iIndex=-1,int iIconIndex=-1);
|
||||
|
||||
// Input: pViewClass - CView runtime class associated with the tab.
|
||||
// Returns: A pointer to a CView object, otherwise returns NULL.
|
||||
// Summary: This member function returns a pointer to a view from the specified
|
||||
// runtime class.
|
||||
virtual CWnd* GetView(CRuntimeClass *pViewClass);
|
||||
|
||||
// Input: nView - Tab index.
|
||||
// Returns: A pointer to a CView object, otherwise returns NULL.
|
||||
// Summary: This member function returns a pointer to a view from the specified
|
||||
// tab index.
|
||||
virtual CWnd* GetView(int nView);
|
||||
|
||||
// Returns: A pointer to the active view, otherwise returns NULL.
|
||||
// Summary: This member function returns a pointer to the active view associated
|
||||
// with the selected tab.
|
||||
virtual CWnd* GetActiveView();
|
||||
|
||||
// Input: pViewClass - CView runtime class associated with the tab.
|
||||
// Summary: This member function will set a view active based on the specified
|
||||
// runtime class.
|
||||
virtual void SetActiveView(CRuntimeClass *pViewClass);
|
||||
|
||||
// Input: pTabView - CWnd object to make active.
|
||||
// Summary: This member function will set a view active based on the specified
|
||||
// runtime class.
|
||||
virtual void SetActiveView(CWnd* pTabView);
|
||||
|
||||
// Input: nActiveTab - Tab index.
|
||||
// Summary: This member function will set a view active based on the specified
|
||||
// tab index.
|
||||
virtual void SetActiveView(int nActiveTab);
|
||||
|
||||
// Input: nView - Tab index of the view.
|
||||
// bDestroyWnd - TRUE to destroy the list item.
|
||||
// Summary: This member function will remove a view based on the specified
|
||||
// tab index.
|
||||
virtual void DeleteView(int nView,BOOL bDestroyWnd=TRUE);
|
||||
|
||||
// Input: pView - Points to the CWnd object associated with the tab.
|
||||
// bDestroyWnd - TRUE to destroy the list item.
|
||||
// Summary: This member function will remove the view specified by 'pView' from
|
||||
// the tab control.
|
||||
virtual void DeleteView(CWnd* pView,BOOL bDestroyWnd=TRUE);
|
||||
|
||||
// Input: pViewClass - CView runtime class associated with the tab.
|
||||
// bDestroyWnd - TRUE to destroy the list item.
|
||||
// Summary: This member function will remove the view specified by 'pViewClass' from
|
||||
// the tab control.
|
||||
virtual void DeleteView(CRuntimeClass *pViewClass,BOOL bDestroyWnd=TRUE);
|
||||
|
||||
// Input: nView - Tab index of the view.
|
||||
// Returns: A NULL terminated string that represents the tab item text.
|
||||
// Summary: This member function will return the name for a view based on the tab index.
|
||||
virtual LPCTSTR GetViewName(int nView);
|
||||
|
||||
// Input: pViewClass - CView runtime class associated with the tab.
|
||||
// Returns: A NULL terminated string that represents the tab item text.
|
||||
// Summary: This member function will retrieve the name for a view based upon a CWnd object.
|
||||
virtual LPCTSTR GetViewName(CRuntimeClass* pViewClass);
|
||||
|
||||
// Input: bDestroyWnd - TRUE to destroy the window associated with the tab item.
|
||||
// Returns: TRUE if successful, otherwise returns FALSE.
|
||||
// Summary: Call this member function to remove all the tabs including all associated views.
|
||||
virtual BOOL RemoveAllTabs(BOOL bDestroyWnd=TRUE);
|
||||
|
||||
// Input: point - Pointer to a CPoint object that contains the cursor screen coordinates.
|
||||
// Use default for the current cursor position.
|
||||
// Returns: The zero-based index of the tab, or <20>1, if no tab is at the specified point.
|
||||
// Summary: Call this member function to retrieve the tab index from the current
|
||||
// cursor position.
|
||||
virtual int GetTabFromPoint(CPoint point);
|
||||
|
||||
// Input: pView - A pointer to a CWnd object.
|
||||
// Returns: TRUE if the specified CWnd object is a child of the tab control, otherwise
|
||||
// returns FALSE.
|
||||
// Summary: Call this member function to see if the specified CWnd object is a
|
||||
// child of the tab control.
|
||||
virtual BOOL IsChildView(CWnd* pView);
|
||||
|
||||
// Input: bEnable - TRUE to enable auto-condense mode.
|
||||
// Summary: Call this member function to enable or disable the tab auto-condensing
|
||||
// mode. Auto-condensing mode affects the tab control's behavior when
|
||||
// there is not enough room to fit all tabs. Without auto-condensation,
|
||||
// the CXTTabCtrl control behaves like a standard tab control (i.e. it
|
||||
// will display a slider control that allows the user to pan between tabs).
|
||||
// With the auto-condensing mode enabled, CXTTabCtrl attempts to fit all
|
||||
// tabs in the available space by trimming the tab label text. This behavior
|
||||
// is similar to the behavior displayed by Visual C++'s Workspace View.
|
||||
// For instance, you can see the FileView tab shrink if you shrink the
|
||||
// Workspace View.
|
||||
void SetAutoCondense(BOOL bEnable);
|
||||
|
||||
// Returns: TRUE if auto-condense is enabled, otherwise returns FALSE.
|
||||
// Summary: This member function returns the state of the tab control's auto-condense
|
||||
// mode. See SetAutoCondense() for a full explanation of this mode.
|
||||
BOOL GetAutoCondense();
|
||||
|
||||
protected:
|
||||
|
||||
// Ignore:
|
||||
//{{AFX_VIRTUAL(CXTTabCtrlBar)
|
||||
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
|
||||
//}}AFX_VIRTUAL
|
||||
|
||||
virtual void OnTabSelChange(int nIDCtrl, CXTTabCtrl* pTabCtrl);
|
||||
virtual void OnTabSelChanging(int nIDCtrl, CXTTabCtrl* pTabCtrl);
|
||||
|
||||
// Ignore:
|
||||
//{{AFX_MSG(CXTTabCtrlBar)
|
||||
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
|
||||
//}}AFX_MSG
|
||||
|
||||
afx_msg LRESULT OnTabSelChange(WPARAM wParam, LPARAM lParam);
|
||||
afx_msg LRESULT OnTabSelChanging(WPARAM wParam, LPARAM lParam);
|
||||
|
||||
DECLARE_MESSAGE_MAP()
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
AFX_INLINE CXTTabCtrl& CXTTabCtrlBar::GetTabCtrl() const {
|
||||
ASSERT_VALID(this); return (CXTTabCtrl&)m_tabCtrl;
|
||||
}
|
||||
AFX_INLINE CImageList* CXTTabCtrlBar::SetTabImageList(CImageList *pImageList) {
|
||||
ASSERT_VALID(this); return GetTabCtrl().SetImageList(pImageList);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetTabMenuID(UINT popupMenuID, int nPos) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().SetMenuID(popupMenuID, nPos);
|
||||
}
|
||||
AFX_INLINE UINT CXTTabCtrlBar::GetTabMenuID() {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetMenuID();
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::GetChildRect(CRect& rcChild) const {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().GetChildRect(rcChild);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::ResizeTabView(CWnd* pView) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().ResizeTabView(pView);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::InitializeFont() {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().InitializeFont();
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::ModifyTabStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().ModifyTabStyle(dwRemove, dwAdd, nFlags);
|
||||
}
|
||||
AFX_INLINE CToolTipCtrl* CXTTabCtrlBar::GetTips() {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetTips();
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetTips(CToolTipCtrl* pWndTip) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().SetTips(pWndTip);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::AddToolTip(UINT nIDTab, LPCTSTR lpszText) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().AddToolTip(nIDTab, lpszText);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::UpdateToolTip(int nIDTab, LPCTSTR lpszText) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().UpdateToolTip(nIDTab, lpszText);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::UpdateToolTip(CRuntimeClass *pViewClass, LPCTSTR lpszText) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().UpdateToolTip(pViewClass, lpszText);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::ResetToolTips() {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().ResetToolTips();
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::EnableToolTips(BOOL bEnable) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().EnableToolTips(bEnable);
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::AddControl(LPCTSTR lpszLabel, CWnd* pView, int iIndex, int iIconIndex) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().AddControl(lpszLabel, pView, iIndex, iIconIndex);
|
||||
}
|
||||
AFX_INLINE CWnd* CXTTabCtrlBar::GetView(CRuntimeClass *pViewClass) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetView(pViewClass);
|
||||
}
|
||||
AFX_INLINE CWnd* CXTTabCtrlBar::GetView(int nView) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetView(nView);
|
||||
}
|
||||
AFX_INLINE CWnd* CXTTabCtrlBar::GetActiveView() {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetActiveView();
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetActiveView(CRuntimeClass *pViewClass) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().SetActiveView(pViewClass);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetActiveView(CWnd* pTabView) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().SetActiveView(pTabView);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetActiveView(int nActiveTab) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().SetActiveView(nActiveTab);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::DeleteView(int nView, BOOL bDestroyWnd/*=TRUE*/) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().DeleteView(nView, bDestroyWnd);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::DeleteView(CWnd* pView, BOOL bDestroyWnd/*=TRUE*/) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().DeleteView(pView, bDestroyWnd);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::DeleteView(CRuntimeClass *pViewClass, BOOL bDestroyWnd/*=TRUE*/) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); GetTabCtrl().DeleteView(pViewClass, bDestroyWnd);
|
||||
}
|
||||
AFX_INLINE LPCTSTR CXTTabCtrlBar::GetViewName(int nView) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetViewName(nView);
|
||||
}
|
||||
AFX_INLINE LPCTSTR CXTTabCtrlBar::GetViewName(CRuntimeClass *pViewClass) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetViewName(pViewClass);
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::RemoveAllTabs(BOOL bDestroyWnd/*=TRUE*/) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().RemoveAllTabs(bDestroyWnd);
|
||||
}
|
||||
AFX_INLINE int CXTTabCtrlBar::GetTabFromPoint(CPoint point) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().GetTabFromPoint(point);
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::IsChildView(CWnd* pView) {
|
||||
ASSERT(::IsWindow(GetTabCtrl().m_hWnd)); return GetTabCtrl().IsChildView(pView);
|
||||
}
|
||||
AFX_INLINE void CXTTabCtrlBar::SetAutoCondense(BOOL bEnable) {
|
||||
GetTabCtrl().SetAutoCondense(bEnable);
|
||||
}
|
||||
AFX_INLINE BOOL CXTTabCtrlBar::GetAutoCondense() {
|
||||
return GetTabCtrl().GetAutoCondense();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // #if !defined(__XTTABCTRLBAR_H__)
|
||||
Reference in New Issue
Block a user