You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
558 lines
13 KiB
C++
558 lines
13 KiB
C++
// XTPGalleryListBox.cpp : implementation file
|
|
//
|
|
// This file is a part of the XTREME RIBBON MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Common/XTPIntel80Helpers.h"
|
|
#include "Common/XTPImageManager.h"
|
|
#include "Common/XTPSystemHelpers.h"
|
|
#include "Common/XTPHookManager.h"
|
|
#include "Common/XTPColorManager.h"
|
|
#include "Common/XTPDrawHelpers.h"
|
|
#include "Common/XTPToolTipContext.h"
|
|
|
|
#include "Ribbon/Resource.h"
|
|
#include "XTPCommandBarsDefines.h"
|
|
#include "XTPCommandBars.h"
|
|
#include "XTPCommandBar.h"
|
|
#include "XTPControls.h"
|
|
#include "XTPControl.h"
|
|
#include "XTPControlButton.h"
|
|
#include "XTPControlPopup.h"
|
|
#include "XTPScrollBase.h"
|
|
#include "XTPControlGallery.h"
|
|
#include "XTPGalleryListBox.h"
|
|
#include "XTPPaintManager.h"
|
|
#include "XTPRecentFileList.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define ID_ICON_PINNED 1000
|
|
#define ID_ICON_UNPINNED 1001
|
|
|
|
class CXTPGalleryListBoxItems : public CXTPControlGalleryItems
|
|
{
|
|
public:
|
|
CXTPGalleryListBoxItems(CXTPGalleryListBox* pParent)
|
|
: CXTPControlGalleryItems(NULL)
|
|
{
|
|
m_pParent = pParent;
|
|
}
|
|
void OnItemsChanged()
|
|
{
|
|
CXTPControlGallery* pGallery = m_pParent->GetGallery();
|
|
pGallery->OnItemsChanged();
|
|
}
|
|
|
|
CXTPGalleryListBox* GetListBox() const {
|
|
return m_pParent;
|
|
}
|
|
|
|
protected:
|
|
CXTPGalleryListBox* m_pParent;
|
|
};
|
|
|
|
class CXTPControlListBoxGallery : public CXTPControlGallery
|
|
{
|
|
public:
|
|
CXTPControlListBoxGallery(CXTPGalleryListBox* pParent)
|
|
{
|
|
m_pParent = pParent;
|
|
}
|
|
virtual CXTPControlGalleryItems* GetItems() const
|
|
{
|
|
return m_pParent->GetItems();
|
|
}
|
|
|
|
void OnExecute()
|
|
{
|
|
CXTPControlGalleryItem* pItem = GetItem(GetSelectedItem());
|
|
if (pItem)
|
|
{
|
|
if (pItem->OnClick())
|
|
return;
|
|
}
|
|
|
|
m_pParent->OnExecute();
|
|
|
|
}
|
|
|
|
|
|
protected:
|
|
CXTPGalleryListBox* m_pParent;
|
|
};
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPRibbonBackstageList
|
|
|
|
CXTPGalleryListBox::CXTPGalleryListBox()
|
|
{
|
|
m_pGallery = (CXTPControlGallery*)GetControls()->Add(new CXTPControlListBoxGallery(this));
|
|
m_pGallery->SetTransparent(TRUE);
|
|
|
|
m_pItems = new CXTPGalleryListBoxItems(this);
|
|
|
|
m_pImageManager = m_pItems->GetImageManager();
|
|
m_pImageManager->InternalAddRef();
|
|
|
|
|
|
SetPaintManager(CXTPPaintManager::CreateTheme(xtpThemeRibbon));
|
|
|
|
m_pGallery->SetScrollBarAuto(TRUE);
|
|
|
|
m_ptLastMousePos = CPoint(-1, -1);
|
|
}
|
|
|
|
CXTPGalleryListBox::~CXTPGalleryListBox()
|
|
{
|
|
CMDTARGET_RELEASE(m_pItems);
|
|
}
|
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPGalleryListBox, CXTPCommandBar)
|
|
//{{AFX_MSG_MAP(CXTPGalleryListBox)
|
|
ON_WM_SIZE()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_GETDLGCODE()
|
|
ON_WM_MOUSEWHEEL()
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_MOUSEMOVE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPRibbonBackstageList message handlers
|
|
|
|
void CXTPGalleryListBox::RecalcLayout()
|
|
{
|
|
if (!m_hWnd)
|
|
return;
|
|
|
|
CXTPClientRect rc(this);
|
|
|
|
m_pGallery->SetRect(rc);
|
|
}
|
|
|
|
void CXTPGalleryListBox::FillCommandBarEntry(CDC* pDC)
|
|
{
|
|
CXTPClientRect rc(this);
|
|
pDC->FillSolidRect(rc, GetXtremeColor(COLOR_WINDOW));
|
|
}
|
|
|
|
|
|
void CXTPGalleryListBox::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CXTPCommandBar::OnSize(nType, cx, cy);
|
|
|
|
RecalcLayout();
|
|
}
|
|
|
|
void CXTPGalleryListBox::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
SetFocus();
|
|
|
|
CXTPCommandBar::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void CXTPGalleryListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (OnHookKeyDown(nChar, MAKELPARAM(nRepCnt, nFlags)))
|
|
return;
|
|
}
|
|
|
|
UINT CXTPGalleryListBox::OnGetDlgCode()
|
|
{
|
|
return DLGC_WANTALLKEYS;
|
|
}
|
|
|
|
BOOL CXTPGalleryListBox::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
|
|
{
|
|
m_pGallery->OnHookMouseWheel(nFlags, zDelta, pt);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CXTPGalleryListBox::OnExecute()
|
|
{
|
|
GetOwner()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(),
|
|
BN_CLICKED), (LPARAM)m_hWnd);
|
|
}
|
|
|
|
|
|
void CXTPGalleryListBox::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CWnd::OnSetFocus(pOldWnd);
|
|
|
|
}
|
|
|
|
void CXTPGalleryListBox::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CWnd::OnKillFocus(pNewWnd);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL CXTPGalleryListBox::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
|
|
{
|
|
|
|
return CXTPCommandBar::OnWndMsg(message, wParam, lParam, pResult);
|
|
}
|
|
|
|
void CXTPGalleryListBox::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_ptLastMousePos == point)
|
|
return;
|
|
|
|
m_ptLastMousePos = point;
|
|
|
|
CXTPCommandBar::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
|
|
class CXTPRecentFileListBoxItem : public CXTPControlGalleryItem
|
|
{
|
|
public:
|
|
CXTPRecentFileListBoxItem(CXTPRecentFileListItem* pRecentItem);
|
|
|
|
public:
|
|
virtual CSize GetSize();
|
|
virtual void Draw(CDC* pDC, CXTPControlGallery* pGallery, CRect rcItem, BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked);
|
|
|
|
|
|
protected:
|
|
CXTPRecentFileListItem* m_pRecentItem;
|
|
};
|
|
|
|
class CXTPRecentFileListBoxPinItem : public CXTPControlGalleryItem
|
|
{
|
|
public:
|
|
CXTPRecentFileListBoxPinItem(CXTPRecentFileListItem* pRecentItem);
|
|
|
|
public:
|
|
virtual CSize GetSize();
|
|
virtual BOOL OnClick();
|
|
virtual void Draw(CDC* pDC, CXTPControlGallery* pGallery, CRect rcItem, BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked);
|
|
|
|
protected:
|
|
CXTPRecentFileListItem* m_pRecentItem;
|
|
|
|
};
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPRecentFileListBoxPinItem
|
|
|
|
CXTPRecentFileListBoxPinItem::CXTPRecentFileListBoxPinItem(CXTPRecentFileListItem* pRecentItem)
|
|
{
|
|
m_pRecentItem = pRecentItem;
|
|
SetData((DWORD_PTR)pRecentItem);
|
|
}
|
|
|
|
|
|
CSize CXTPRecentFileListBoxPinItem::GetSize()
|
|
{
|
|
return CSize(20, 36);
|
|
}
|
|
|
|
BOOL CXTPRecentFileListBoxPinItem::OnClick()
|
|
{
|
|
m_pRecentItem->SetPinned(!m_pRecentItem->IsPinned());
|
|
|
|
|
|
CXTPGalleryListBoxItems* pItems = (CXTPGalleryListBoxItems*)m_pItems;
|
|
|
|
CXTPRecentFileListBox* pListBox = (CXTPRecentFileListBox*)pItems->GetListBox();
|
|
|
|
pListBox->BuildItems(m_pRecentItem->GetList());
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CXTPRecentFileListBoxPinItem::Draw(CDC* pDC, CXTPControlGallery* pGallery, CRect rcItem, BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked)
|
|
{
|
|
CXTPPaintManager* pPaintManager = pGallery->GetPaintManager();
|
|
|
|
if (bSelected && m_pRecentItem->IsPinned())
|
|
bPressed = TRUE;
|
|
|
|
pPaintManager->DrawRectangle(pDC, rcItem, bSelected, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, xtpBarPopup);
|
|
|
|
CXTPGalleryListBoxItems* pItems = (CXTPGalleryListBoxItems*)m_pItems;
|
|
|
|
CXTPRecentFileListBox* pListBox = (CXTPRecentFileListBox*)pItems->GetListBox();
|
|
|
|
CXTPImageManagerIcon* pIcon = pListBox->GetImageManager()->GetImage(m_pRecentItem->IsPinned() ? ID_ICON_PINNED : ID_ICON_UNPINNED);
|
|
|
|
if (pIcon)
|
|
{
|
|
pIcon->Draw(pDC, CPoint((rcItem.left + rcItem.right - pIcon->GetExtent().cx) / 2, (rcItem.top + rcItem.bottom - pIcon->GetExtent().cy) / 2));
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPGalleryListBoxSeparatorItem
|
|
|
|
CXTPGalleryListBoxSeparatorItem::CXTPGalleryListBoxSeparatorItem()
|
|
{
|
|
m_bLabel = TRUE;
|
|
}
|
|
|
|
CSize CXTPGalleryListBoxSeparatorItem::GetSize()
|
|
{
|
|
if (m_szItem.cy != 0)
|
|
return CSize(0, m_szItem.cy);
|
|
|
|
return CSize(0, 14);
|
|
}
|
|
|
|
void CXTPGalleryListBoxSeparatorItem::Draw(CDC* pDC, CXTPControlGallery* /*pGallery*/, CRect rcItem, BOOL /*bEnabled*/, BOOL /*bSelected*/, BOOL /*bPressed*/, BOOL /*bChecked*/)
|
|
{
|
|
const unsigned short _cb[] = {0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc};
|
|
|
|
CBitmap bmp;
|
|
bmp.CreateBitmap(8, 8, 1, 1, _cb);
|
|
|
|
CBrush brush;
|
|
brush.CreatePatternBrush(&bmp);
|
|
|
|
CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);
|
|
|
|
pDC->SetTextColor(RGB(255, 255, 255));
|
|
pDC->SetBkColor(RGB(199, 200, 201));
|
|
|
|
PatBlt(pDC->GetSafeHdc(), rcItem.left, (rcItem.top + rcItem.bottom) / 2, rcItem.Width() - 10, 1, PATCOPY);
|
|
|
|
pDC->SelectObject(pOldBrush);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPRibbonBackstageRecentFileListItem
|
|
|
|
CXTPRecentFileListBoxItem::CXTPRecentFileListBoxItem(CXTPRecentFileListItem* pRecentItem)
|
|
{
|
|
m_pRecentItem = pRecentItem;
|
|
SetData((DWORD_PTR)pRecentItem);
|
|
|
|
m_strCaption = m_pRecentItem->GetPathName();
|
|
|
|
SetToolTip(m_strCaption);
|
|
}
|
|
|
|
CSize CXTPRecentFileListBoxItem::GetSize()
|
|
{
|
|
CXTPGalleryListBoxItems* pItems = (CXTPGalleryListBoxItems*)m_pItems;
|
|
|
|
CXTPGalleryListBox* pListBox = pItems->GetListBox();
|
|
if (!pListBox->GetSafeHwnd())
|
|
return 0;
|
|
|
|
CXTPControlGallery* pGallery = pListBox->GetGallery();
|
|
|
|
CRect rcItems = pGallery->GetItemsRect();
|
|
|
|
return CSize(rcItems.Width() - 30, 36);
|
|
}
|
|
|
|
void CXTPRecentFileListBoxItem::Draw(CDC* pDC, CXTPControlGallery* pGallery, CRect rcItem, BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked)
|
|
{
|
|
CXTPPaintManager* pPaintManager = pGallery->GetPaintManager();
|
|
|
|
CXTPImageManagerIcon* pImage = GetImage();
|
|
|
|
pPaintManager->DrawRectangle(pDC, rcItem, bSelected, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, xtpBarPopup);
|
|
|
|
CSize szImage(32, 32);
|
|
|
|
if (pImage)
|
|
{
|
|
CPoint pt(rcItem.left + 7, rcItem.top + 2);
|
|
|
|
pImage->Draw(pDC, pt, CSize(32, 32));
|
|
}
|
|
else
|
|
{
|
|
SHFILEINFO sfi;
|
|
if (SUCCEEDED(::SHGetFileInfo(m_strCaption, 0, &sfi, sizeof(SHFILEINFO), SHGFI_LARGEICON | SHGFI_ICON)) && sfi.hIcon)
|
|
{
|
|
DrawIconEx(pDC->GetSafeHdc(), rcItem.left + 7, rcItem.top + 2, sfi.hIcon, 32, 32, 0, 0, DI_NORMAL);
|
|
|
|
DestroyIcon(sfi.hIcon);
|
|
}
|
|
|
|
}
|
|
|
|
CRect rcText(rcItem);
|
|
rcText.DeflateRect(50, 2, 2, 2);
|
|
|
|
CRect rcFileName(rcText.left, rcText.top, rcText.right, (rcText.bottom + rcText.top) / 2);
|
|
CRect rcFileFolder(rcText.left, rcFileName.bottom, rcText.right, rcText.bottom);
|
|
|
|
int nIndex = m_strCaption.ReverseFind(_T('\\'));
|
|
|
|
CString strFileName;
|
|
CString strFileFolder;
|
|
if (nIndex != -1)
|
|
{
|
|
strFileName = m_strCaption.Mid(nIndex + 1);
|
|
strFileFolder = m_strCaption.Left(nIndex);
|
|
}
|
|
else
|
|
{
|
|
strFileName = m_strCaption;
|
|
}
|
|
|
|
CXTPFontDC font(pDC, pPaintManager->GetRegularFont());
|
|
|
|
pDC->SetTextColor(RGB(38, 38, 38));
|
|
pDC->DrawText(strFileName, rcFileName, DT_END_ELLIPSIS | DT_LEFT | DT_NOPREFIX | DT_VCENTER | DT_SINGLELINE);
|
|
|
|
pDC->SetTextColor(RGB(111, 111, 111));
|
|
pDC->DrawText(strFileFolder, rcFileFolder, DT_END_ELLIPSIS | DT_LEFT | DT_NOPREFIX | DT_VCENTER | DT_SINGLELINE);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPRecentFileListBox
|
|
|
|
|
|
CXTPRecentFileListBox::CXTPRecentFileListBox()
|
|
{
|
|
m_pToolTipContext = new CXTPToolTipContext();
|
|
|
|
|
|
UINT nID[] = {0, ID_ICON_UNPINNED, ID_ICON_PINNED};
|
|
|
|
GetImageManager()->SetIcons(XTP_IDB_RIBBON_PINICON, nID, 3, CSize(16, 16), xtpImageNormal);
|
|
}
|
|
|
|
CRecentFileList* CXTPRecentFileListBox::GetRecentFileList() const
|
|
{
|
|
USES_PROTECTED_ACCESS(CXTPRecentFileListBox, CWinApp, CRecentFileList*, m_pRecentFileList)
|
|
return PROTECTED_ACCESS(CWinApp, AfxGetApp(), m_pRecentFileList);
|
|
}
|
|
|
|
void CXTPRecentFileListBox::BuildItems()
|
|
{
|
|
CXTPRecentFileList* pRecentFileList = (CXTPRecentFileList*)GetRecentFileList();
|
|
ASSERT (pRecentFileList && pRecentFileList->m_strOriginal == _T("PinableRecentFileList"));
|
|
|
|
if (pRecentFileList && pRecentFileList->m_strOriginal == _T("PinableRecentFileList"))
|
|
{
|
|
BuildItems((CXTPRecentFileList*)pRecentFileList);
|
|
}
|
|
|
|
}
|
|
void CXTPRecentFileListBox::BuildItems(CXTPRecentFileList* pRecentFileList)
|
|
{
|
|
ASSERT (pRecentFileList);
|
|
if (!pRecentFileList)
|
|
return;
|
|
|
|
DWORD_PTR dwSelectedRecentItem = 0;
|
|
|
|
CXTPControlGalleryItem* pSelectedItem = GetGallery()->GetItem(GetGallery()->GetSelectedItem());
|
|
if (pSelectedItem)
|
|
{
|
|
dwSelectedRecentItem = pSelectedItem->GetData();
|
|
}
|
|
pSelectedItem = NULL;
|
|
|
|
m_pItems->RemoveAll();
|
|
|
|
int nIndex;
|
|
BOOL bAllPinned = TRUE;
|
|
|
|
for (nIndex = 0; nIndex < pRecentFileList->m_nSize; nIndex++)
|
|
{
|
|
CXTPRecentFileListItem* pItem = pRecentFileList->GetItem(nIndex);
|
|
if (!pItem)
|
|
break;
|
|
|
|
if (pItem->IsPinned())
|
|
{
|
|
CXTPControlGalleryItem* p = m_pItems->AddItem(new CXTPRecentFileListBoxItem(pItem));
|
|
p->SetID(ID_FILE_MRU_FILE1 + nIndex);
|
|
|
|
m_pItems->AddItem(new CXTPRecentFileListBoxPinItem(pItem));
|
|
|
|
if ((DWORD_PTR)pItem == dwSelectedRecentItem)
|
|
{
|
|
pSelectedItem = p;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bAllPinned = FALSE;
|
|
}
|
|
}
|
|
|
|
if (m_pItems->GetItemCount() && !bAllPinned)
|
|
{
|
|
m_pItems->AddItem(new CXTPGalleryListBoxSeparatorItem());
|
|
}
|
|
|
|
for (nIndex = 0; nIndex < pRecentFileList->m_nSize; nIndex++)
|
|
{
|
|
CXTPRecentFileListItem* pItem = pRecentFileList->GetItem(nIndex);
|
|
if (!pItem)
|
|
break;
|
|
|
|
if (!pItem->IsPinned())
|
|
{
|
|
CXTPControlGalleryItem* p = m_pItems->AddItem(new CXTPRecentFileListBoxItem(pItem));
|
|
p->SetID(ID_FILE_MRU_FILE1 + nIndex);
|
|
|
|
m_pItems->AddItem(new CXTPRecentFileListBoxPinItem(pItem));
|
|
|
|
if ((DWORD_PTR)pItem == dwSelectedRecentItem)
|
|
{
|
|
pSelectedItem = p;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pSelectedItem)
|
|
{
|
|
GetGallery()->SetSelectedItem(pSelectedItem->GetIndex());
|
|
}
|
|
|
|
Redraw(0, FALSE);
|
|
}
|
|
|
|
|