summaryrefslogtreecommitdiff
path: root/win/SortHead.cpp
diff options
context:
space:
mode:
authorleo1999-12-13 17:36:12 +0000
committerleo1999-12-13 17:36:12 +0000
commitba95dc72674b7b517a771b79df96fa50c77b590e (patch)
tree8c0cb0fa5fb50bd508be2bdaee499e2134ebf6d1 /win/SortHead.cpp
parentd74841ebfc386e35c57d474742cc8fcbe543f6ff (diff)
Added an icon to indicate the sort order of the pieces list
git-svn-id: http://svn.leocad.org/trunk@31 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'win/SortHead.cpp')
-rwxr-xr-xwin/SortHead.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/win/SortHead.cpp b/win/SortHead.cpp
new file mode 100755
index 0000000..f3e65d2
--- /dev/null
+++ b/win/SortHead.cpp
@@ -0,0 +1,163 @@
+// SortHead.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "leocad.h"
+#include "SortHead.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CSortHeaderCtrl
+
+CSortHeaderCtrl::CSortHeaderCtrl()
+{
+ m_nSortCol = -1;
+}
+
+CSortHeaderCtrl::~CSortHeaderCtrl()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CHeaderCtrl)
+ //{{AFX_MSG_MAP(CSortHeaderCtrl)
+ // NOTE - the ClassWizard will add and remove mapping macros here.
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CSortHeaderCtrl message handlers
+
+int CSortHeaderCtrl::SetSortImage(int nCol, BOOL bAsc)
+{
+ int nPrevCol = m_nSortCol;
+
+ m_nSortCol = nCol;
+ m_bSortAsc = bAsc;
+
+ // Change the item to ownder drawn
+ HD_ITEM hditem;
+
+ hditem.mask = HDI_FORMAT;
+ GetItem(nCol, &hditem);
+ hditem.fmt |= HDF_OWNERDRAW;
+ SetItem(nCol, &hditem);
+
+ // Invalidate header control so that it gets redrawn
+ Invalidate();
+
+ return nPrevCol;
+}
+
+void CSortHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
+{
+ CDC dc;
+ dc.Attach(lpDrawItemStruct->hDC);
+
+ // Get the column rect
+ CRect rcLabel(lpDrawItemStruct->rcItem);
+
+ // Save DC
+ int nSavedDC = dc.SaveDC();
+
+ // Set clipping region to limit drawing within column
+ CRgn rgn;
+ rgn.CreateRectRgnIndirect(&rcLabel);
+ dc.SelectObject(&rgn);
+ rgn.DeleteObject();
+
+ // Draw the background
+ dc.FillRect(rcLabel, &CBrush(::GetSysColor(COLOR_3DFACE)));
+
+ // Labels are offset by a certain amount
+ // This offset is related to the width of a space character
+ int offset = dc.GetTextExtent(_T(" "), 1 ).cx*2;
+
+ // Get the column text and format
+ TCHAR buf[256];
+ HD_ITEM hditem;
+ hditem.mask = HDI_TEXT | HDI_FORMAT;
+ hditem.pszText = buf;
+ hditem.cchTextMax = 255;
+
+ GetItem(lpDrawItemStruct->itemID, &hditem);
+
+ // Determine format for drawing column label
+ UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
+ | DT_VCENTER | DT_END_ELLIPSIS ;
+
+ if (hditem.fmt & HDF_CENTER)
+ uFormat |= DT_CENTER;
+ else if (hditem.fmt & HDF_RIGHT)
+ uFormat |= DT_RIGHT;
+ else
+ uFormat |= DT_LEFT;
+
+ // Adjust the rect if the mouse button is pressed on it
+ if (lpDrawItemStruct->itemState == ODS_SELECTED)
+ {
+ rcLabel.left++;
+ rcLabel.top += 2;
+ rcLabel.right++;
+ }
+
+ // Adjust the rect further if Sort arrow is to be displayed
+ if (lpDrawItemStruct->itemID == (UINT)m_nSortCol)
+ rcLabel.right -= 3 * offset;
+
+ rcLabel.left += offset;
+ rcLabel.right -= offset;
+
+ // Draw column label
+ if (rcLabel.left < rcLabel.right)
+ dc.DrawText(buf,-1,rcLabel, uFormat);
+
+ // Draw the Sort arrow
+ if (lpDrawItemStruct->itemID == (UINT)m_nSortCol)
+ {
+ CRect rcIcon(lpDrawItemStruct->rcItem);
+
+ // Set up pens to use for drawing the triangle
+ CPen penLight(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
+ CPen penShadow(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
+ CPen *pOldPen = dc.SelectObject(&penLight);
+
+ if (m_bSortAsc)
+ {
+ // Draw triangle pointing upwards
+ dc.MoveTo(rcIcon.right - 2*offset, offset-1);
+ dc.LineTo(rcIcon.right - 3*offset/2, rcIcon.bottom - offset);
+ dc.LineTo(rcIcon.right - 5*offset/2-2, rcIcon.bottom - offset);
+ dc.MoveTo(rcIcon.right - 5*offset/2-1, rcIcon.bottom - offset-1);
+
+ dc.SelectObject(&penShadow);
+ dc.LineTo(rcIcon.right - 2*offset, offset-2);
+ }
+ else
+ {
+ // Draw triangle pointing downwords
+ dc.MoveTo(rcIcon.right - 3*offset/2, offset-1);
+ dc.LineTo(rcIcon.right - 2*offset-1, rcIcon.bottom - offset + 1);
+ dc.MoveTo(rcIcon.right - 2*offset-1, rcIcon.bottom - offset);
+
+ dc.SelectObject(&penShadow);
+ dc.LineTo(rcIcon.right - 5*offset/2-1, offset -1);
+ dc.LineTo(rcIcon.right - 3*offset/2, offset -1);
+ }
+
+ // Restore the pen
+ dc.SelectObject(pOldPen);
+ }
+
+ // Restore dc
+ dc.RestoreDC(nSavedDC);
+
+ // Detach the dc before returning
+ dc.Detach();
+}
+