OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/pdfwindow/PDFWindow.h" | 7 #include "../../include/pdfwindow/PDFWindow.h" |
8 #include "../../include/pdfwindow/PWL_Wnd.h" | 8 #include "../../include/pdfwindow/PWL_Wnd.h" |
9 #include "../../include/pdfwindow/PWL_ListBox.h" | 9 #include "../../include/pdfwindow/PWL_ListBox.h" |
10 #include "../../include/pdfwindow/PWL_Utils.h" | 10 #include "../../include/pdfwindow/PWL_Utils.h" |
11 #include "../../include/pdfwindow/PWL_ScrollBar.h" | 11 #include "../../include/pdfwindow/PWL_ScrollBar.h" |
12 #include "../../include/pdfwindow/PWL_EditCtrl.h" | 12 #include "../../include/pdfwindow/PWL_EditCtrl.h" |
13 #include "../../include/pdfwindow/PWL_Edit.h" | 13 #include "../../include/pdfwindow/PWL_Edit.h" |
14 | 14 |
15 #define IsFloatZero(f)» » » » » » ((f) < 0.0001 &&
(f) > -0.0001) | 15 #define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) |
16 #define IsFloatBigger(fa,fb)» » » » ((fa) > (fb) && !IsFloat
Zero((fa) - (fb))) | 16 #define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) |
17 #define IsFloatSmaller(fa,fb)» » » » ((fa) < (fb) && !IsFloat
Zero((fa) - (fb))) | 17 #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) |
18 #define IsFloatEqual(fa,fb)» » » » » IsFloatZero((fa)
-(fb)) | 18 #define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) |
19 | 19 |
20 /* ------------------------ CPWL_List_Notify ----------------------- */ | 20 /* ------------------------ CPWL_List_Notify ----------------------- */ |
21 | 21 |
22 CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList) | 22 CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList) { |
23 { | 23 ASSERT(m_pList != NULL); |
24 » ASSERT(m_pList != NULL); | 24 } |
25 } | 25 |
26 | 26 CPWL_List_Notify::~CPWL_List_Notify() {} |
27 CPWL_List_Notify::~CPWL_List_Notify() | 27 |
28 { | 28 void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, |
29 } | 29 FX_FLOAT fPlateMax, |
30 | 30 FX_FLOAT fContentMin, |
31 void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, | 31 FX_FLOAT fContentMax, |
32 » » » » » » » » » »
» » FX_FLOAT fContentMin, FX_FLOAT fContentMax, | 32 FX_FLOAT fSmallStep, |
33 » » » » » » » » » »
» » FX_FLOAT fSmallStep, FX_FLOAT fBigStep) | 33 FX_FLOAT fBigStep) { |
34 { | 34 PWL_SCROLL_INFO Info; |
35 » PWL_SCROLL_INFO Info; | 35 |
36 | 36 Info.fPlateWidth = fPlateMax - fPlateMin; |
37 » Info.fPlateWidth = fPlateMax - fPlateMin; | 37 Info.fContentMin = fContentMin; |
38 » Info.fContentMin = fContentMin; | 38 Info.fContentMax = fContentMax; |
39 » Info.fContentMax = fContentMax; | 39 Info.fSmallStep = fSmallStep; |
40 » Info.fSmallStep = fSmallStep; | 40 Info.fBigStep = fBigStep; |
41 » Info.fBigStep = fBigStep; | 41 |
42 | 42 m_pList->OnNotify(m_pList, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info); |
43 » m_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(intptr_t)&Info)
; | 43 |
44 | 44 if (CPWL_ScrollBar* pScroll = m_pList->GetVScrollBar()) { |
45 » if (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar()) | 45 if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) || |
46 » { | 46 IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) { |
47 » » if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fConten
tMin) | 47 if (pScroll->IsVisible()) { |
48 » » » || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.f
ContentMin)) | 48 pScroll->SetVisible(FALSE); |
49 » » { | 49 m_pList->RePosChildWnd(); |
50 » » » if (pScroll->IsVisible()) | 50 } |
51 » » » { | 51 } else { |
52 » » » » pScroll->SetVisible(FALSE); | 52 if (!pScroll->IsVisible()) { |
53 » » » » m_pList->RePosChildWnd(); | 53 pScroll->SetVisible(TRUE); |
54 » » » } | 54 m_pList->RePosChildWnd(); |
55 » » } | 55 } |
56 » » else | 56 } |
57 » » { | 57 } |
58 » » » if (!pScroll->IsVisible()) | 58 } |
59 » » » { | 59 |
60 » » » » pScroll->SetVisible(TRUE); | 60 void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy) { |
61 » » » » m_pList->RePosChildWnd(); | 61 m_pList->OnNotify(m_pList, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy); |
62 » » » } | 62 } |
63 » » } | 63 |
64 » } | 64 void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect* pRect) { |
65 } | 65 m_pList->InvalidateRect(pRect); |
66 | |
67 void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy) | |
68 { | |
69 » m_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(intptr_t)&fy); | |
70 } | |
71 | |
72 void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect) | |
73 { | |
74 » m_pList->InvalidateRect(pRect); | |
75 } | 66 } |
76 | 67 |
77 /* --------------------------- CPWL_ListBox ---------------------------- */ | 68 /* --------------------------- CPWL_ListBox ---------------------------- */ |
78 | 69 |
79 CPWL_ListBox::CPWL_ListBox() : | 70 CPWL_ListBox::CPWL_ListBox() |
80 » m_pList(NULL), | 71 : m_pList(NULL), |
81 » m_pListNotify(NULL), | 72 m_pListNotify(NULL), |
82 » m_bMouseDown(FALSE), | 73 m_bMouseDown(FALSE), |
83 » m_bHoverSel(FALSE), | 74 m_bHoverSel(FALSE), |
84 » m_pFillerNotify(NULL) | 75 m_pFillerNotify(NULL) { |
85 { | 76 m_pList = IFX_List::NewList(); |
86 » m_pList = IFX_List::NewList(); | 77 |
87 | 78 ASSERT(m_pList != NULL); |
88 » ASSERT(m_pList != NULL); | 79 } |
89 } | 80 |
90 | 81 CPWL_ListBox::~CPWL_ListBox() { |
91 CPWL_ListBox::~CPWL_ListBox() | 82 IFX_List::DelList(m_pList); |
92 { | 83 delete m_pListNotify; |
93 IFX_List::DelList(m_pList); | 84 m_pListNotify = NULL; |
| 85 } |
| 86 |
| 87 CFX_ByteString CPWL_ListBox::GetClassName() const { |
| 88 return "CPWL_ListBox"; |
| 89 } |
| 90 |
| 91 void CPWL_ListBox::OnCreated() { |
| 92 if (m_pList) { |
94 delete m_pListNotify; | 93 delete m_pListNotify; |
95 m_pListNotify = NULL; | 94 |
96 } | 95 m_pList->SetFontMap(GetFontMap()); |
97 | 96 m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this)); |
98 CFX_ByteString CPWL_ListBox::GetClassName() const | 97 |
99 { | 98 SetHoverSel(HasFlag(PLBS_HOVERSEL)); |
100 return "CPWL_ListBox"; | 99 m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); |
101 } | 100 m_pList->SetFontSize(GetCreationParam().fFontSize); |
102 | 101 |
103 void CPWL_ListBox::OnCreated() | 102 m_bHoverSel = HasFlag(PLBS_HOVERSEL); |
104 { | 103 } |
105 if (m_pList) | 104 } |
106 { | 105 |
107 delete m_pListNotify; | 106 void CPWL_ListBox::OnDestroy() { |
108 | 107 delete m_pListNotify; |
109 m_pList->SetFontMap(GetFontMap()); | 108 m_pListNotify = NULL; |
110 m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this)); | 109 } |
111 | 110 |
112 SetHoverSel(HasFlag(PLBS_HOVERSEL)); | 111 void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { |
113 m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); | 112 CPWL_Wnd::GetThisAppearanceStream(sAppStream); |
114 m_pList->SetFontSize(GetCreationParam().fFontSize); | 113 |
115 | 114 CFX_ByteTextBuf sListItems; |
116 m_bHoverSel = HasFlag(PLBS_HOVERSEL); | 115 |
117 } | 116 if (m_pList) { |
118 } | 117 CPDF_Rect rcPlate = m_pList->GetPlateRect(); |
119 | 118 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { |
120 void CPWL_ListBox::OnDestroy() | 119 CPDF_Rect rcItem = m_pList->GetItemRect(i); |
121 { | 120 |
122 delete m_pListNotify; | 121 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) |
123 m_pListNotify = NULL; | 122 continue; |
124 } | 123 |
125 | 124 CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); |
126 void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) | 125 if (m_pList->IsItemSelected(i)) { |
127 { | 126 sListItems << CPWL_Utils::GetRectFillAppStream( |
128 CPWL_Wnd::GetThisAppearanceStream(sAppStream); | 127 rcItem, PWL_DEFAULT_SELBACKCOLOR); |
129 | 128 CFX_ByteString sItem = |
130 CFX_ByteTextBuf sListItems; | 129 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); |
131 | 130 if (sItem.GetLength() > 0) { |
132 if (m_pList) | 131 sListItems << "BT\n" |
133 { | 132 << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) |
134 CPDF_Rect rcPlate = m_pList->GetPlateRect(); | 133 << sItem << "ET\n"; |
135 for (int32_t i=0,sz=m_pList->GetCount(); i<sz; i++) | 134 } |
136 { | 135 } else { |
137 CPDF_Rect rcItem = m_pList->GetItemRect(i); | 136 CFX_ByteString sItem = |
138 | 137 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); |
139 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.
bottom) continue; | 138 if (sItem.GetLength() > 0) { |
140 | 139 sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) |
141 CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bo
ttom) * 0.5f); | 140 << sItem << "ET\n"; |
142 if (m_pList->IsItemSelected(i)) | 141 } |
143 { | 142 } |
144 sListItems << CPWL_Utils::GetRectFillAppStream(r
cItem,PWL_DEFAULT_SELBACKCOLOR); | 143 } |
145 CFX_ByteString sItem = CPWL_Utils::GetEditAppStr
eam(m_pList->GetItemEdit(i), ptOffset); | 144 } |
146 if (sItem.GetLength() > 0) | 145 |
147 { | 146 if (sListItems.GetLength() > 0) { |
148 sListItems << "BT\n" << CPWL_Utils::GetC
olorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << "ET\n"; | 147 CFX_ByteTextBuf sClip; |
149 } | 148 CPDF_Rect rcClient = GetClientRect(); |
150 } | 149 |
151 else | 150 sClip << "q\n"; |
152 { | 151 sClip << rcClient.left << " " << rcClient.bottom << " " |
153 CFX_ByteString sItem = CPWL_Utils::GetEditAppStr
eam(m_pList->GetItemEdit(i), ptOffset); | 152 << rcClient.right - rcClient.left << " " |
154 if (sItem.GetLength() > 0) | 153 << rcClient.top - rcClient.bottom << " re W n\n"; |
155 { | 154 |
156 sListItems << "BT\n" << CPWL_Utils::GetC
olorAppStream(GetTextColor()) << sItem << "ET\n"; | 155 sClip << sListItems << "Q\n"; |
157 } | 156 |
158 } | 157 sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; |
159 } | 158 } |
160 } | 159 } |
161 | 160 |
162 if (sListItems.GetLength() > 0) | 161 void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, |
163 { | 162 CPDF_Matrix* pUser2Device) { |
164 CFX_ByteTextBuf sClip; | 163 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); |
165 CPDF_Rect rcClient = GetClientRect(); | 164 |
166 | 165 if (m_pList) { |
167 sClip << "q\n"; | 166 CPDF_Rect rcPlate = m_pList->GetPlateRect(); |
168 sClip << rcClient.left << " " << rcClient.bottom << " " | 167 CPDF_Rect rcList = GetListRect(); |
169 << rcClient.right - rcClient.left << " " << rcClient
.top - rcClient.bottom << " re W n\n"; | 168 CPDF_Rect rcClient = GetClientRect(); |
170 | 169 |
171 sClip << sListItems << "Q\n"; | 170 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { |
172 | 171 CPDF_Rect rcItem = m_pList->GetItemRect(i); |
173 sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; | 172 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) |
174 } | 173 continue; |
175 } | 174 |
176 | 175 CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); |
177 void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pU
ser2Device) | 176 if (IFX_Edit* pEdit = m_pList->GetItemEdit(i)) { |
178 { | 177 CPDF_Rect rcContent = pEdit->GetContentRect(); |
179 CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); | 178 if (rcContent.Width() > rcClient.Width()) |
180 | 179 rcItem.Intersect(rcList); |
181 if (m_pList) | 180 else |
182 { | 181 rcItem.Intersect(rcClient); |
183 CPDF_Rect rcPlate = m_pList->GetPlateRect(); | 182 } |
184 CPDF_Rect rcList = GetListRect(); | 183 |
185 CPDF_Rect rcClient = GetClientRect(); | 184 if (m_pList->IsItemSelected(i)) { |
186 | 185 // CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, |
187 for (int32_t i=0,sz=m_pList->GetCount(); i<sz; i++) | 186 //ArgbEncode(255,0,51,113)); |
188 { | 187 IFX_SystemHandler* pSysHandler = GetSystemHandler(); |
189 CPDF_Rect rcItem = m_pList->GetItemRect(i); | 188 if (pSysHandler && pSysHandler->IsSelectionImplemented()) { |
190 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.
bottom) continue; | 189 IFX_Edit::DrawEdit( |
191 | 190 pDevice, pUser2Device, m_pList->GetItemEdit(i), |
192 CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bo
ttom) * 0.5f); | 191 CPWL_Utils::PWLColorToFXColor(GetTextColor()), |
193 if (IFX_Edit* pEdit = m_pList->GetItemEdit(i)) | 192 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), rcList, |
194 { | 193 ptOffset, NULL, pSysHandler, m_pFormFiller); |
195 CPDF_Rect rcContent = pEdit->GetContentRect(); | 194 pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); |
196 if (rcContent.Width() > rcClient.Width()) | 195 } else { |
197 rcItem.Intersect(rcList); | 196 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, |
198 else | 197 ArgbEncode(255, 0, 51, 113)); |
199 rcItem.Intersect(rcClient); | 198 IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), |
200 } | 199 ArgbEncode(255, 255, 255, 255), 0, rcList, |
201 | 200 ptOffset, NULL, pSysHandler, m_pFormFiller); |
202 if (m_pList->IsItemSelected(i)) | 201 } |
203 { | 202 } else { |
204 // CPWL_Utils::DrawFillRect(pDevice, pUser2Device,
rcItem, ArgbEncode(255,0,51,113)); | 203 IFX_SystemHandler* pSysHandler = GetSystemHandler(); |
205 IFX_SystemHandler* pSysHandler = GetSystemHandle
r(); | 204 IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), |
206 if(pSysHandler && pSysHandler->IsSelectionImplem
ented()) | 205 CPWL_Utils::PWLColorToFXColor(GetTextColor()), |
207 { | 206 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), |
208 IFX_Edit::DrawEdit(pDevice, pUser2Device
, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_U
tils::PWLColorToFXColor(GetTextStrokeColor()), | 207 rcList, ptOffset, NULL, pSysHandler, NULL); |
209 rcList, ptOffset, NULL,pSysHandl
er, m_pFormFiller); | 208 } |
210 pSysHandler->OutputSelectedRect(m_pFormF
iller, rcItem); | 209 } |
211 } | 210 } |
212 else | 211 } |
213 { | 212 |
214 CPWL_Utils::DrawFillRect(pDevice, pUser2
Device, rcItem, ArgbEncode(255,0,51,113)); | 213 FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) { |
215 IFX_Edit::DrawEdit(pDevice, pUser2Device
, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0, | 214 CPWL_Wnd::OnKeyDown(nChar, nFlag); |
216 rcList, ptOffset, NULL, pSysHand
ler, m_pFormFiller); | 215 |
217 } | 216 if (!m_pList) |
218 } | 217 return FALSE; |
219 else | 218 |
220 { | 219 switch (nChar) { |
221 IFX_SystemHandler* pSysHandler = GetSystemHandle
r(); | 220 default: |
222 IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pLis
t->GetItemEdit(i), | 221 return FALSE; |
223 CPWL_Utils::PWLColorToFXColor(Ge
tTextColor()), | 222 case FWL_VKEY_Up: |
224 CPWL_Utils::PWLColorToFXColor(Ge
tTextStrokeColor()), | 223 case FWL_VKEY_Down: |
225 rcList, ptOffset, NULL,pSysHandl
er, NULL); | 224 case FWL_VKEY_Home: |
226 | 225 case FWL_VKEY_Left: |
227 } | 226 case FWL_VKEY_End: |
228 } | 227 case FWL_VKEY_Right: |
229 } | 228 break; |
230 } | 229 } |
231 | 230 |
232 FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) | 231 switch (nChar) { |
233 { | 232 case FWL_VKEY_Up: |
234 CPWL_Wnd::OnKeyDown(nChar, nFlag); | 233 m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
235 | 234 break; |
236 if (!m_pList) return FALSE; | 235 case FWL_VKEY_Down: |
237 | 236 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
238 switch (nChar) | 237 break; |
239 { | 238 case FWL_VKEY_Home: |
240 default: | 239 m_pList->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
241 return FALSE; | 240 break; |
242 case FWL_VKEY_Up: | 241 case FWL_VKEY_Left: |
243 case FWL_VKEY_Down: | 242 m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
244 case FWL_VKEY_Home: | 243 break; |
245 case FWL_VKEY_Left: | 244 case FWL_VKEY_End: |
246 case FWL_VKEY_End: | 245 m_pList->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
247 case FWL_VKEY_Right: | 246 break; |
248 break; | 247 case FWL_VKEY_Right: |
249 } | 248 m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
250 | 249 break; |
251 switch (nChar) | 250 case FWL_VKEY_Delete: |
252 { | 251 break; |
253 case FWL_VKEY_Up: | 252 } |
254 m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 253 |
255 break; | 254 FX_BOOL bExit = FALSE; |
256 case FWL_VKEY_Down: | 255 OnNotifySelChanged(TRUE, bExit, nFlag); |
257 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 256 |
258 break; | 257 return TRUE; |
259 case FWL_VKEY_Home: | 258 } |
260 m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 259 |
261 break; | 260 FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) { |
262 case FWL_VKEY_Left: | 261 CPWL_Wnd::OnChar(nChar, nFlag); |
263 m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 262 |
264 break; | 263 if (!m_pList) |
265 case FWL_VKEY_End: | 264 return FALSE; |
266 m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 265 |
267 break; | 266 if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) |
268 case FWL_VKEY_Right: | 267 return FALSE; |
269 m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | 268 |
270 break; | 269 FX_BOOL bExit = FALSE; |
271 case FWL_VKEY_Delete: | 270 OnNotifySelChanged(TRUE, bExit, nFlag); |
272 break; | 271 |
273 } | 272 return TRUE; |
274 | 273 } |
275 FX_BOOL bExit = FALSE; | 274 |
276 OnNotifySelChanged(TRUE,bExit,nFlag); | 275 FX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) { |
277 | 276 CPWL_Wnd::OnLButtonDown(point, nFlag); |
278 return TRUE; | 277 |
279 } | 278 if (ClientHitTest(point)) { |
280 | 279 m_bMouseDown = TRUE; |
281 FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) | 280 SetFocus(); |
282 { | 281 SetCapture(); |
283 CPWL_Wnd::OnChar(nChar,nFlag); | 282 |
284 | 283 if (m_pList) |
285 if (!m_pList) return FALSE; | 284 m_pList->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
286 | 285 } |
287 if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)))
return FALSE; | 286 |
288 | 287 return TRUE; |
289 FX_BOOL bExit = FALSE; | 288 } |
290 OnNotifySelChanged(TRUE,bExit, nFlag); | 289 |
291 | 290 FX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) { |
292 return TRUE; | 291 CPWL_Wnd::OnLButtonUp(point, nFlag); |
293 } | 292 |
294 | 293 if (m_bMouseDown) { |
295 FX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) | 294 ReleaseCapture(); |
296 { | 295 m_bMouseDown = FALSE; |
297 CPWL_Wnd::OnLButtonDown(point,nFlag); | 296 } |
298 | 297 |
299 if (ClientHitTest(point)) | 298 FX_BOOL bExit = FALSE; |
300 { | 299 OnNotifySelChanged(FALSE, bExit, nFlag); |
301 m_bMouseDown = TRUE; | 300 |
302 SetFocus(); | 301 return TRUE; |
303 SetCapture(); | 302 } |
304 | 303 |
305 if (m_pList) | 304 void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) { |
306 m_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLp
ressed(nFlag)); | 305 m_bHoverSel = bHoverSel; |
307 } | 306 } |
308 | 307 |
309 return TRUE; | 308 FX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point& point, FX_DWORD nFlag) { |
310 } | 309 CPWL_Wnd::OnMouseMove(point, nFlag); |
311 | 310 |
312 FX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) | 311 if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) { |
313 { | 312 if (m_pList) |
314 CPWL_Wnd::OnLButtonUp(point,nFlag); | 313 m_pList->Select(m_pList->GetItemIndex(point)); |
315 | 314 } |
316 if (m_bMouseDown) | 315 |
317 { | 316 if (m_bMouseDown) { |
318 ReleaseCapture(); | 317 if (m_pList) |
319 m_bMouseDown = FALSE; | 318 m_pList->OnMouseMove(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
320 } | 319 } |
321 | 320 |
322 FX_BOOL bExit = FALSE; | 321 return TRUE; |
323 OnNotifySelChanged(FALSE,bExit,nFlag); | 322 } |
324 | 323 |
325 return TRUE; | 324 void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, |
326 } | 325 FX_DWORD msg, |
327 | 326 intptr_t wParam, |
328 void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) | 327 intptr_t lParam) { |
329 { | 328 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); |
330 m_bHoverSel = bHoverSel; | 329 |
331 } | 330 FX_FLOAT fPos; |
332 | 331 |
333 FX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag) | 332 switch (msg) { |
334 { | 333 case PNM_SETSCROLLINFO: |
335 CPWL_Wnd::OnMouseMove(point, nFlag); | 334 switch (wParam) { |
336 | 335 case SBT_VSCROLL: |
337 if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) | 336 if (CPWL_Wnd* pChild = GetVScrollBar()) { |
338 { | 337 pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); |
339 if (m_pList) | 338 } |
340 m_pList->Select(m_pList->GetItemIndex(point)); | 339 break; |
341 } | 340 } |
342 | 341 break; |
343 if (m_bMouseDown) | 342 case PNM_SETSCROLLPOS: |
344 { | 343 switch (wParam) { |
345 if (m_pList) | 344 case SBT_VSCROLL: |
346 m_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLp
ressed(nFlag)); | 345 if (CPWL_Wnd* pChild = GetVScrollBar()) { |
347 } | 346 pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); |
348 | 347 } |
349 return TRUE; | 348 break; |
350 } | 349 } |
351 | 350 break; |
352 void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, intptr_t wParam, intpt
r_t lParam) | 351 case PNM_SCROLLWINDOW: |
353 { | 352 fPos = *(FX_FLOAT*)lParam; |
354 CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); | 353 switch (wParam) { |
355 | 354 case SBT_VSCROLL: |
356 FX_FLOAT fPos; | 355 if (m_pList) |
357 | 356 m_pList->SetScrollPos(CPDF_Point(0, fPos)); |
358 switch (msg) | 357 break; |
359 { | 358 } |
360 case PNM_SETSCROLLINFO: | 359 break; |
361 switch (wParam) | 360 } |
362 { | 361 } |
363 case SBT_VSCROLL: | 362 |
364 if (CPWL_Wnd * pChild = GetVScrollBar()) | 363 void CPWL_ListBox::KillFocus() { |
365 { | 364 CPWL_Wnd::KillFocus(); |
366 pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,l
Param); | 365 } |
367 } | 366 |
368 break; | 367 void CPWL_ListBox::RePosChildWnd() { |
369 } | 368 CPWL_Wnd::RePosChildWnd(); |
370 break; | 369 |
371 case PNM_SETSCROLLPOS: | 370 if (m_pList) |
372 switch (wParam) | 371 m_pList->SetPlateRect(GetListRect()); |
373 { | 372 } |
374 case SBT_VSCROLL: | 373 |
375 if (CPWL_Wnd * pChild = GetVScrollBar()) | 374 void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, |
376 { | 375 FX_BOOL& bExit, |
377 pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lP
aram); | 376 FX_DWORD nFlag) { |
378 } | 377 if (m_pFillerNotify) { |
379 break; | 378 FX_BOOL bRC = TRUE; |
380 } | 379 CFX_WideString swChange = GetText(); |
381 break; | 380 CFX_WideString strChangeEx; |
382 case PNM_SCROLLWINDOW: | 381 int nSelStart = 0; |
383 fPos = *(FX_FLOAT*)lParam; | 382 int nSelEnd = swChange.GetLength(); |
384 switch (wParam) | 383 m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, |
385 { | 384 strChangeEx, nSelStart, nSelEnd, |
386 case SBT_VSCROLL: | 385 bKeyDown, bRC, bExit, nFlag); |
387 if (m_pList) | 386 if (bExit) |
388 m_pList->SetScrollPos(CPDF_Point(0,fPos)); | 387 return; |
389 break; | 388 |
390 } | 389 m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit, nFlag); |
391 break; | 390 } |
392 } | 391 } |
393 } | 392 |
394 | 393 CPDF_Rect CPWL_ListBox::GetFocusRect() const { |
395 void CPWL_ListBox::KillFocus() | 394 if (m_pList && m_pList->IsMultipleSel()) { |
396 { | 395 CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); |
397 CPWL_Wnd::KillFocus(); | 396 rcCaret.Intersect(GetClientRect()); |
398 } | 397 return rcCaret; |
399 | 398 } |
400 void CPWL_ListBox::RePosChildWnd() | 399 |
401 { | 400 return CPWL_Wnd::GetFocusRect(); |
402 CPWL_Wnd::RePosChildWnd(); | 401 } |
403 | 402 |
404 if (m_pList) | 403 void CPWL_ListBox::AddString(const FX_WCHAR* string) { |
405 m_pList->SetPlateRect(GetListRect()); | 404 if (m_pList) { |
406 } | 405 m_pList->AddString(string); |
407 | 406 } |
408 void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit, FX_DWO
RD nFlag) | 407 } |
409 { | 408 |
410 if (m_pFillerNotify) | 409 CFX_WideString CPWL_ListBox::GetText() const { |
411 { | 410 if (m_pList) |
412 FX_BOOL bRC = TRUE; | 411 return m_pList->GetText(); |
413 CFX_WideString swChange = GetText(); | 412 |
414 CFX_WideString strChangeEx; | 413 return L""; |
415 int nSelStart = 0; | 414 } |
416 int nSelEnd = swChange.GetLength(); | 415 |
417 m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0,
swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag); | 416 void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) { |
418 if (bExit) return; | 417 if (m_pList) |
419 | 418 m_pList->SetFontSize(fFontSize); |
420 m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExi
t,nFlag); | 419 } |
421 } | 420 |
422 } | 421 FX_FLOAT CPWL_ListBox::GetFontSize() const { |
423 | 422 if (m_pList) |
424 CPDF_Rect CPWL_ListBox::GetFocusRect() const | 423 return m_pList->GetFontSize(); |
425 { | 424 return 0.0f; |
426 if (m_pList && m_pList->IsMultipleSel()) | 425 } |
427 { | 426 |
428 CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); | 427 void CPWL_ListBox::Select(int32_t nItemIndex) { |
429 rcCaret.Intersect(GetClientRect()); | 428 if (m_pList) |
430 return rcCaret; | 429 m_pList->Select(nItemIndex); |
431 } | 430 } |
432 | 431 |
433 return CPWL_Wnd::GetFocusRect(); | 432 void CPWL_ListBox::SetCaret(int32_t nItemIndex) { |
434 } | 433 if (m_pList) |
435 | 434 m_pList->SetCaret(nItemIndex); |
436 void CPWL_ListBox::AddString(const FX_WCHAR* string) | 435 } |
437 { | 436 |
438 if (m_pList) | 437 void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) { |
439 { | 438 if (m_pList) |
440 m_pList->AddString(string); | 439 m_pList->SetTopItem(nItemIndex); |
441 } | 440 } |
442 } | 441 |
443 | 442 void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) { |
444 CFX_WideString CPWL_ListBox::GetText() const | 443 if (m_pList) |
445 { | 444 m_pList->ScrollToListItem(nItemIndex); |
446 if (m_pList) | 445 } |
447 return m_pList->GetText(); | 446 |
448 | 447 void CPWL_ListBox::ResetContent() { |
449 return L""; | 448 if (m_pList) |
450 } | 449 m_pList->Empty(); |
451 | 450 } |
452 void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) | 451 |
453 { | 452 void CPWL_ListBox::Reset() { |
454 if (m_pList) | 453 if (m_pList) |
455 m_pList->SetFontSize(fFontSize); | 454 m_pList->Cancel(); |
456 } | 455 } |
457 | 456 |
458 FX_FLOAT CPWL_ListBox::GetFontSize() const | 457 FX_BOOL CPWL_ListBox::IsMultipleSel() const { |
459 { | 458 if (m_pList) |
460 if (m_pList) | 459 return m_pList->IsMultipleSel(); |
461 return m_pList->GetFontSize(); | 460 |
462 return 0.0f; | 461 return FALSE; |
463 } | 462 } |
464 | 463 |
465 void CPWL_ListBox::Select(int32_t nItemIndex) | 464 int32_t CPWL_ListBox::GetCaretIndex() const { |
466 { | 465 if (m_pList) |
467 if (m_pList) | 466 return m_pList->GetCaret(); |
468 m_pList->Select(nItemIndex); | 467 |
469 } | 468 return -1; |
470 | 469 } |
471 void CPWL_ListBox::SetCaret(int32_t nItemIndex) | 470 |
472 { | 471 int32_t CPWL_ListBox::GetCurSel() const { |
473 if (m_pList) | 472 if (m_pList) |
474 m_pList->SetCaret(nItemIndex); | 473 return m_pList->GetSelect(); |
475 } | 474 |
476 | 475 return -1; |
477 void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) | 476 } |
478 { | 477 |
479 if (m_pList) | 478 FX_BOOL CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const { |
480 m_pList->SetTopItem(nItemIndex); | 479 if (m_pList) |
481 } | 480 return m_pList->IsItemSelected(nItemIndex); |
482 | 481 |
483 void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) | 482 return FALSE; |
484 { | 483 } |
485 if (m_pList) | 484 |
486 m_pList->ScrollToListItem(nItemIndex); | 485 int32_t CPWL_ListBox::GetTopVisibleIndex() const { |
487 } | 486 if (m_pList) { |
488 | 487 m_pList->ScrollToListItem(m_pList->GetFirstSelected()); |
489 void CPWL_ListBox::ResetContent() | 488 return m_pList->GetTopItem(); |
490 { | 489 } |
491 if (m_pList) | 490 |
492 m_pList->Empty(); | 491 return -1; |
493 } | 492 } |
494 | 493 |
495 void CPWL_ListBox::Reset() | 494 int32_t CPWL_ListBox::GetCount() const { |
496 { | 495 if (m_pList) |
497 if (m_pList) | 496 return m_pList->GetCount(); |
498 m_pList->Cancel(); | 497 |
499 } | 498 return 0; |
500 | 499 } |
501 FX_BOOL CPWL_ListBox::IsMultipleSel() const | 500 |
502 { | 501 int32_t CPWL_ListBox::FindNext(int32_t nIndex, FX_WCHAR nChar) const { |
503 if (m_pList) | 502 if (m_pList) |
504 return m_pList->IsMultipleSel(); | 503 return m_pList->FindNext(nIndex, nChar); |
505 | 504 |
506 return FALSE; | 505 return nIndex; |
507 } | 506 } |
508 | 507 |
509 int32_t CPWL_ListBox::GetCaretIndex() const | 508 CPDF_Rect CPWL_ListBox::GetContentRect() const { |
510 { | 509 if (m_pList) |
511 if (m_pList) | 510 return m_pList->GetContentRect(); |
512 return m_pList->GetCaret(); | 511 |
513 | 512 return CPDF_Rect(); |
514 return -1; | 513 } |
515 } | 514 |
516 | 515 FX_FLOAT CPWL_ListBox::GetFirstHeight() const { |
517 int32_t CPWL_ListBox::GetCurSel() const | 516 if (m_pList) |
518 { | 517 return m_pList->GetFirstHeight(); |
519 if (m_pList) | 518 |
520 return m_pList->GetSelect(); | 519 return 0.0f; |
521 | 520 } |
522 return -1; | 521 |
523 } | 522 CPDF_Rect CPWL_ListBox::GetListRect() const { |
524 | 523 return CPWL_Utils::DeflateRect( |
525 FX_BOOL CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const | 524 GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); |
526 { | 525 } |
527 if (m_pList) | 526 |
528 return m_pList->IsItemSelected(nItemIndex); | 527 FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, |
529 | 528 const CPDF_Point& point, |
530 return FALSE; | 529 FX_DWORD nFlag) { |
531 } | 530 if (!m_pList) |
532 | 531 return FALSE; |
533 int32_t CPWL_ListBox::GetTopVisibleIndex() const | 532 |
534 { | 533 if (zDelta < 0) { |
535 if (m_pList) | 534 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
536 { | 535 } else { |
537 m_pList->ScrollToListItem(m_pList->GetFirstSelected()); | 536 m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
538 return m_pList->GetTopItem(); | 537 } |
539 } | 538 |
540 | 539 FX_BOOL bExit = FALSE; |
541 return -1; | 540 OnNotifySelChanged(FALSE, bExit, nFlag); |
542 } | 541 return TRUE; |
543 | 542 } |
544 int32_t CPWL_ListBox::GetCount() const | |
545 { | |
546 if (m_pList) | |
547 return m_pList->GetCount(); | |
548 | |
549 return 0; | |
550 } | |
551 | |
552 int32_t CPWL_ListBox::FindNext(int32_t nIndex,FX_WCHAR nChar) const | |
553 { | |
554 if (m_pList) | |
555 return m_pList->FindNext(nIndex,nChar); | |
556 | |
557 return nIndex; | |
558 } | |
559 | |
560 CPDF_Rect CPWL_ListBox::GetContentRect() const | |
561 { | |
562 if (m_pList) | |
563 return m_pList->GetContentRect(); | |
564 | |
565 return CPDF_Rect(); | |
566 } | |
567 | |
568 FX_FLOAT CPWL_ListBox::GetFirstHeight() const | |
569 { | |
570 if (m_pList) | |
571 return m_pList->GetFirstHeight(); | |
572 | |
573 return 0.0f; | |
574 } | |
575 | |
576 CPDF_Rect CPWL_ListBox::GetListRect() const | |
577 { | |
578 return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth
()+GetInnerBorderWidth())); | |
579 } | |
580 | |
581 FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DW
ORD nFlag) | |
582 { | |
583 if (!m_pList) return FALSE; | |
584 | |
585 if (zDelta < 0) | |
586 { | |
587 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | |
588 } | |
589 else | |
590 { | |
591 m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); | |
592 } | |
593 | |
594 FX_BOOL bExit = FALSE; | |
595 OnNotifySelChanged(FALSE,bExit, nFlag); | |
596 return TRUE; | |
597 } | |
598 | |
OLD | NEW |