// PaneGauge.cpp : implementation file // // (c)1998-2025 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 "GaugeBrowser.h" #include "PaneGauges.h" #include "PaneAssets.h" #include "MainFrm.h" #include "GaugeRectTracker.h" #include "GaugeBrowserDoc.h" #include "GaugeBrowserView.h" #ifndef INVALID_FILE_ATTRIBUTES # define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif AFX_INLINE BOOL AFXAPI CompareElements(const LPCWSTR* pElement1, const LPCWSTR* pElement2) { return (pElement1 == pElement2 || wcscmp(*pElement1, *pElement2) == 0); } ///////////////////////////////////////////////////////////////////////////// // CPaneGauges CPaneGauges::CPaneGauges() { } CPaneGauges::~CPaneGauges() { } BEGIN_MESSAGE_MAP(CPaneGauges, CStatic) //{{AFX_MSG_MAP(CPaneGauges) ON_WM_CREATE() ON_WM_SIZE() ON_NOTIFY(LVN_ITEMCHANGED, IDC_GAUGE_LIST, OnItemChangedList) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPaneGauges message handlers static int LPCTSTRSortHandler(const void* a, const void* b) { LPCTSTR sa = *reinterpret_cast(a); LPCTSTR sb = *reinterpret_cast(b); return _tcscmp(sa, sb) * -1; } int CPaneGauges::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CStatic::OnCreate(lpCreateStruct) == -1) return -1; if (!m_paneList.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | LVS_ICON | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE, XTP_DPI_RECT(CRect(0, 0, 0, 0)), this, IDC_GAUGE_LIST)) return -1; m_paneList.SetFont(XTPPaintManager()->GetRegularFont()); if (!m_imageList.Create(96, 96, ILC_MASK | ILC_COLOR32, 0, 10)) return -1; ////-- set the image list. const COLORREF imgMask = RGB(255, 0, 255); CBitmap bmpNoPreview; VERIFY(bmpNoPreview.LoadBitmap(IDB_NOPREVIEW)); int nNoPreviewId = m_imageList.Add(&bmpNoPreview, imgMask); m_paneList.SetImageList(&m_imageList, LVSIL_NORMAL); m_paneList.InsertColumn(0, _T("Gauge"), LVCFMT_LEFT, 90); #ifdef LVM_INSERTGROUP m_paneList.EnableGroupView(TRUE); #endif TCHAR szPath[MAX_PATH + 1]; ::GetModuleFileName(NULL, szPath, _countof(szPath)); ::PathRemoveFileSpec(szPath); ::PathAppend(szPath, _T("Gauges")); if (INVALID_FILE_ATTRIBUTES == ::GetFileAttributes(szPath)) { // Go one level up in the directory tree ::PathRemoveFileSpec(szPath); ::PathRemoveFileSpec(szPath); ::PathAppend(szPath, _T("Gauges")); } m_repo.Load(szPath); typedef CList RepoItems; CMap groups; CArray names; int nGroupId = 0; INT_PTR i = 0; for (i = 0; i < m_repo.GetCount(); ++i) { const CGaugeRepo::RepoItem* pItem = m_repo.GetItem(i); _ASSERTE(NULL != pItem); RepoItems*& pItems = groups[pItem->strRelativePath]; if (NULL == pItems) { pItems = new RepoItems(); names.Add(pItem->strRelativePath); } pItems->AddTail(pItem); } qsort(names.GetData(), names.GetSize(), sizeof(LPCTSTR), LPCTSTRSortHandler); for (i = 0; i < names.GetSize(); ++i) { LPCTSTR pName = names[i]; RepoItems* pItems = groups[pName]; #ifdef LVM_INSERTGROUP SIZE_T cchName = _tcslen(pName); PWCHAR pHeaderName = new WCHAR[cchName + 1]; WCSNCPY_S(pHeaderName, cchName + 1, XTP_CT2CW(pName), cchName); LVGROUP group = { 0 }; group.cbSize = sizeof(group); group.mask = LVGF_HEADER | LVGF_GROUPID; group.pszHeader = pHeaderName; group.iGroupId = nGroupId; m_paneList.InsertGroup(0, &group); SAFE_DELETE_AR(pHeaderName); #endif POSITION itemPos = pItems->GetHeadPosition(); while (NULL != itemPos) { const CGaugeRepo::RepoItem* pItem = pItems->GetNext(itemPos); _ASSERTE(NULL != pItem); LVITEM item = { 0 }; item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; item.iImage = nNoPreviewId; item.pszText = const_cast(pItem->strName.operator LPCTSTR()); item.lParam = XTPToLPARAM(pItem); #ifdef LVM_INSERTGROUP item.mask |= LVIF_GROUPID; item.iGroupId = nGroupId; #endif if (NULL != pItem->pPreviewImg) { int nImgId = m_imageList.Add(pItem->pPreviewImg, imgMask); item.iImage = nImgId; } m_paneList.InsertItem(&item); } ++nGroupId; } for (i = 0; i < m_repo.GetCount(); ++i) { const CGaugeRepo::RepoItem* pItem = m_repo.GetItem(i); _ASSERTE(NULL != pItem); RepoItems*& pItems = groups[pItem->strRelativePath]; SAFE_DELETE(pItems); } m_paneList.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); return 0; } void CPaneGauges::OnSize(UINT nType, int cx, int cy) { CStatic::OnSize(nType, cx, cy); if (::IsWindow(m_paneList.m_hWnd)) { m_paneList.MoveWindow(0, 0, XTP_DPI_X(cx), XTP_DPI_Y(cy)); m_paneList.Invalidate(FALSE); } } void CPaneGauges::OnItemChangedList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMLV = (NM_LISTVIEW*)pNMHDR; if (0 == (pNMLV->uChanged & LVIF_STATE) || 0 == (pNMLV->uNewState & LVIS_SELECTED)) return; const CString& strPath = reinterpret_cast(pNMLV->lParam)->strPath; if (!theApp.OpenDocumentFile(strPath)) { TRACE(_T("Unable to open '%s'\n"), strPath); } *pResult = 0; }