annotate foosdk/sdk/libPPUI/CListControl-Cells.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "CListControl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "CListControlHeaderImpl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "CListControl-Cells.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "PaintUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "GDIUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <vsstyle.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "InPlaceEdit.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "DarkMode.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #define PRETEND_CLASSIC_THEME 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #if PRETEND_CLASSIC_THEME
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #define IsThemePartDefined(A,B,C) false
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 LONG CListCell::AccRole() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 return ROLE_SYSTEM_LISTITEM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void RenderCheckbox( HTHEME theme, CDCHandle dc, CRect rcCheckBox, unsigned stateFlags, bool bRadio ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 const int part = bRadio ? BP_RADIOBUTTON : BP_CHECKBOX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 const bool bDisabled = (stateFlags & CListCell::cellState_disabled) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 const bool bPressed = (stateFlags & CListCell::cellState_pressed ) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 const bool bHot = ( stateFlags & CListCell::cellState_hot ) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (theme != NULL && IsThemePartDefined(theme, part, 0)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 int state = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 if (bDisabled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 state = bPressed ? CBS_CHECKEDDISABLED : CBS_UNCHECKEDDISABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 } else if ( bHot ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 state = bPressed ? CBS_CHECKEDHOT : CBS_UNCHECKEDHOT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 state = bPressed ? CBS_CHECKEDNORMAL : CBS_UNCHECKEDNORMAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 CSize size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if (SUCCEEDED(GetThemePartSize(theme, dc, part, state, rcCheckBox, TS_TRUE, &size))) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 if (size.cx <= rcCheckBox.Width() && size.cy <= rcCheckBox.Height()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 CRect rc = rcCheckBox;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 rc.left += ( rc.Width() - size.cx ) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 rc.top += ( rc.Height() - size.cy ) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 rc.right = rc.left + size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 rc.bottom = rc.top + size.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 DrawThemeBackground(theme, dc, part, state, rc, &rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 auto DPI = QueryContextDPI(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 CSize size(MulDiv(13, DPI.cx, 96), MulDiv(13, DPI.cy, 96));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 CSize sizeBig = rcCheckBox.Size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 if (sizeBig.cx >= size.cx && sizeBig.cy >= size.cy) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 CPoint center = rcCheckBox.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 rcCheckBox.left = center.x - size.cx / 2; rcCheckBox.right = rcCheckBox.left + size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 rcCheckBox.top = center.y - size.cy / 2; rcCheckBox.bottom = rcCheckBox.top + size.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 int stateEx = bRadio ? DFCS_BUTTONRADIO : DFCS_BUTTONCHECK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 if ( bPressed ) stateEx |= DFCS_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if ( bDisabled ) stateEx |= DFCS_INACTIVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 else if ( bHot ) stateEx |= DFCS_HOT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 DrawFrameControl(dc, rcCheckBox, DFC_BUTTON, stateEx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void RenderButton( HTHEME theme, CDCHandle dc, CRect rcButton, CRect rcUpdate, uint32_t cellState ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 const int part = BP_PUSHBUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 stNormal = PBS_NORMAL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 stHot = PBS_HOT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 stDisabled = PBS_DISABLED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 stPressed = PBS_PRESSED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 int state = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 if (cellState & CListCell::cellState_disabled) state = stDisabled;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if ( cellState & CListCell::cellState_pressed ) state = stPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 else if ( cellState & CListCell::cellState_hot ) state = stHot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 else state = stNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 CRect rcClient = rcButton;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (theme != NULL && IsThemePartDefined(theme, part, 0)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 DrawThemeBackground(theme, dc, part, state, rcClient, &rcUpdate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 int stateEx = DFCS_BUTTONPUSH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 switch (state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 case stPressed: stateEx |= DFCS_PUSHED; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 case stDisabled: stateEx |= DFCS_INACTIVE; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 DrawFrameControl(dc, rcClient, DFC_BUTTON, stateEx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 bool CListCell::ApplyTextStyle( LOGFONT & font, double scale, uint32_t ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 if ( scale != 1.0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 font.lfHeight = pfc::rint32( font.lfHeight * scale );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 void CListCell_Text::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 const auto fgWas = arg.dc.GetTextColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 if ((arg.cellState & cellState_disabled) != 0 && arg.allowColors) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 dc.SetTextColor(DarkMode::GetSysColor(COLOR_GRAYTEXT, arg.darkMode));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 CRect clip = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (arg.imageRenderer && clip.Width() > clip.Height() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 CRect rcImage = clip; rcImage.right = rcImage.left + clip.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 arg.imageRenderer(dc, rcImage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 clip.left = rcImage.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 const t_uint32 format = PaintUtils::DrawText_TranslateHeaderAlignment(arg.hdrFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 dc.DrawText( arg.text, (int)wcslen(arg.text), clip, format | DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 dc.SetTextColor(fgWas);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void CListCell_TextColors::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 CRect clip = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 const uint32_t fgWas = dc.GetTextColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 const t_uint32 format = PaintUtils::DrawText_TranslateHeaderAlignment(arg.hdrFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 const t_uint32 bk = dc.GetBkColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 const t_uint32 fg = fgWas;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 const t_uint32 hl = (arg.allowColors ? arg.colorHighlight : fg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 const t_uint32 colors[3] = { PaintUtils::BlendColor(bk, fg, 33), fg, hl };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 PaintUtils::TextOutColorsEx(dc, arg.text, clip, format, colors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 dc.SetTextColor(fgWas);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 void CListCell_MultiText::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 const int textLen = (int) wcslen( arg.text );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 CRect clip = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 const t_uint32 format = PaintUtils::DrawText_TranslateHeaderAlignment(arg.hdrFormat) | DT_NOPREFIX | DT_VCENTER ;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 CRect rcDraw = clip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 dc.DrawText(arg.text, textLen, rcDraw, format | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 auto txSize = rcDraw.Size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 rcDraw = clip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if ( txSize.cy < rcDraw.Height() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 int sub = rcDraw.Height() - txSize.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 rcDraw.top += sub/2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 rcDraw.bottom = rcDraw.top + txSize.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 dc.DrawText(arg.text, textLen, rcDraw, format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 bool CListCell_Hyperlink::ApplyTextStyle( LOGFONT & font, double scale, uint32_t state ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 bool rv = __super::ApplyTextStyle(font, scale, state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 if ( state & cellState_hot ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 font.lfUnderline = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 rv = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 HCURSOR CListCell_Hyperlink::HotCursor() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 return LoadCursor(NULL, IDC_HAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 LONG CListCell_Hyperlink::AccRole() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 return ROLE_SYSTEM_LINK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 void CListCell_Hyperlink::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 const uint32_t fgWas = dc.GetTextColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 const t_uint32 format = PaintUtils::DrawText_TranslateHeaderAlignment(arg.hdrFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 if (arg.allowColors) dc.SetTextColor( arg.colorHighlight );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 // const t_uint32 bk = dc.GetBkColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 CRect rc = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 dc.DrawText(arg.text, (int) wcslen(arg.text), rc, format | DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 dc.SetTextColor(fgWas);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 LONG CListCell_Button::AccRole() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 return ROLE_SYSTEM_PUSHBUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 void CListCell_Button::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 const bool bPressed = (arg.cellState & cellState_pressed) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 const bool bHot = (arg.cellState & cellState_hot) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 if ( !m_lite || bHot || bPressed ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 RenderButton( arg.theme, dc, arg.rcHot, arg.rcHot, arg.cellState );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 CRect clip = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 dc.DrawText(arg.text, (int) wcslen(arg.text), clip, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_CENTER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 bool CListCell_ButtonGlyph::ApplyTextStyle( LOGFONT & font, double scale, uint32_t state ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 return __super::ApplyTextStyle(font, scale * 1.3, state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 static CRect CheckBoxRect(CRect rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 if (rc.Width() > rc.Height()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 rc.right = rc.left + rc.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 return rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 LONG CListCell_Checkbox::AccRole() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 return m_radio ? ROLE_SYSTEM_RADIOBUTTON : ROLE_SYSTEM_CHECKBUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 CRect CListCell_Checkbox::HotRect( CRect rc ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 return CheckBoxRect( rc );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 void CListCell_Checkbox::DrawContent( DrawContentArg_t const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 // const bool bPressed = (arg.cellState & cellState_pressed) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 // const bool bHot = (arg.cellState & cellState_hot) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 // CRect clip = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 const uint32_t fgWas = dc.GetTextColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 if (arg.subItemRect.Width() > arg.subItemRect.Height() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 CRect rcCheckbox = arg.subItemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 rcCheckbox.right = rcCheckbox.left + rcCheckbox.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 RenderCheckbox(arg.theme, dc, rcCheckbox, arg.cellState, m_radio );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 CRect rcText = arg.subItemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 rcText.left = rcCheckbox.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 if (arg.cellState & cellState_disabled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 dc.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 if (arg.imageRenderer && rcText.Width() > rcText.Height()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 CRect rcImage = rcText; rcImage.right = rcImage.left + rcImage.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 arg.imageRenderer(dc, rcImage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 rcText.left = rcImage.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 dc.DrawText(arg.text, (int) wcslen(arg.text), rcText, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_LEFT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 RenderCheckbox(arg.theme, dc, arg.subItemRect, arg.cellState, m_radio );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 dc.SetTextColor(fgWas);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 void CListCell_Text_FixedColor::DrawContent(DrawContentArg_t const & arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 if (arg.allowColors) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 SetTextColorScope scope(arg.dc, m_col);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 __super::DrawContent(arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 __super::DrawContent(arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 uint32_t CListCell_Combo::EditFlags() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 return InPlaceEdit::KFlagCombo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 void CListCell_Combo::DrawContent(DrawContentArg_t const & arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 CDCHandle dc = arg.dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 const bool bDisabled = (arg.cellState & CListCell::cellState_disabled) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 const bool bPressed = (arg.cellState & cellState_pressed) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 const bool bHot = (arg.cellState & cellState_hot) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 const int part = CP_DROPDOWNBUTTONRIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 const HTHEME theme = arg.theme;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 const int w = MulDiv(16, GetDeviceCaps(dc, LOGPIXELSX), 96);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 CRect rcText = arg.rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 if (theme != NULL && IsThemePartDefined(theme, part, 0)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 int state = CBXSR_NORMAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 if (bDisabled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 state = CBXSR_DISABLED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 } else if (bPressed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 state = CBXSR_PRESSED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 } else if (bHot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 state = CBXSR_HOT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 CSize size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 CRect rcCombo = arg.subItemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 if (w < rcCombo.Width()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 rcCombo.left = rcCombo.right - w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 DrawThemeBackground(theme, dc, part, state, rcCombo, &rcCombo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 if (rcCombo.left < rcText.right ) rcText.right = rcCombo.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 CRect rcCombo = arg.subItemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 if (w < rcCombo.Width()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 rcCombo.left = rcCombo.right - w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if (rcCombo.left < rcText.right) rcText.right = rcCombo.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (bHot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 DrawFrameControl(dc, rcCombo, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_HOT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 dc.DrawText(L"˅", 1, rcCombo, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 DrawContentArg_t arg2 = arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 arg2.rcText = rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 PFC_SINGLETON(CListCell_Text).DrawContent(arg2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 LONG CListCell_Combo::AccRole() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 return ROLE_SYSTEM_DROPLIST;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }