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/fxedit/fxet_stub.h" | 7 #include "../../include/fxedit/fxet_stub.h" |
8 #include "../../include/fxedit/fxet_edit.h" | 8 #include "../../include/fxedit/fxet_edit.h" |
9 #include "../../include/fxedit/fxet_list.h" | 9 #include "../../include/fxedit/fxet_list.h" |
10 | 10 |
11 /* ------------------------------- CFX_ListItem --------------------------------
-- */ | 11 /* ------------------------------- CFX_ListItem |
12 | 12 * ---------------------------------- */ |
13 CFX_ListItem::CFX_ListItem() : m_pEdit(NULL), | 13 |
14 m_bSelected(FALSE), | 14 CFX_ListItem::CFX_ListItem() |
15 m_bCaret(FALSE), | 15 : m_pEdit(NULL), |
16 m_rcListItem(0.0f,0.0f,0.0f,0.0f) | 16 m_bSelected(FALSE), |
17 { | 17 m_bCaret(FALSE), |
18 m_pEdit = IFX_Edit::NewEdit(); | 18 m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { |
19 ASSERT(m_pEdit != NULL); | 19 m_pEdit = IFX_Edit::NewEdit(); |
20 | 20 ASSERT(m_pEdit != NULL); |
21 m_pEdit->SetAlignmentV(1); | 21 |
22 m_pEdit->Initialize(); | 22 m_pEdit->SetAlignmentV(1); |
23 } | 23 m_pEdit->Initialize(); |
24 | 24 } |
25 CFX_ListItem::~CFX_ListItem() | 25 |
26 { | 26 CFX_ListItem::~CFX_ListItem() { |
27 IFX_Edit::DelEdit(m_pEdit); | 27 IFX_Edit::DelEdit(m_pEdit); |
28 } | 28 } |
29 | 29 |
30 void CFX_ListItem::SetFontMap(IFX_Edit_FontMap * pFontMap) | 30 void CFX_ListItem::SetFontMap(IFX_Edit_FontMap* pFontMap) { |
31 { | 31 if (m_pEdit) |
32 if (m_pEdit) | 32 m_pEdit->SetFontMap(pFontMap); |
33 m_pEdit->SetFontMap(pFontMap); | 33 } |
34 } | 34 |
35 | 35 IFX_Edit* CFX_ListItem::GetEdit() const { |
36 IFX_Edit* CFX_ListItem::GetEdit() const | 36 return m_pEdit; |
37 { | 37 } |
38 return m_pEdit; | 38 |
39 } | 39 IFX_Edit_Iterator* CFX_ListItem::GetIterator() const { |
40 | 40 if (m_pEdit) |
41 IFX_Edit_Iterator* CFX_ListItem::GetIterator() const | 41 return m_pEdit->GetIterator(); |
42 { | 42 |
43 if (m_pEdit) | 43 return NULL; |
44 return m_pEdit->GetIterator(); | 44 } |
45 | 45 |
46 return NULL; | 46 void CFX_ListItem::SetRect(const CLST_Rect& rect) { |
47 } | 47 m_rcListItem = rect; |
48 | 48 } |
49 void CFX_ListItem::SetRect(const CLST_Rect & rect) | 49 |
50 { | 50 CLST_Rect CFX_ListItem::GetRect() const { |
51 m_rcListItem = rect; | 51 return m_rcListItem; |
52 } | 52 } |
53 | 53 |
54 CLST_Rect CFX_ListItem::GetRect() const | 54 FX_BOOL CFX_ListItem::IsSelected() const { |
55 { | 55 return m_bSelected; |
56 return m_rcListItem; | 56 } |
57 } | 57 |
58 | 58 void CFX_ListItem::SetSelect(FX_BOOL bSelected) { |
59 FX_BOOL CFX_ListItem::IsSelected() const | 59 m_bSelected = bSelected; |
60 { | 60 } |
61 return m_bSelected; | 61 |
62 } | 62 FX_BOOL CFX_ListItem::IsCaret() const { |
63 | 63 return m_bCaret; |
64 void CFX_ListItem::SetSelect(FX_BOOL bSelected) | 64 } |
65 { | 65 |
66 m_bSelected = bSelected; | 66 void CFX_ListItem::SetCaret(FX_BOOL bCaret) { |
67 } | 67 m_bCaret = bCaret; |
68 | 68 } |
69 FX_BOOL CFX_ListItem::IsCaret() const | 69 |
70 { | 70 void CFX_ListItem::SetText(const FX_WCHAR* text) { |
71 return m_bCaret; | 71 if (m_pEdit) |
72 } | 72 m_pEdit->SetText(text); |
73 | 73 } |
74 void CFX_ListItem::SetCaret(FX_BOOL bCaret) | 74 |
75 { | 75 void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { |
76 m_bCaret = bCaret; | 76 if (m_pEdit) |
77 } | 77 m_pEdit->SetFontSize(fFontSize); |
78 | 78 } |
79 void CFX_ListItem::SetText(const FX_WCHAR* text) | 79 |
80 { | 80 FX_FLOAT CFX_ListItem::GetItemHeight() const { |
81 if (m_pEdit) | 81 if (m_pEdit) |
82 m_pEdit->SetText(text); | 82 return m_pEdit->GetContentRect().Height(); |
83 } | 83 |
84 | 84 return 0.0f; |
85 void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) | 85 } |
86 { | 86 |
87 if (m_pEdit) | 87 FX_WORD CFX_ListItem::GetFirstChar() const { |
88 m_pEdit->SetFontSize(fFontSize); | 88 CPVT_Word word; |
89 } | 89 |
90 | 90 if (IFX_Edit_Iterator* pIterator = GetIterator()) { |
91 FX_FLOAT CFX_ListItem::GetItemHeight() const | 91 pIterator->SetAt(1); |
92 { | 92 pIterator->GetWord(word); |
93 if (m_pEdit) | 93 } |
94 return m_pEdit->GetContentRect().Height(); | 94 |
95 | 95 return word.Word; |
96 return 0.0f; | 96 } |
97 } | 97 |
98 | 98 CFX_WideString CFX_ListItem::GetText() const { |
99 FX_WORD CFX_ListItem::GetFirstChar() const | 99 if (m_pEdit) |
100 { | 100 return m_pEdit->GetText(); |
101 CPVT_Word word; | 101 |
102 | 102 return L""; |
103 if (IFX_Edit_Iterator* pIterator = GetIterator()) | 103 } |
104 { | 104 |
105 pIterator->SetAt(1); | 105 /* ------------------------------------ CFX_List |
106 pIterator->GetWord(word); | 106 * --------------------------------- */ |
107 } | 107 |
108 | 108 CFX_List::CFX_List() |
109 return word.Word; | 109 : m_fFontSize(0.0f), m_pFontMap(NULL), m_bMultiple(FALSE) {} |
110 } | 110 |
111 | 111 CFX_List::~CFX_List() { |
112 CFX_WideString CFX_ListItem::GetText() const | 112 Empty(); |
113 { | 113 } |
114 if (m_pEdit) | 114 |
115 return m_pEdit->GetText(); | 115 void CFX_List::Empty() { |
116 | 116 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) |
117 return L""; | 117 delete m_aListItems.GetAt(i); |
118 } | 118 |
119 | 119 m_aListItems.RemoveAll(); |
120 /* ------------------------------------ CFX_List -------------------------------
-- */ | 120 } |
121 | 121 |
122 CFX_List::CFX_List() : m_fFontSize(0.0f), m_pFontMap(NULL), m_bMultiple(FALSE) | 122 void CFX_List::SetFontMap(IFX_Edit_FontMap* pFontMap) { |
123 { | 123 m_pFontMap = pFontMap; |
124 } | 124 } |
125 | 125 |
126 CFX_List::~CFX_List() | 126 void CFX_List::SetFontSize(FX_FLOAT fFontSize) { |
127 { | 127 m_fFontSize = fFontSize; |
128 Empty(); | 128 } |
129 } | 129 |
130 | 130 void CFX_List::AddItem(const FX_WCHAR* str) { |
131 void CFX_List::Empty() | 131 if (CFX_ListItem* pListItem = new CFX_ListItem()) { |
132 { | 132 pListItem->SetFontMap(m_pFontMap); |
133 for (int32_t i=0,sz=m_aListItems.GetSize(); i<sz; i++) | 133 pListItem->SetFontSize(m_fFontSize); |
134 delete m_aListItems.GetAt(i); | 134 pListItem->SetText(str); |
135 | 135 m_aListItems.Add(pListItem); |
136 m_aListItems.RemoveAll(); | 136 } |
137 } | 137 } |
138 | 138 |
139 void CFX_List::SetFontMap(IFX_Edit_FontMap * pFontMap) | 139 void CFX_List::ReArrange(int32_t nItemIndex) { |
140 { | 140 FX_FLOAT fPosY = 0.0f; |
141 m_pFontMap = pFontMap; | 141 |
142 } | 142 if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) |
143 | 143 fPosY = pPrevItem->GetRect().bottom; |
144 void CFX_List::SetFontSize(FX_FLOAT fFontSize) | 144 |
145 { | 145 for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { |
146 m_fFontSize = fFontSize; | 146 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
147 } | 147 FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); |
148 | 148 pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); |
149 void CFX_List::AddItem(const FX_WCHAR* str) | 149 fPosY += fListItemHeight; |
150 { | 150 } |
151 if (CFX_ListItem * pListItem = new CFX_ListItem()) | 151 } |
152 { | 152 |
153 pListItem->SetFontMap(m_pFontMap); | 153 SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); |
154 pListItem->SetFontSize(m_fFontSize); | 154 } |
155 pListItem->SetText(str); | 155 |
156 m_aListItems.Add(pListItem); | 156 IFX_Edit* CFX_List::GetItemEdit(int32_t nIndex) const { |
157 } | 157 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
158 } | 158 return pListItem->GetEdit(); |
159 | 159 } |
160 void CFX_List::ReArrange(int32_t nItemIndex) | 160 |
161 { | 161 return NULL; |
162 FX_FLOAT fPosY = 0.0f; | 162 } |
163 | 163 |
164 if (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) | 164 int32_t CFX_List::GetCount() const { |
165 fPosY = pPrevItem->GetRect().bottom; | 165 return m_aListItems.GetSize(); |
166 | 166 } |
167 for (int32_t i=nItemIndex,sz=m_aListItems.GetSize(); i<sz; i++) | 167 |
168 { | 168 CPDF_Rect CFX_List::GetPlateRect() const { |
169 if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) | 169 return CFX_ListContainer::GetPlateRect(); |
170 { | 170 } |
171 FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); | 171 |
172 pListItem->SetRect(CLST_Rect(0.0f,fPosY,0.0f,fPosY + fLi
stItemHeight)); | 172 CPDF_Rect CFX_List::GetContentRect() const { |
173 fPosY += fListItemHeight; | 173 return InnerToOuter(CFX_ListContainer::GetContentRect()); |
174 } | 174 } |
175 } | 175 |
176 | 176 FX_FLOAT CFX_List::GetFontSize() const { |
177 SetContentRect(CLST_Rect(0.0f,0.0f,0.0f,fPosY)); | 177 return m_fFontSize; |
178 } | 178 } |
179 | 179 |
180 IFX_Edit * CFX_List::GetItemEdit(int32_t nIndex) const | 180 int32_t CFX_List::GetItemIndex(const CPDF_Point& point) const { |
181 { | 181 CPDF_Point pt = OuterToInner(point); |
182 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) | 182 |
183 { | 183 FX_BOOL bFirst = TRUE; |
184 return pListItem->GetEdit(); | 184 FX_BOOL bLast = TRUE; |
185 } | 185 |
186 | 186 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
187 return NULL; | 187 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
188 } | 188 CLST_Rect rcListItem = pListItem->GetRect(); |
189 | 189 |
190 int32_t CFX_List::GetCount() const | 190 if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) { |
191 { | 191 bFirst = FALSE; |
192 return m_aListItems.GetSize(); | 192 } |
193 } | 193 |
194 | 194 if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) { |
195 CPDF_Rect CFX_List::GetPlateRect() const | 195 bLast = FALSE; |
196 { | 196 } |
197 return CFX_ListContainer::GetPlateRect(); | 197 |
198 } | 198 if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { |
199 | 199 return i; |
200 CPDF_Rect CFX_List::GetContentRect() const | 200 } |
201 { | 201 } |
202 return InnerToOuter(CFX_ListContainer::GetContentRect()); | 202 } |
203 } | 203 |
204 | 204 if (bFirst) |
205 FX_FLOAT CFX_List::GetFontSize() const | 205 return 0; |
206 { | 206 if (bLast) |
207 return m_fFontSize; | 207 return m_aListItems.GetSize() - 1; |
208 } | 208 |
209 | 209 return -1; |
210 int32_t CFX_List::GetItemIndex(const CPDF_Point & point) const | 210 } |
211 { | 211 |
212 CPDF_Point pt = OuterToInner(point); | 212 FX_FLOAT CFX_List::GetFirstHeight() const { |
213 | 213 if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { |
214 FX_BOOL bFirst = TRUE; | 214 return pListItem->GetItemHeight(); |
215 FX_BOOL bLast = TRUE; | 215 } |
216 | 216 |
217 for (int32_t i=0,sz=m_aListItems.GetSize(); i<sz; i++) | 217 return 1.0f; |
218 { | 218 } |
219 if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) | 219 |
220 { | 220 int32_t CFX_List::GetFirstSelected() const { |
221 CLST_Rect rcListItem = pListItem->GetRect(); | 221 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
222 | 222 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
223 if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) | 223 if (pListItem->IsSelected()) |
224 { | 224 return i; |
225 bFirst = FALSE; | 225 } |
226 } | 226 } |
227 | 227 return -1; |
228 if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) | 228 } |
229 { | 229 |
230 bLast = FALSE; | 230 int32_t CFX_List::GetLastSelected() const { |
231 } | 231 for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) { |
232 | 232 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
233 if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) | 233 if (pListItem->IsSelected()) |
234 { | 234 return i; |
235 return i; | 235 } |
236 } | 236 } |
237 } | 237 return -1; |
238 } | 238 } |
239 | 239 |
240 if (bFirst) return 0; | 240 FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const { |
241 if (bLast) return m_aListItems.GetSize()-1; | 241 if ((c >= 'a') && (c <= 'z')) |
242 | 242 c = c - ('a' - 'A'); |
243 return -1; | 243 return c; |
244 } | 244 } |
245 | 245 |
246 FX_FLOAT CFX_List::GetFirstHeight() const | 246 int32_t CFX_List::FindNext(int32_t nIndex, FX_WCHAR nChar) const { |
247 { | 247 int32_t nCircleIndex = nIndex; |
248 if (CFX_ListItem * pListItem = m_aListItems.GetAt(0)) | 248 |
249 { | 249 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
250 return pListItem->GetItemHeight(); | 250 nCircleIndex++; |
251 } | 251 if (nCircleIndex >= sz) |
252 | 252 nCircleIndex = 0; |
253 return 1.0f; | 253 |
254 } | 254 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { |
255 | 255 if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) |
256 int32_t CFX_List::GetFirstSelected() const | 256 return nCircleIndex; |
257 { | 257 } |
258 for (int32_t i=0,sz=m_aListItems.GetSize(); i<sz; i++) | 258 } |
259 { | 259 |
260 if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) | 260 return nCircleIndex; |
261 { | 261 } |
262 if (pListItem->IsSelected()) | 262 |
263 return i; | 263 CPDF_Rect CFX_List::GetItemRect(int32_t nIndex) const { |
264 } | 264 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
265 } | 265 CPDF_Rect rcItem = pListItem->GetRect(); |
266 return -1; | 266 rcItem.left = 0.0f; |
267 } | 267 rcItem.right = GetPlateRect().Width(); |
268 | 268 return InnerToOuter(rcItem); |
269 int32_t CFX_List::GetLastSelected() const | 269 } |
270 { | 270 |
271 for (int32_t i=m_aListItems.GetSize()-1; i>=0; i--) | 271 return CPDF_Rect(); |
272 { | 272 } |
273 if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) | 273 |
274 { | 274 FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const { |
275 if (pListItem->IsSelected()) | 275 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
276 return i; | 276 return pListItem->IsSelected(); |
277 } | 277 } |
278 } | 278 |
279 return -1; | 279 return FALSE; |
280 } | 280 } |
281 | 281 |
282 FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const | 282 void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) { |
283 { | 283 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { |
284 if ( (c >= 'a') && (c <= 'z') ) | 284 pListItem->SetSelect(bSelected); |
285 c = c - ('a' - 'A'); | 285 } |
286 return c; | 286 } |
287 } | 287 |
288 | 288 void CFX_List::SetItemCaret(int32_t nItemIndex, FX_BOOL bCaret) { |
289 int32_t CFX_List::FindNext(int32_t nIndex,FX_WCHAR nChar) const | 289 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { |
290 { | 290 pListItem->SetCaret(bCaret); |
291 int32_t nCircleIndex = nIndex; | 291 } |
292 | 292 } |
293 for (int32_t i=0,sz=m_aListItems.GetSize(); i<sz; i++) | 293 |
294 { | 294 void CFX_List::SetMultipleSel(FX_BOOL bMultiple) { |
295 nCircleIndex ++; | 295 m_bMultiple = bMultiple; |
296 if (nCircleIndex >= sz) nCircleIndex = 0; | 296 } |
297 | 297 |
298 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nCircleIndex)) | 298 FX_BOOL CFX_List::IsMultipleSel() const { |
299 { | 299 return m_bMultiple; |
300 if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)
) | 300 } |
301 return nCircleIndex; | 301 |
302 } | 302 FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const { |
303 } | 303 return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); |
304 | 304 } |
305 return nCircleIndex; | 305 |
306 } | 306 CFX_WideString CFX_List::GetItemText(int32_t nIndex) const { |
307 | 307 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
308 CPDF_Rect CFX_List::GetItemRect(int32_t nIndex) const | 308 return pListItem->GetText(); |
309 { | 309 } |
310 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) | 310 |
311 { | 311 return L""; |
312 CPDF_Rect rcItem = pListItem->GetRect(); | 312 } |
313 rcItem.left = 0.0f; | 313 |
314 rcItem.right = GetPlateRect().Width(); | 314 /* ------------------------------------ CPLST_Select |
315 return InnerToOuter(rcItem); | 315 * ---------------------------------- */ |
316 } | 316 |
317 | 317 CPLST_Select::CPLST_Select() {} |
318 return CPDF_Rect(); | 318 |
319 } | 319 CPLST_Select::~CPLST_Select() { |
320 | 320 for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) |
321 FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const | 321 delete m_aItems.GetAt(i); |
322 { | 322 |
323 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) | 323 m_aItems.RemoveAll(); |
324 { | 324 } |
325 return pListItem->IsSelected(); | 325 |
326 } | 326 void CPLST_Select::Add(int32_t nItemIndex) { |
327 | 327 int32_t nIndex = Find(nItemIndex); |
328 return FALSE; | 328 |
329 } | 329 if (nIndex < 0) |
330 | 330 m_aItems.Add(new CPLST_Select_Item(nItemIndex, 1)); |
331 void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) | 331 else { |
332 { | 332 if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) { |
333 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex)) | 333 pItem->nState = 1; |
334 { | 334 } |
335 pListItem->SetSelect(bSelected); | 335 } |
336 } | 336 } |
337 } | 337 |
338 | 338 void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) { |
339 void CFX_List::SetItemCaret(int32_t nItemIndex, FX_BOOL bCaret) | 339 if (nBeginIndex > nEndIndex) { |
340 { | 340 int32_t nTemp = nEndIndex; |
341 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex)) | 341 nEndIndex = nBeginIndex; |
342 { | 342 nBeginIndex = nTemp; |
343 pListItem->SetCaret(bCaret); | 343 } |
344 } | 344 |
345 } | 345 for (int32_t i = nBeginIndex; i <= nEndIndex; i++) |
346 | 346 Add(i); |
347 void CFX_List::SetMultipleSel(FX_BOOL bMultiple) | 347 } |
348 { | 348 |
349 m_bMultiple = bMultiple; | 349 void CPLST_Select::Sub(int32_t nItemIndex) { |
350 } | 350 for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { |
351 | 351 if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) |
352 FX_BOOL CFX_List::IsMultipleSel() const | 352 if (pItem->nItemIndex == nItemIndex) |
353 { | 353 pItem->nState = -1; |
354 return m_bMultiple; | 354 } |
355 } | 355 } |
356 | 356 |
357 FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const | 357 void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) { |
358 { | 358 if (nBeginIndex > nEndIndex) { |
359 return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); | 359 int32_t nTemp = nEndIndex; |
360 } | 360 nEndIndex = nBeginIndex; |
361 | 361 nBeginIndex = nTemp; |
362 CFX_WideString CFX_List::GetItemText(int32_t nIndex) const | 362 } |
363 { | 363 |
364 if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) | 364 for (int32_t i = nBeginIndex; i <= nEndIndex; i++) |
365 { | 365 Sub(i); |
366 return pListItem->GetText(); | 366 } |
367 } | 367 |
368 | 368 int32_t CPLST_Select::Find(int32_t nItemIndex) const { |
369 return L""; | 369 for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { |
370 } | 370 if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
371 | 371 if (pItem->nItemIndex == nItemIndex) |
372 /* ------------------------------------ CPLST_Select ---------------------------
------- */ | 372 return i; |
373 | 373 } |
374 CPLST_Select::CPLST_Select() | 374 } |
375 { | 375 |
376 } | 376 return -1; |
377 | 377 } |
378 CPLST_Select::~CPLST_Select() | 378 |
379 { | 379 FX_BOOL CPLST_Select::IsExist(int32_t nItemIndex) const { |
380 for (int32_t i=0,sz=m_aItems.GetSize(); i<sz; i++) | 380 return Find(nItemIndex) >= 0; |
381 delete m_aItems.GetAt(i); | 381 } |
382 | 382 |
383 m_aItems.RemoveAll(); | 383 int32_t CPLST_Select::GetCount() const { |
384 } | 384 return m_aItems.GetSize(); |
385 | 385 } |
386 void CPLST_Select::Add(int32_t nItemIndex) | 386 |
387 { | 387 int32_t CPLST_Select::GetItemIndex(int32_t nIndex) const { |
388 int32_t nIndex = Find(nItemIndex); | 388 if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
389 | 389 if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) |
390 if (nIndex < 0) | 390 return pItem->nItemIndex; |
391 m_aItems.Add(new CPLST_Select_Item(nItemIndex,1)); | 391 |
392 else | 392 return -1; |
393 { | 393 } |
394 if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) | 394 |
395 { | 395 int32_t CPLST_Select::GetState(int32_t nIndex) const { |
396 pItem->nState = 1; | 396 if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
397 } | 397 if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) |
398 } | 398 return pItem->nState; |
399 } | 399 |
400 | 400 return 0; |
401 void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) | 401 } |
402 { | 402 |
403 if (nBeginIndex > nEndIndex) | 403 void CPLST_Select::DeselectAll() { |
404 { | 404 for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { |
405 int32_t nTemp = nEndIndex; | 405 if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
406 nEndIndex = nBeginIndex; | 406 pItem->nState = -1; |
407 nBeginIndex = nTemp; | 407 } |
408 } | 408 } |
409 | 409 } |
410 for (int32_t i=nBeginIndex; i<=nEndIndex; i++) Add(i); | 410 |
411 } | 411 void CPLST_Select::Done() { |
412 | 412 for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { |
413 void CPLST_Select::Sub(int32_t nItemIndex) | 413 if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
414 { | 414 if (pItem->nState == -1) { |
415 for (int32_t i=m_aItems.GetSize()-1; i>=0; i--) | 415 delete pItem; |
416 { | 416 m_aItems.RemoveAt(i); |
417 if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) | 417 } else { |
418 if (pItem->nItemIndex == nItemIndex) | 418 pItem->nState = 0; |
419 pItem->nState = -1; | 419 } |
420 } | 420 } |
421 } | 421 } |
422 | 422 } |
423 void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) | 423 |
424 { | 424 /* ------------------------------------ CFX_ListCtrl |
425 if (nBeginIndex > nEndIndex) | 425 * --------------------------------- */ |
426 { | 426 |
427 int32_t nTemp = nEndIndex; | 427 CFX_ListCtrl::CFX_ListCtrl() |
428 nEndIndex = nBeginIndex; | 428 : m_pNotify(NULL), |
429 nBeginIndex = nTemp; | 429 m_bNotifyFlag(FALSE), |
430 } | 430 m_ptScrollPos(0.0f, 0.0f), |
431 | 431 m_nSelItem(-1), |
432 for (int32_t i=nBeginIndex; i<=nEndIndex; i++) Sub(i); | 432 m_nFootIndex(-1), |
433 } | 433 m_bCtrlSel(FALSE), |
434 | 434 m_nCaretIndex(-1) {} |
435 int32_t CPLST_Select::Find(int32_t nItemIndex) const | 435 |
436 { | 436 CFX_ListCtrl::~CFX_ListCtrl() {} |
437 for (int32_t i=0,sz=m_aItems.GetSize(); i<sz; i++) | 437 |
438 { | 438 void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) { |
439 if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) | 439 m_pNotify = pNotify; |
440 { | 440 } |
441 if (pItem->nItemIndex == nItemIndex) | 441 |
442 return i; | 442 CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point& point) const { |
443 } | 443 CPDF_Rect rcPlate = GetPlateRect(); |
444 } | 444 |
445 | 445 return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left), |
446 return -1; | 446 point.y - (m_ptScrollPos.y - rcPlate.top)); |
447 } | 447 } |
448 | 448 |
449 FX_BOOL CPLST_Select::IsExist(int32_t nItemIndex) const | 449 CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point& point) const { |
450 { | 450 CPDF_Rect rcPlate = GetPlateRect(); |
451 return Find(nItemIndex) >= 0; | 451 |
452 } | 452 return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left), |
453 | 453 point.y + (m_ptScrollPos.y - rcPlate.top)); |
454 int32_t CPLST_Select::GetCount() const | 454 } |
455 { | 455 |
456 return m_aItems.GetSize(); | 456 CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect& rect) const { |
457 } | 457 CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left, rect.bottom)); |
458 | 458 CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right, rect.top)); |
459 int32_t CPLST_Select::GetItemIndex(int32_t nIndex) const | 459 |
460 { | 460 return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y); |
461 if (nIndex >= 0 && nIndex < m_aItems.GetSize()) | 461 } |
462 if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) | 462 |
463 return pItem->nItemIndex; | 463 CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect& rect) const { |
464 | 464 CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left, rect.bottom)); |
465 return -1; | 465 CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right, rect.top)); |
466 } | 466 |
467 | 467 return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y); |
468 int32_t CPLST_Select::GetState(int32_t nIndex) const | 468 } |
469 { | 469 |
470 if (nIndex >= 0 && nIndex < m_aItems.GetSize()) | 470 void CFX_ListCtrl::OnMouseDown(const CPDF_Point& point, |
471 if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) | 471 FX_BOOL bShift, |
472 return pItem->nState; | 472 FX_BOOL bCtrl) { |
473 | 473 int32_t nHitIndex = GetItemIndex(point); |
474 return 0; | 474 |
475 } | 475 if (IsMultipleSel()) { |
476 | 476 if (bCtrl) { |
477 void CPLST_Select::DeselectAll() | 477 if (IsItemSelected(nHitIndex)) { |
478 { | 478 m_aSelItems.Sub(nHitIndex); |
479 for (int32_t i=0,sz=m_aItems.GetSize(); i<sz; i++) | 479 SelectItems(); |
480 { | 480 m_bCtrlSel = FALSE; |
481 if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) | 481 } else { |
482 { | 482 m_aSelItems.Add(nHitIndex); |
483 pItem->nState = -1; | 483 SelectItems(); |
484 } | 484 m_bCtrlSel = TRUE; |
485 } | 485 } |
486 } | 486 |
487 | 487 m_nFootIndex = nHitIndex; |
488 void CPLST_Select::Done() | 488 } else if (bShift) { |
489 { | 489 m_aSelItems.DeselectAll(); |
490 for (int32_t i=m_aItems.GetSize()-1; i>=0; i--) | 490 m_aSelItems.Add(m_nFootIndex, nHitIndex); |
491 { | 491 SelectItems(); |
492 if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) | 492 } else { |
493 { | 493 m_aSelItems.DeselectAll(); |
494 if (pItem->nState == -1) | 494 m_aSelItems.Add(nHitIndex); |
495 { | 495 SelectItems(); |
496 delete pItem; | 496 |
497 m_aItems.RemoveAt(i); | 497 m_nFootIndex = nHitIndex; |
498 } | 498 } |
499 else | 499 |
500 { | 500 SetCaret(nHitIndex); |
501 pItem->nState = 0; | 501 } else { |
502 } | 502 SetSingleSelect(nHitIndex); |
503 } | 503 } |
504 } | 504 |
505 } | 505 if (!IsItemVisible(nHitIndex)) |
506 | 506 ScrollToListItem(nHitIndex); |
507 /* ------------------------------------ CFX_ListCtrl ---------------------------
------ */ | 507 } |
508 | 508 |
509 CFX_ListCtrl::CFX_ListCtrl() : m_pNotify(NULL), | 509 void CFX_ListCtrl::OnMouseMove(const CPDF_Point& point, |
510 m_bNotifyFlag(FALSE), | 510 FX_BOOL bShift, |
511 m_ptScrollPos(0.0f,0.0f), | 511 FX_BOOL bCtrl) { |
512 m_nSelItem(-1), | 512 int32_t nHitIndex = GetItemIndex(point); |
513 m_nFootIndex(-1), | 513 |
514 m_bCtrlSel(FALSE), | 514 if (IsMultipleSel()) { |
515 m_nCaretIndex(-1) | 515 if (bCtrl) { |
516 { | 516 if (m_bCtrlSel) |
517 } | 517 m_aSelItems.Add(m_nFootIndex, nHitIndex); |
518 | 518 else |
519 CFX_ListCtrl::~CFX_ListCtrl() | 519 m_aSelItems.Sub(m_nFootIndex, nHitIndex); |
520 { | 520 |
521 } | 521 SelectItems(); |
522 | 522 } else { |
523 void CFX_ListCtrl::SetNotify(IFX_List_Notify * pNotify) | 523 m_aSelItems.DeselectAll(); |
524 { | 524 m_aSelItems.Add(m_nFootIndex, nHitIndex); |
525 m_pNotify = pNotify; | 525 SelectItems(); |
526 } | 526 } |
527 | 527 |
528 CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point & point) const | 528 SetCaret(nHitIndex); |
529 { | 529 } else { |
530 CPDF_Rect rcPlate = GetPlateRect(); | 530 SetSingleSelect(nHitIndex); |
531 | 531 } |
532 return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left), | 532 |
533 point.y - (m_ptScrollPos.y - rcPlate.top)); | 533 if (!IsItemVisible(nHitIndex)) |
534 } | 534 ScrollToListItem(nHitIndex); |
535 | 535 } |
536 CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point & point) const | 536 |
537 { | 537 void CFX_ListCtrl::OnVK(int32_t nItemIndex, FX_BOOL bShift, FX_BOOL bCtrl) { |
538 CPDF_Rect rcPlate = GetPlateRect(); | 538 if (IsMultipleSel()) { |
539 | 539 if (nItemIndex >= 0 && nItemIndex < GetCount()) { |
540 return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left), | 540 if (bCtrl) { |
541 point.y + (m_ptScrollPos.y - rcPlate.top)); | 541 } else if (bShift) { |
542 } | 542 m_aSelItems.DeselectAll(); |
543 | 543 m_aSelItems.Add(m_nFootIndex, nItemIndex); |
544 CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect & rect) const | 544 SelectItems(); |
545 { | 545 } else { |
546 CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left,rect.bottom)); | 546 m_aSelItems.DeselectAll(); |
547 CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right,rect.top)); | 547 m_aSelItems.Add(nItemIndex); |
548 | 548 SelectItems(); |
549 return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y
); | 549 m_nFootIndex = nItemIndex; |
550 } | 550 } |
551 | 551 |
552 CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect & rect) const | 552 SetCaret(nItemIndex); |
553 { | 553 } |
554 CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left,rect.bottom)); | 554 } else { |
555 CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right,rect.top)); | 555 SetSingleSelect(nItemIndex); |
556 | 556 } |
557 return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y
); | 557 |
558 } | 558 if (!IsItemVisible(nItemIndex)) |
559 | 559 ScrollToListItem(nItemIndex); |
560 void CFX_ListCtrl::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL b
Ctrl) | 560 } |
561 { | 561 |
562 int32_t nHitIndex = GetItemIndex(point); | 562 void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) { |
563 | 563 OnVK(IsMultipleSel() ? GetCaret() - 1 : GetSelect() - 1, bShift, bCtrl); |
564 if (IsMultipleSel()) | 564 } |
565 { | 565 |
566 if (bCtrl) | 566 void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) { |
567 { | 567 OnVK(IsMultipleSel() ? GetCaret() + 1 : GetSelect() + 1, bShift, bCtrl); |
568 if (IsItemSelected(nHitIndex)) | 568 } |
569 { | 569 |
570 m_aSelItems.Sub(nHitIndex); | 570 void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) { |
571 SelectItems(); | 571 OnVK(0, bShift, bCtrl); |
572 m_bCtrlSel = FALSE; | 572 } |
573 } | 573 |
574 else | 574 void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) { |
575 { | 575 OnVK(GetCount() - 1, bShift, bCtrl); |
576 m_aSelItems.Add(nHitIndex); | 576 } |
577 SelectItems(); | 577 |
578 m_bCtrlSel = TRUE; | 578 void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) { |
579 } | 579 OnVK(0, bShift, bCtrl); |
580 | 580 } |
581 m_nFootIndex = nHitIndex; | 581 |
582 } | 582 void CFX_ListCtrl::OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) { |
583 else if (bShift) | 583 OnVK(GetCount() - 1, bShift, bCtrl); |
584 { | 584 } |
585 m_aSelItems.DeselectAll(); | 585 |
586 m_aSelItems.Add(m_nFootIndex,nHitIndex); | 586 FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar, FX_BOOL bShift, FX_BOOL bCtrl) { |
587 SelectItems(); | 587 int32_t nIndex = GetLastSelected(); |
588 } | 588 int32_t nFindIndex = FindNext(nIndex, nChar); |
589 else | 589 |
590 { | 590 if (nFindIndex != nIndex) { |
591 m_aSelItems.DeselectAll(); | 591 OnVK(nFindIndex, bShift, bCtrl); |
592 m_aSelItems.Add(nHitIndex); | 592 return TRUE; |
593 SelectItems(); | 593 } |
594 | 594 return FALSE; |
595 m_nFootIndex = nHitIndex; | |
596 } | |
597 | |
598 SetCaret(nHitIndex); | |
599 } | |
600 else | |
601 { | |
602 SetSingleSelect(nHitIndex); | |
603 } | |
604 | |
605 if (!IsItemVisible(nHitIndex)) | |
606 ScrollToListItem(nHitIndex); | |
607 } | |
608 | |
609 void CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL b
Ctrl) | |
610 { | |
611 int32_t nHitIndex = GetItemIndex(point); | |
612 | |
613 if (IsMultipleSel()) | |
614 { | |
615 if (bCtrl) | |
616 { | |
617 if (m_bCtrlSel) | |
618 m_aSelItems.Add(m_nFootIndex,nHitIndex); | |
619 else | |
620 m_aSelItems.Sub(m_nFootIndex,nHitIndex); | |
621 | |
622 SelectItems(); | |
623 } | |
624 else | |
625 { | |
626 m_aSelItems.DeselectAll(); | |
627 m_aSelItems.Add(m_nFootIndex,nHitIndex); | |
628 SelectItems(); | |
629 } | |
630 | |
631 SetCaret(nHitIndex); | |
632 } | |
633 else | |
634 { | |
635 SetSingleSelect(nHitIndex); | |
636 } | |
637 | |
638 if (!IsItemVisible(nHitIndex)) | |
639 ScrollToListItem(nHitIndex); | |
640 } | |
641 | |
642 void CFX_ListCtrl::OnVK(int32_t nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) | |
643 { | |
644 if (IsMultipleSel()) | |
645 { | |
646 if (nItemIndex >= 0 && nItemIndex < GetCount()) | |
647 { | |
648 if (bCtrl) | |
649 { | |
650 } | |
651 else if (bShift) | |
652 { | |
653 m_aSelItems.DeselectAll(); | |
654 m_aSelItems.Add(m_nFootIndex,nItemIndex); | |
655 SelectItems(); | |
656 } | |
657 else | |
658 { | |
659 m_aSelItems.DeselectAll(); | |
660 m_aSelItems.Add(nItemIndex); | |
661 SelectItems(); | |
662 m_nFootIndex = nItemIndex; | |
663 } | |
664 | |
665 SetCaret(nItemIndex); | |
666 } | |
667 } | |
668 else | |
669 { | |
670 SetSingleSelect(nItemIndex); | |
671 } | |
672 | |
673 if (!IsItemVisible(nItemIndex)) | |
674 ScrollToListItem(nItemIndex); | |
675 } | |
676 | |
677 void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) | |
678 { | |
679 OnVK(IsMultipleSel() ? GetCaret()-1 : GetSelect()-1, bShift, bCtrl); | |
680 } | |
681 | |
682 void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) | |
683 { | |
684 OnVK(IsMultipleSel() ? GetCaret()+1 : GetSelect()+1, bShift, bCtrl); | |
685 } | |
686 | |
687 void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) | |
688 { | |
689 OnVK(0, bShift, bCtrl); | |
690 } | |
691 | |
692 void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) | |
693 { | |
694 OnVK(GetCount()-1, bShift, bCtrl); | |
695 } | |
696 | |
697 void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) | |
698 { | |
699 OnVK(0, bShift, bCtrl); | |
700 } | |
701 | |
702 void CFX_ListCtrl::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) | |
703 { | |
704 OnVK(GetCount()-1, bShift, bCtrl); | |
705 } | |
706 | |
707 FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) | |
708 { | |
709 int32_t nIndex = GetLastSelected(); | |
710 int32_t nFindIndex = FindNext(nIndex,nChar); | |
711 | |
712 if (nFindIndex != nIndex) | |
713 { | |
714 OnVK(nFindIndex, bShift, bCtrl); | |
715 return TRUE; | |
716 } | |
717 return FALSE; | |
718 } | 595 } |
719 | 596 |
720 /* -------- inner methods ------- */ | 597 /* -------- inner methods ------- */ |
721 | 598 |
722 void CFX_ListCtrl::SetPlateRect(const CPDF_Rect & rect) | 599 void CFX_ListCtrl::SetPlateRect(const CPDF_Rect& rect) { |
723 { | 600 CFX_ListContainer::SetPlateRect(rect); |
724 CFX_ListContainer::SetPlateRect(rect); | 601 m_ptScrollPos.x = rect.left; |
725 m_ptScrollPos.x = rect.left; | 602 SetScrollPos(CPDF_Point(rect.left, rect.top)); |
726 SetScrollPos(CPDF_Point(rect.left,rect.top)); | 603 ReArrange(0); |
727 ReArrange(0); | 604 InvalidateItem(-1); |
728 InvalidateItem(-1); | 605 } |
729 } | 606 |
730 | 607 CPDF_Rect CFX_ListCtrl::GetItemRect(int32_t nIndex) const { |
731 CPDF_Rect CFX_ListCtrl::GetItemRect(int32_t nIndex) const | 608 return InToOut(CFX_List::GetItemRect(nIndex)); |
732 { | 609 } |
733 return InToOut(CFX_List::GetItemRect(nIndex)); | 610 |
734 } | 611 void CFX_ListCtrl::AddString(const FX_WCHAR* string) { |
735 | 612 AddItem(string); |
736 void CFX_ListCtrl::AddString(const FX_WCHAR* string) | 613 ReArrange(GetCount() - 1); |
737 { | 614 } |
738 AddItem(string); | 615 |
739 ReArrange(GetCount() - 1); | 616 void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected) { |
740 } | 617 if (!IsValid(nItemIndex)) |
741 | 618 return; |
742 void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected) | 619 |
743 { | 620 if (bSelected != IsItemSelected(nItemIndex)) { |
744 if (!IsValid(nItemIndex)) return; | 621 if (bSelected) { |
745 | 622 SetItemSelect(nItemIndex, TRUE); |
746 if (bSelected != IsItemSelected(nItemIndex)) | 623 InvalidateItem(nItemIndex); |
747 { | 624 } else { |
748 if (bSelected) | 625 SetItemSelect(nItemIndex, FALSE); |
749 { | 626 InvalidateItem(nItemIndex); |
750 SetItemSelect(nItemIndex,TRUE); | 627 } |
751 InvalidateItem(nItemIndex); | 628 } |
752 } | 629 } |
753 else | 630 |
754 { | 631 void CFX_ListCtrl::SetSingleSelect(int32_t nItemIndex) { |
755 SetItemSelect(nItemIndex,FALSE); | 632 if (!IsValid(nItemIndex)) |
756 InvalidateItem(nItemIndex); | 633 return; |
757 } | 634 |
758 } | 635 if (m_nSelItem != nItemIndex) { |
759 } | 636 if (m_nSelItem >= 0) { |
760 | 637 SetItemSelect(m_nSelItem, FALSE); |
761 void CFX_ListCtrl::SetSingleSelect(int32_t nItemIndex) | 638 InvalidateItem(m_nSelItem); |
762 { | 639 } |
763 if (!IsValid(nItemIndex)) return; | 640 |
764 | 641 SetItemSelect(nItemIndex, TRUE); |
765 if (m_nSelItem != nItemIndex) | 642 InvalidateItem(nItemIndex); |
766 { | 643 m_nSelItem = nItemIndex; |
767 if (m_nSelItem >= 0) | 644 } |
768 { | 645 } |
769 SetItemSelect(m_nSelItem,FALSE); | 646 |
770 InvalidateItem(m_nSelItem); | 647 void CFX_ListCtrl::SetCaret(int32_t nItemIndex) { |
771 } | 648 if (!IsValid(nItemIndex)) |
772 | 649 return; |
773 SetItemSelect(nItemIndex,TRUE); | 650 |
774 InvalidateItem(nItemIndex); | 651 if (IsMultipleSel()) { |
775 m_nSelItem = nItemIndex; | 652 int32_t nOldIndex = m_nCaretIndex; |
776 } | 653 |
777 } | 654 if (nOldIndex != nItemIndex) { |
778 | 655 m_nCaretIndex = nItemIndex; |
779 void CFX_ListCtrl::SetCaret(int32_t nItemIndex) | 656 |
780 { | 657 SetItemCaret(nOldIndex, FALSE); |
781 if (!IsValid(nItemIndex)) return; | 658 SetItemCaret(nItemIndex, TRUE); |
782 | 659 |
783 if (IsMultipleSel()) | 660 InvalidateItem(nOldIndex); |
784 { | 661 InvalidateItem(nItemIndex); |
785 int32_t nOldIndex = m_nCaretIndex; | 662 } |
786 | 663 } |
787 if (nOldIndex != nItemIndex) | 664 } |
788 { | 665 |
789 m_nCaretIndex = nItemIndex; | 666 void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) { |
790 | 667 if (m_pNotify) { |
791 SetItemCaret(nOldIndex, FALSE); | 668 if (nItemIndex == -1) { |
792 SetItemCaret(nItemIndex,TRUE); | 669 if (!m_bNotifyFlag) { |
793 | 670 m_bNotifyFlag = TRUE; |
794 InvalidateItem(nOldIndex); | 671 CPDF_Rect rcRefresh = GetPlateRect(); |
795 InvalidateItem(nItemIndex); | 672 m_pNotify->IOnInvalidateRect(&rcRefresh); |
796 } | 673 m_bNotifyFlag = FALSE; |
797 } | 674 } |
798 } | 675 } else { |
799 | 676 if (!m_bNotifyFlag) { |
800 void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) | 677 m_bNotifyFlag = TRUE; |
801 { | 678 CPDF_Rect rcRefresh = GetItemRect(nItemIndex); |
802 if (m_pNotify) | 679 rcRefresh.left -= 1.0f; |
803 { | 680 rcRefresh.right += 1.0f; |
804 if (nItemIndex == -1) | 681 rcRefresh.bottom -= 1.0f; |
805 { | 682 rcRefresh.top += 1.0f; |
806 if (!m_bNotifyFlag) | 683 |
807 { | 684 m_pNotify->IOnInvalidateRect(&rcRefresh); |
808 m_bNotifyFlag = TRUE; | 685 m_bNotifyFlag = FALSE; |
809 CPDF_Rect rcRefresh = GetPlateRect(); | 686 } |
810 m_pNotify->IOnInvalidateRect(&rcRefresh); | 687 } |
811 m_bNotifyFlag = FALSE; | 688 } |
812 } | 689 } |
813 } | 690 |
814 else | 691 void CFX_ListCtrl::SelectItems() { |
815 { | 692 for (int32_t i = 0, sz = m_aSelItems.GetCount(); i < sz; i++) { |
816 if (!m_bNotifyFlag) | 693 int32_t nItemIndex = m_aSelItems.GetItemIndex(i); |
817 { | 694 int32_t nState = m_aSelItems.GetState(i); |
818 m_bNotifyFlag = TRUE; | 695 |
819 CPDF_Rect rcRefresh = GetItemRect(nItemIndex); | 696 switch (nState) { |
820 rcRefresh.left -= 1.0f; | 697 case 1: |
821 rcRefresh.right += 1.0f; | 698 SetMultipleSelect(nItemIndex, TRUE); |
822 rcRefresh.bottom -= 1.0f; | 699 break; |
823 rcRefresh.top += 1.0f; | 700 case -1: |
824 | 701 SetMultipleSelect(nItemIndex, FALSE); |
825 m_pNotify->IOnInvalidateRect(&rcRefresh); | 702 break; |
826 m_bNotifyFlag = FALSE; | 703 } |
827 } | 704 } |
828 } | 705 |
829 } | 706 m_aSelItems.Done(); |
830 } | 707 } |
831 | 708 |
832 void CFX_ListCtrl::SelectItems() | 709 void CFX_ListCtrl::Select(int32_t nItemIndex) { |
833 { | 710 if (!IsValid(nItemIndex)) |
834 for (int32_t i=0,sz=m_aSelItems.GetCount(); i<sz; i++) | 711 return; |
835 { | 712 |
836 int32_t nItemIndex = m_aSelItems.GetItemIndex(i); | 713 if (IsMultipleSel()) { |
837 int32_t nState = m_aSelItems.GetState(i); | 714 m_aSelItems.Add(nItemIndex); |
838 | 715 SelectItems(); |
839 switch(nState) | 716 } else |
840 { | 717 SetSingleSelect(nItemIndex); |
841 case 1: | 718 } |
842 SetMultipleSelect(nItemIndex, TRUE); | 719 |
843 break; | 720 FX_BOOL CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const { |
844 case -1: | 721 CPDF_Rect rcPlate = GetPlateRect(); |
845 SetMultipleSelect(nItemIndex, FALSE); | 722 CPDF_Rect rcItem = GetItemRect(nItemIndex); |
846 break; | 723 |
847 } | 724 return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; |
848 } | 725 } |
849 | 726 |
850 m_aSelItems.Done(); | 727 void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { |
851 } | 728 if (!IsValid(nItemIndex)) |
852 | 729 return; |
853 void CFX_ListCtrl::Select(int32_t nItemIndex) | 730 |
854 { | 731 CPDF_Rect rcPlate = GetPlateRect(); |
855 if (!IsValid(nItemIndex)) return; | 732 CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex); |
856 | 733 CPDF_Rect rcItemCtrl = GetItemRect(nItemIndex); |
857 if (IsMultipleSel()) | 734 |
858 { | 735 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { |
859 m_aSelItems.Add(nItemIndex); | 736 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { |
860 SelectItems(); | 737 SetScrollPosY(rcItem.bottom + rcPlate.Height()); |
861 } | 738 } |
862 else | 739 } else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { |
863 SetSingleSelect(nItemIndex); | 740 if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { |
864 } | 741 SetScrollPosY(rcItem.top); |
865 | 742 } |
866 FX_BOOL CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const | 743 } |
867 { | 744 } |
868 CPDF_Rect rcPlate = GetPlateRect(); | 745 |
869 CPDF_Rect rcItem = GetItemRect(nItemIndex); | 746 void CFX_ListCtrl::SetScrollInfo() { |
870 | 747 if (m_pNotify) { |
871 return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; | 748 CPDF_Rect rcPlate = GetPlateRect(); |
872 } | 749 CPDF_Rect rcContent = CFX_List::GetContentRect(); |
873 | 750 |
874 void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) | 751 if (!m_bNotifyFlag) { |
875 { | 752 m_bNotifyFlag = TRUE; |
876 if (!IsValid(nItemIndex)) return; | 753 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, |
877 | 754 rcContent.bottom, rcContent.top, |
878 CPDF_Rect rcPlate = GetPlateRect(); | 755 GetFirstHeight(), rcPlate.Height()); |
879 CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex); | 756 m_bNotifyFlag = FALSE; |
880 CPDF_Rect rcItemCtrl = GetItemRect(nItemIndex); | 757 } |
881 | 758 } |
882 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) | 759 } |
883 { | 760 |
884 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) | 761 void CFX_ListCtrl::SetScrollPos(const CPDF_Point& point) { |
885 { | 762 SetScrollPosY(point.y); |
886 SetScrollPosY(rcItem.bottom + rcPlate.Height()); | 763 } |
887 } | 764 |
888 } | 765 void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { |
889 else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) | 766 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { |
890 { | 767 CPDF_Rect rcPlate = GetPlateRect(); |
891 if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) | 768 CPDF_Rect rcContent = CFX_List::GetContentRect(); |
892 { | 769 |
893 SetScrollPosY(rcItem.top); | 770 if (rcPlate.Height() > rcContent.Height()) { |
894 } | 771 fy = rcPlate.top; |
895 } | 772 } else { |
896 } | 773 if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { |
897 | 774 fy = rcContent.bottom + rcPlate.Height(); |
898 void CFX_ListCtrl::SetScrollInfo() | 775 } else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) { |
899 { | 776 fy = rcContent.top; |
900 if (m_pNotify) | 777 } |
901 { | 778 } |
902 CPDF_Rect rcPlate = GetPlateRect(); | 779 |
903 CPDF_Rect rcContent = CFX_List::GetContentRect(); | 780 m_ptScrollPos.y = fy; |
904 | 781 InvalidateItem(-1); |
905 if (!m_bNotifyFlag) | 782 |
906 { | 783 if (m_pNotify) { |
907 m_bNotifyFlag = TRUE; | 784 if (!m_bNotifyFlag) { |
908 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top
, | 785 m_bNotifyFlag = TRUE; |
909 rcContent.bottom, rcContent.top, GetFirs
tHeight(), rcPlate.Height()); | 786 m_pNotify->IOnSetScrollPosY(fy); |
910 m_bNotifyFlag = FALSE; | 787 m_bNotifyFlag = FALSE; |
911 } | 788 } |
912 } | 789 } |
913 } | 790 } |
914 | 791 } |
915 void CFX_ListCtrl::SetScrollPos(const CPDF_Point & point) | 792 |
916 { | 793 CPDF_Rect CFX_ListCtrl::GetContentRect() const { |
917 SetScrollPosY(point.y); | 794 return InToOut(CFX_List::GetContentRect()); |
918 } | 795 } |
919 | 796 |
920 void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) | 797 void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { |
921 { | 798 CFX_List::ReArrange(nItemIndex); |
922 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy)) | 799 SetScrollInfo(); |
923 { | 800 } |
924 CPDF_Rect rcPlate = GetPlateRect(); | 801 |
925 CPDF_Rect rcContent = CFX_List::GetContentRect(); | 802 void CFX_ListCtrl::SetTopItem(int32_t nIndex) { |
926 | 803 if (IsValid(nIndex)) { |
927 if (rcPlate.Height() > rcContent.Height()) | 804 GetPlateRect(); |
928 { | 805 CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex); |
929 fy = rcPlate.top; | 806 SetScrollPosY(rcItem.top); |
930 } | 807 } |
931 else | 808 } |
932 { | 809 |
933 if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcCont
ent.bottom)) | 810 int32_t CFX_ListCtrl::GetTopItem() const { |
934 { | 811 int32_t nItemIndex = GetItemIndex(GetBTPoint()); |
935 fy = rcContent.bottom + rcPlate.Height(); | 812 |
936 } | 813 if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) |
937 else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) | 814 nItemIndex += 1; |
938 { | 815 |
939 fy = rcContent.top; | 816 return nItemIndex; |
940 } | 817 } |
941 } | 818 |
942 | 819 void CFX_ListCtrl::Empty() { |
943 m_ptScrollPos.y = fy; | 820 CFX_List::Empty(); |
944 InvalidateItem(-1); | 821 InvalidateItem(-1); |
945 | 822 } |
946 if (m_pNotify) | 823 |
947 { | 824 void CFX_ListCtrl::Cancel() { |
948 if (!m_bNotifyFlag) | 825 m_aSelItems.DeselectAll(); |
949 { | 826 } |
950 m_bNotifyFlag = TRUE; | 827 |
951 m_pNotify->IOnSetScrollPosY(fy); | 828 int32_t CFX_ListCtrl::GetItemIndex(const CPDF_Point& point) const { |
952 m_bNotifyFlag = FALSE; | 829 return CFX_List::GetItemIndex(OutToIn(point)); |
953 } | 830 } |
954 } | 831 |
955 } | 832 CFX_WideString CFX_ListCtrl::GetText() const { |
956 } | 833 if (IsMultipleSel()) |
957 | 834 return GetItemText(m_nCaretIndex); |
958 CPDF_Rect CFX_ListCtrl::GetContentRect() const | 835 return GetItemText(m_nSelItem); |
959 { | 836 } |
960 return InToOut(CFX_List::GetContentRect()); | |
961 } | |
962 | |
963 void CFX_ListCtrl::ReArrange(int32_t nItemIndex) | |
964 { | |
965 CFX_List::ReArrange(nItemIndex); | |
966 SetScrollInfo(); | |
967 } | |
968 | |
969 void CFX_ListCtrl::SetTopItem(int32_t nIndex) | |
970 { | |
971 if (IsValid(nIndex)) | |
972 { | |
973 GetPlateRect(); | |
974 CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex); | |
975 SetScrollPosY(rcItem.top); | |
976 } | |
977 } | |
978 | |
979 int32_t CFX_ListCtrl::GetTopItem() const | |
980 { | |
981 int32_t nItemIndex = GetItemIndex(GetBTPoint()); | |
982 | |
983 if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) | |
984 nItemIndex += 1; | |
985 | |
986 return nItemIndex; | |
987 } | |
988 | |
989 void CFX_ListCtrl::Empty() | |
990 { | |
991 CFX_List::Empty(); | |
992 InvalidateItem(-1); | |
993 } | |
994 | |
995 void CFX_ListCtrl::Cancel() | |
996 { | |
997 m_aSelItems.DeselectAll(); | |
998 } | |
999 | |
1000 int32_t CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const | |
1001 { | |
1002 return CFX_List::GetItemIndex(OutToIn(point)); | |
1003 } | |
1004 | |
1005 CFX_WideString CFX_ListCtrl::GetText() const | |
1006 { | |
1007 if (IsMultipleSel()) | |
1008 return GetItemText(m_nCaretIndex); | |
1009 return GetItemText(m_nSelItem); | |
1010 } | |
1011 | |
OLD | NEW |