]> cygwin.com Git - cygwin-apps/setup.git/blame - PickView.cc
Indentation.
[cygwin-apps/setup.git] / PickView.cc
CommitLineData
97647369
RC
1/*
2 * Copyright (c) 2002 Robert Collins.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by Robert Collins <robertc@hotmail.com>
13 *
14 */
15
16#include "PickView.h"
17#include <commctrl.h>
18#include "PickPackageLine.h"
19#include "PickCategoryLine.h"
20#include "package_db.h"
21#include "package_version.h"
22#include "dialog.h"
23#include "resource.h"
0cf68afd 24#include <algorithm>
693916f8
RC
25/* For 'source' */
26#include "state.h"
27#include "LogSingleton.h"
97647369 28
6625e635 29using namespace std;
97647369
RC
30
31static PickView::Header pkg_headers[] = {
32 {"Current", 7, 0, 0},
33 {"New", 3, 0, 0},
2fa7c5a4 34 {"Bin?", 4, 0, 0},
97647369 35 {"Src?", 4, 0, 0},
bfdf6ac2 36 {"Categories", 10, 0, 0},
97647369
RC
37 {"Package", 7, 0, 0},
38 {0, 0, 0, 0}
39};
40
41static PickView::Header cat_headers[] = {
42 {"Category", 8, 0, 0},
43 {"Current", 7, 0, 0},
44 {"New", 3, 0, 0},
2fa7c5a4 45 {"Bin?", 4, 0, 0},
97647369
RC
46 {"Src?", 4, 0, 0},
47 {"Package", 7, 0, 0},
48 {0, 0, 0, 0}
49};
50
51// PickView:: views
52const PickView::views PickView::views::Unknown (0);
53const PickView::views PickView::views::PackageFull (1);
e0aec95e
MB
54const PickView::views PickView::views::Package (2);
55const PickView::views PickView::views::PackageKeeps (3);
56const PickView::views PickView::views::PackageSkips = PickView::views (4);
57const PickView::views PickView::views::Category (5);
97647369 58
693916f8
RC
59ATOM PickView::WindowClassAtom = 0;
60
97647369
RC
61// DoInsertItem - inserts an item into a header control.
62// Returns the index of the new item.
63// hwndHeader - handle to the header control.
64// iInsertAfter - index of the previous item.
65// nWidth - width of the new item.
66// lpsz - address of the item string.
67static int
68DoInsertItem (HWND hwndHeader, int iInsertAfter, int nWidth, LPSTR lpsz)
69{
70 HDITEM hdi;
71 int index;
72
73 hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
74 hdi.pszText = lpsz;
75 hdi.cxy = nWidth;
76 hdi.cchTextMax = lstrlen (hdi.pszText);
77 hdi.fmt = HDF_LEFT | HDF_STRING;
78
79 index = SendMessage (hwndHeader, HDM_INSERTITEM,
80 (WPARAM) iInsertAfter, (LPARAM) & hdi);
81
82 return index;
83}
84
85
86
87void
88PickView::set_headers ()
89{
90 if (view_mode == views::Unknown)
91 return;
92 if (view_mode == views::PackageFull ||
e0aec95e
MB
93 view_mode == views::Package ||
94 view_mode == views::PackageKeeps ||
95 view_mode == views::PackageSkips)
97647369
RC
96 {
97 headers = pkg_headers;
98 current_col = 0;
99 new_col = 1;
2fa7c5a4
RC
100 bintick_col = new_col + 1;
101 srctick_col = bintick_col + 1;
102 cat_col = srctick_col + 1;
103 pkg_col = cat_col + 1;
931f2755 104 last_col = pkg_col;
97647369
RC
105 }
106 else if (view_mode == views::Category)
107 {
108 headers = cat_headers;
109 current_col = 1;
2fa7c5a4
RC
110 new_col = current_col + 1;
111 bintick_col = new_col + 1;
112 srctick_col = bintick_col + 1;
97647369 113 cat_col = 0;
2fa7c5a4
RC
114 pkg_col = srctick_col + 1;
115 last_col = pkg_col;
97647369
RC
116 }
117 else
118 return;
119 while (int n = SendMessage (listheader, HDM_GETITEMCOUNT, 0, 0))
120 {
121 SendMessage (listheader, HDM_DELETEITEM, n - 1, 0);
122 }
123 int i;
124 for (i = 0; i <= last_col; i++)
125 DoInsertItem (listheader, i, headers[i].width, (char *) headers[i].text);
126}
127
128void
3c054baf 129PickView::note_width (PickView::Header *hdrs, HDC dc, String const &string, int addend,
97647369
RC
130 int column)
131{
3c054baf 132 if (!string.size())
97647369
RC
133 {
134 if (hdrs[column].width < addend)
135 hdrs[column].width = addend;
136 return;
137 }
138 SIZE s;
3c054baf 139 GetTextExtentPoint32 (dc, string.cstr_oneuse(), string.size(), &s);
97647369
RC
140 if (hdrs[column].width < s.cx + addend)
141 hdrs[column].width = s.cx + addend;
142}
143
144void
145PickView::set_view_mode (PickView::views _mode)
146{
147 view_mode = _mode;
148 set_headers ();
149}
150
525531ca
RC
151void
152PickView::setViewMode (PickView::views mode)
153{
154 set_view_mode (mode);
155
156 clear_view ();
157 packagedb db;
158 if (get_view_mode () == PickView::views::Package)
159 {
160 for (vector <packagemeta *>::iterator i = db.packages.begin ();
161 i != db.packages.end (); ++i)
162 {
163 packagemeta & pkg = **i;
164 if ((!pkg.desired && pkg.installed)
165 || (pkg.desired && (pkg.desired.picked ()
166 || pkg.desired.sourcePackage().picked())))
167 insert_pkg (pkg);
168 }
169 }
170 else if (get_view_mode () == PickView::views::PackageKeeps)
171 {
172 for (vector <packagemeta *>::iterator i = db.packages.begin ();
173 i != db.packages.end (); ++i)
174 {
175 packagemeta & pkg = **i;
176 if (pkg.installed && pkg.desired && !pkg.desired.picked()
177 && !pkg.desired.sourcePackage().picked())
178 insert_pkg (pkg);
179 }
180 }
181 else if (get_view_mode () == PickView::views::PackageSkips)
182 {
183 for (vector <packagemeta *>::iterator i = db.packages.begin ();
184 i != db.packages.end (); ++i)
185 {
186 packagemeta & pkg = **i;
187 if (!pkg.desired && !pkg.installed)
188 insert_pkg (pkg);
189 }
190 }
191 else if (get_view_mode () == PickView::views::PackageFull)
192 {
193 for (vector <packagemeta *>::iterator i = db.packages.begin ();
194 i != db.packages.end (); ++i)
195 insert_pkg (**i);
196 }
197 else if (get_view_mode () == PickView::views::Category)
198 {
199 /* start collapsed. TODO: make this a chooser flag */
200 for (packagedb::categoriesType::iterator n
201 = packagedb::categories.begin();
202 n != packagedb::categories.end(); ++n)
203 insert_category (&*n, CATEGORY_COLLAPSED);
204 }
205
206 RECT r;
207 ::GetClientRect (GetHWND(), &r);
208 SCROLLINFO si;
209 memset (&si, 0, sizeof (si));
210 si.cbSize = sizeof (si);
211 si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
212 si.nMin = 0;
213 si.nMax = headers[last_col].x + headers[last_col].width; // + HMARGIN;
214 si.nPage = r.right;
215 SetScrollInfo (GetHWND(), SB_HORZ, &si, TRUE);
216
217 si.nMax = contents.itemcount () * row_height;
218 si.nPage = r.bottom - header_height;
219 SetScrollInfo (GetHWND(), SB_VERT, &si, TRUE);
220
221 scroll_ulc_x = scroll_ulc_y = 0;
222
223 InvalidateRect (GetHWND(), &r, TRUE);
224}
225
97647369
RC
226const char *
227PickView::mode_caption ()
228{
229 return view_mode.caption ();
230}
231
232const char *
233PickView::views::caption ()
234{
235 switch (_value)
236 {
237 case 1:
238 return "Full";
239 case 2:
240 return "Partial";
241 case 3:
e0aec95e
MB
242 return "Up To Date";
243 case 4:
244 return "Not Installed";
245 case 5:
97647369
RC
246 return "Category";
247 default:
248 return "";
249 }
250}
251
252void
253PickView::insert_pkg (packagemeta & pkg)
254{
255 if (view_mode != views::Category)
256 {
49cf3899 257 PickLine & line = *new PickPackageLine (*this, pkg);
97647369
RC
258 contents.insert (line);
259 }
260 else
261 {
405d7186
RC
262 for (set <String, String::caseless>::const_iterator x
263 = pkg.categories.begin (); x != pkg.categories.end (); ++x)
97647369 264 {
405d7186
RC
265 packagedb db;
266 // Special case - yuck
267 if (x->casecompare ("All") == 0)
268 continue;
269
270 PickCategoryLine & catline =
0cf68afd 271 *new PickCategoryLine (*this,* db.categories.find (*x), 1);
405d7186
RC
272 PickLine & line = *new PickPackageLine(*this, pkg);
273 catline.insert (line);
274 contents.insert (catline);
97647369
RC
275 }
276 }
277}
278
279void
280PickView::insert_category (Category * cat, bool collapsed)
281{
0cf68afd
RC
282 // Urk, special case
283 if (cat->first.casecompare ("All") == 0)
97647369
RC
284 return;
285 PickCategoryLine & catline = *new PickCategoryLine (*this, *cat, 1, collapsed);
0cf68afd
RC
286 for (vector <packagemeta *>::iterator i = cat->second.begin ();
287 i != cat->second.end () ; ++i)
97647369 288 {
405d7186 289 PickLine & line = *new PickPackageLine (*this, **i);
97647369
RC
290 catline.insert (line);
291 }
292 contents.insert (catline);
293}
294
295void
296PickView::clear_view (void)
297{
298 contents.empty ();
299 if (view_mode == views::Unknown)
300 return;
301 if (view_mode == views::PackageFull ||
e0aec95e
MB
302 view_mode == views::Package ||
303 view_mode == views::PackageKeeps ||
304 view_mode == views::PackageSkips)
97647369
RC
305 contents.ShowLabel (false);
306 else if (view_mode == views::Category)
307 contents.ShowLabel ();
308}
309
310PickView::views&
311PickView::views::operator++ ()
312{
313 ++_value;
314 if (_value > Category._value)
315 _value = 1;
316 return *this;
317}
318
319int
320PickView::click (int row, int x)
321{
322 return contents.click (0, row, x);
323}
324
325
326void
327PickView::scroll (HWND hwnd, int which, int *var, int code)
328{
329 SCROLLINFO si;
330 si.cbSize = sizeof (si);
e0aec95e 331 si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
97647369
RC
332 GetScrollInfo (hwnd, which, &si);
333
334 switch (code)
335 {
336 case SB_THUMBTRACK:
337 si.nPos = si.nTrackPos;
338 break;
339 case SB_THUMBPOSITION:
340 break;
341 case SB_BOTTOM:
342 si.nPos = si.nMax;
343 break;
344 case SB_TOP:
345 si.nPos = 0;
346 break;
347 case SB_LINEDOWN:
348 si.nPos += row_height;
349 break;
350 case SB_LINEUP:
351 si.nPos -= row_height;
352 break;
353 case SB_PAGEDOWN:
354 si.nPos += si.nPage * 9 / 10;
355 break;
356 case SB_PAGEUP:
357 si.nPos -= si.nPage * 9 / 10;
358 break;
359 }
360
361 if ((int) si.nPos < 0)
362 si.nPos = 0;
363 if (si.nPos + si.nPage > (unsigned int) si.nMax)
364 si.nPos = si.nMax - si.nPage;
365
366 si.fMask = SIF_POS;
367 SetScrollInfo (hwnd, which, &si, TRUE);
368
369 int ox = scroll_ulc_x;
370 int oy = scroll_ulc_y;
371 *var = si.nPos;
372
373 RECT cr, sr;
693916f8 374 ::GetClientRect (hwnd, &cr);
97647369
RC
375 sr = cr;
376 sr.top += header_height;
377 UpdateWindow (hwnd);
378 ScrollWindow (hwnd, ox - scroll_ulc_x, oy - scroll_ulc_y, &sr, &sr);
379 /*
380 sr.bottom = sr.top;
381 sr.top = cr.top;
382 ScrollWindow (hwnd, ox - scroll_ulc_x, 0, &sr, &sr);
383 */
384 if (ox - scroll_ulc_x)
385 {
693916f8 386 ::GetClientRect (listheader, &cr);
97647369
RC
387 sr = cr;
388// UpdateWindow (htmp);
693916f8 389 ::MoveWindow (listheader, -scroll_ulc_x, 0,
97647369
RC
390 headers[last_col].x +
391 headers[last_col].width, header_height, TRUE);
392 }
393 UpdateWindow (hwnd);
394}
395
396void
397PickView::init_headers (HDC dc)
398{
399 int i;
400
401 for (i = 0; headers[i].text; i++)
402 {
403 headers[i].width = 0;
404 headers[i].x = 0;
405 }
406
407 for (i = 0; headers[i].text; i++)
408 note_width (headers, dc, headers[i].text, HMARGIN, i);
409 /* src checkbox */
2fa7c5a4
RC
410 note_width (headers, dc, 0, HMARGIN + 11, bintick_col);
411 note_width (headers, dc, 0, HMARGIN + 11, srctick_col);
97647369 412 packagedb db;
0cf68afd
RC
413 for (packagedb::categoriesType::iterator n = packagedb::categories.begin();
414 n != packagedb::categories.end(); ++n)
415 note_width (headers, dc, String ("+ ")+n->first, HMARGIN, cat_col);
cfae3b8d
RC
416 for (vector <packagemeta *>::iterator n = db.packages.begin ();
417 n != db.packages.end (); ++n)
97647369 418 {
cfae3b8d 419 packagemeta & pkg = **n;
97647369 420 if (pkg.installed)
3c196821 421 note_width (headers, dc, pkg.installed.Canonical_version (),
97647369 422 HMARGIN, current_col);
3c196821
RC
423 for (set<packageversion>::iterator i=pkg.versions.begin();
424 i != pkg.versions.end(); ++i)
425 if (*i != pkg.installed)
97647369 426 note_width (headers, dc,
3c196821 427 i->Canonical_version (),
97647369 428 NEW_COL_SIZE_SLOP + HMARGIN, new_col);
3c054baf
RC
429 String s = pkg.name;
430 if (pkg.SDesc ().size())
431 s += String (": ") + pkg.SDesc ();
432 note_width (headers, dc, s, HMARGIN, pkg_col);
97647369
RC
433 }
434 note_width (headers, dc, "keep", NEW_COL_SIZE_SLOP + HMARGIN, new_col);
435 note_width (headers, dc, "uninstall", NEW_COL_SIZE_SLOP + HMARGIN, new_col);
436
437 headers[0].x = 0;
438 for (i = 1; i <= last_col; i++)
439 headers[i].x = headers[i - 1].x + headers[i - 1].width;
440}
441
442
693916f8
RC
443PickView::PickView (Category &cat) : deftrust (TRUST_UNKNOWN),
444contents (*this, cat, 0, false, true)
97647369 445{
693916f8 446}
97647369 447
693916f8
RC
448void
449PickView::init(views _mode)
450{
451 HDC dc = GetDC (GetHWND());
97647369
RC
452 sysfont = GetStockObject (DEFAULT_GUI_FONT);
453 SelectObject (dc, sysfont);
454 GetTextMetrics (dc, &tm);
455
456 bitmap_dc = CreateCompatibleDC (dc);
457 bm_spin = LoadImage (hinstance, MAKEINTRESOURCE (IDB_SPIN), IMAGE_BITMAP, 0, 0, 0);
458 bm_rtarrow = LoadImage (hinstance, MAKEINTRESOURCE (IDB_RTARROW), IMAGE_BITMAP,
459 0, 0, 0);
460
461 bm_checkyes = LoadImage (hinstance, MAKEINTRESOURCE (IDB_CHECK_YES), IMAGE_BITMAP,
462 0, 0, 0);
463 bm_checkno = LoadImage (hinstance, MAKEINTRESOURCE (IDB_CHECK_NO), IMAGE_BITMAP,
464 0, 0, 0);
465 bm_checkna = LoadImage (hinstance, MAKEINTRESOURCE (IDB_CHECK_NA), IMAGE_BITMAP,
466 0, 0, 0);
467
468 row_height = (tm.tmHeight + tm.tmExternalLeading + ROW_MARGIN);
469 int
470 irh =
471 tm.
472 tmExternalLeading +
473 tm.
474 tmDescent +
475 11 +
476 ROW_MARGIN;
477 if (row_height < irh)
478 row_height = irh;
479
480 RECT rcParent;
481 HDLAYOUT hdl;
482 WINDOWPOS wp;
483
484 // Ensure that the common control DLL is loaded, and then create
485 // the header control.
486 INITCOMMONCONTROLSEX controlinfo =
487 {
488 sizeof (INITCOMMONCONTROLSEX), ICC_LISTVIEW_CLASSES};
489 InitCommonControlsEx (&controlinfo);
490
491 if ((listheader = CreateWindowEx (0, WC_HEADER, (LPCTSTR) NULL,
492 WS_CHILD | WS_BORDER | CCS_NORESIZE |
493 // | HDS_BUTTONS
693916f8 494 HDS_HORZ, 0, 0, 0, 0, GetHWND(),
97647369
RC
495 (HMENU) IDC_CHOOSE_LISTHEADER, hinstance,
496 (LPVOID) NULL)) == NULL)
497 // FIXME: throw an exception
498 exit (10);
499
500 // Retrieve the bounding rectangle of the parent window's
501 // client area, and then request size and position values
502 // from the header control.
693916f8 503 ::GetClientRect (GetHWND(), &rcParent);
97647369
RC
504
505 hdl.prc = &rcParent;
506 hdl.pwpos = &wp;
507 if (!SendMessage (listheader, HDM_LAYOUT, 0, (LPARAM) & hdl))
508 // FIXME: throw an exception
509 exit (11);
510
09130e58
RC
511 // Set the font of the listheader, but don't redraw, because its not shown
512 // yet.This message does not return a value, so we are not checking it as we
513 // do above.
514 SendMessage (listheader, WM_SETFONT, (WPARAM) sysfont, FALSE);
97647369
RC
515
516 // Set the size, position, and visibility of the header control.
517 SetWindowPos (listheader, wp.hwndInsertAfter, wp.x, wp.y,
518 wp.cx, wp.cy, wp.flags | SWP_SHOWWINDOW);
519
520 header_height = wp.cy;
521
522 view_mode = PickView::views::Package;
523 set_headers ();
524 init_headers (dc);
525 view_mode = PickView::views::Category;
526 set_headers ();
527 init_headers (dc);
528
529 view_mode = _mode;
530 set_headers ();
531
9c9cfce7 532 ReleaseDC (GetHWND(), dc);
97647369 533}
49cf3899
RC
534
535PickView::~PickView()
536{
537}
693916f8
RC
538
539bool PickView::registerWindowClass ()
540{
541 if (WindowClassAtom != 0)
542 return true;
543
544 // We're not registered yet
545 WNDCLASSEX wc;
546
547 wc.cbSize = sizeof (wc);
548 // Some sensible style defaults
549 wc.style = CS_HREDRAW | CS_VREDRAW;
550 // Our default window procedure. This replaces itself
551 // on the first call with the simpler Window::WindowProcReflector().
552 wc.lpfnWndProc = Window::FirstWindowProcReflector;
553 // No class bytes
554 wc.cbClsExtra = 0;
555 // One pointer to REFLECTION_INFO in the extra window instance bytes
556 wc.cbWndExtra = 4;
557 // The app instance
558 wc.hInstance = hinstance; //GetInstance ();
559 // Use a bunch of system defaults for the GUI elements
560 wc.hIcon = LoadIcon (0, IDI_APPLICATION);
561 wc.hIconSm = NULL;
562 wc.hCursor = LoadCursor (0, IDC_ARROW);
563 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
564 // No menu
565 wc.lpszMenuName = NULL;
566 // We'll get a little crazy here with the class name
567 wc.lpszClassName = "listview";
568
569 // All set, try to register
570 WindowClassAtom = RegisterClassEx (&wc);
571 if (WindowClassAtom == 0)
572 log (LOG_BABBLE) << "Failed to register listview " << GetLastError () << endLog;
573 return WindowClassAtom != 0;
574}
575
576LRESULT CALLBACK
577PickView::list_vscroll (HWND hwnd, HWND hctl, UINT code, int pos)
578{
d2be933d 579 scroll (hwnd, SB_VERT, &scroll_ulc_y, code);
693916f8
RC
580 return 0;
581}
582
583LRESULT CALLBACK
584PickView::list_hscroll (HWND hwnd, HWND hctl, UINT code, int pos)
585{
d2be933d 586 scroll (hwnd, SB_HORZ, &scroll_ulc_x, code);
693916f8
RC
587 return 0;
588}
589
590LRESULT CALLBACK
591PickView::list_click (HWND hwnd, BOOL dblclk, int x, int y, UINT hitCode)
592{
593 int row, refresh;
594
d2be933d 595 if (contents.itemcount () == 0)
693916f8
RC
596 return 0;
597
d2be933d 598 if (y < header_height)
693916f8 599 return 0;
d2be933d
RC
600 x += scroll_ulc_x;
601 y += scroll_ulc_y - header_height;
693916f8 602
d2be933d 603 row = (y + ROW_MARGIN / 2) / row_height;
693916f8 604
d2be933d 605 if (row < 0 || row >= contents.itemcount ())
693916f8
RC
606 return 0;
607
d2be933d 608 refresh = click (row, x);
693916f8
RC
609
610 // XXX we need a method to queryt he database to see if more
611 // than just one package has changed! Until then...
612#if 0
613 if (refresh)
614 {
615#endif
616 RECT r;
9c9cfce7 617 ::GetClientRect (GetHWND(), &r);
693916f8
RC
618 SCROLLINFO si;
619 memset (&si, 0, sizeof (si));
620 si.cbSize = sizeof (si);
621 si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; /* SIF_RANGE was giving strange behaviour */
622 si.nMin = 0;
623
d2be933d
RC
624 si.nMax = contents.itemcount () * row_height;
625 si.nPage = r.bottom - header_height;
693916f8
RC
626
627 /* if we are under the minimum display count ,
628 * set the offset to 0
629 */
630 if ((unsigned int) si.nMax <= si.nPage)
d2be933d
RC
631 scroll_ulc_y = 0;
632 si.nPos = scroll_ulc_y;
693916f8 633
9c9cfce7 634 SetScrollInfo (GetHWND(), SB_VERT, &si, TRUE);
693916f8 635
9c9cfce7 636 InvalidateRect (GetHWND(), &r, TRUE);
693916f8
RC
637#if 0
638 }
639 else
640 {
641 RECT rect;
642 rect.left =
d2be933d 643 headers[new_col].x - scroll_ulc_x;
693916f8 644 rect.right =
d2be933d 645 headers[src_col + 1].x - scroll_ulc_x;
693916f8 646 rect.top =
d2be933d
RC
647 header_height + row * row_height -
648 scroll_ulc_y;
649 rect.bottom = rect.top + row_height;
693916f8
RC
650 InvalidateRect (hwnd, &rect, TRUE);
651 }
652#endif
653 return 0;
654}
655
656/*
657 * LRESULT CALLBACK
658 * PickView::listview_proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
659 */
660LRESULT
661PickView::WindowProc (UINT message, WPARAM wParam, LPARAM lParam)
662{
663 switch (message)
664 {
665 case WM_HSCROLL:
666 return HANDLE_WM_HSCROLL (GetHWND(), wParam, lParam, list_hscroll);
667 case WM_VSCROLL:
668 return HANDLE_WM_VSCROLL (GetHWND(), wParam, lParam, list_vscroll);
669 case WM_LBUTTONDOWN:
670 return HANDLE_WM_LBUTTONDOWN (GetHWND(), wParam, lParam, list_click);
671 case WM_PAINT:
672 paint (GetHWND());
673 return 0;
674 case WM_NOTIFY:
675 {
676 // pnmh = (LPNMHDR) lParam
677 LPNMHEADER phdr = (LPNMHEADER) lParam;
678 switch (phdr->hdr.code)
679 {
680 case HDN_ITEMCHANGED:
d2be933d 681 if (phdr->hdr.hwndFrom == ListHeader ())
693916f8
RC
682 {
683 if (phdr->pitem && phdr->pitem->mask & HDI_WIDTH)
d2be933d
RC
684 headers[phdr->iItem].width = phdr->pitem->cxy;
685 for (int i = 1; i <= last_col; i++)
686 headers[i].x =
687 headers[i - 1].x + headers[i - 1].width;
693916f8
RC
688 RECT r;
689 ::GetClientRect (GetHWND(), &r);
690 SCROLLINFO si;
691 si.cbSize = sizeof (si);
692 si.fMask = SIF_ALL | SIF_DISABLENOSCROLL;
693 GetScrollInfo (GetHWND(), SB_HORZ, &si);
694 int oldMax = si.nMax;
695 si.nMax =
d2be933d
RC
696 headers[last_col].x +
697 headers[last_col].width;
693916f8
RC
698 if (si.nTrackPos && oldMax > si.nMax)
699 si.nTrackPos += si.nMax - oldMax;
700 si.nPage = r.right;
701 SetScrollInfo (GetHWND(), SB_HORZ, &si, TRUE);
702 InvalidateRect (GetHWND(), &r, TRUE);
703 if (si.nTrackPos && oldMax > si.nMax)
d2be933d 704 scroll (GetHWND(), SB_HORZ, &scroll_ulc_x,
693916f8
RC
705 SB_THUMBTRACK);
706 }
707 break;
708 default:
709 break;
710 }
711 }
712 default:
713 return DefWindowProc (GetHWND(), message, wParam, lParam);
714 }
715}
716
693916f8
RC
717void
718PickView::paint (HWND hwnd)
719{
720 HDC hdc;
721 PAINTSTRUCT ps;
722 int x, y;
723
724 hdc = BeginPaint (hwnd, &ps);
725
d2be933d 726 SelectObject (hdc, sysfont);
693916f8
RC
727 SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
728 SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT));
729
730 RECT cr;
731 ::GetClientRect (hwnd, &cr);
732
d2be933d
RC
733 x = cr.left - scroll_ulc_x;
734 y = cr.top - scroll_ulc_y + header_height;
693916f8 735
d2be933d 736 IntersectClipRect (hdc, cr.left, cr.top + header_height, cr.right,
693916f8
RC
737 cr.bottom);
738
d2be933d 739 contents.paint (hdc, x, y, 0, (get_view_mode () ==
693916f8
RC
740 PickView::views::Category) ? 0 : 1);
741
d2be933d 742 if (contents.itemcount () == 0)
693916f8
RC
743 {
744 static const char *msg = "Nothing to Install/Update";
745 if (source == IDC_SOURCE_DOWNLOAD)
746 msg = "Nothing to Download";
d2be933d 747 TextOut (hdc, HMARGIN, header_height, msg, strlen (msg));
693916f8
RC
748 }
749
750 EndPaint (hwnd, &ps);
751}
752
753
754bool
755PickView::Create (Window * parent, DWORD Style, RECT *r)
756{
757
758 // First register the window class, if we haven't already
759 if (!registerWindowClass ())
760 {
761 // Registration failed
762 return false;
763 }
764
765 // Save our parent, we'll probably need it eventually.
766 setParent(parent);
767
768 // Create the window instance
769 CreateWindowEx (
770 // Extended Style
771 WS_EX_CLIENTEDGE,
772 "listview", //MAKEINTATOM(WindowClassAtom), // window class atom (name)
773 "listviewwindow", // no title-bar string yet
774 // Style bits
775 Style,
776 r ? r->left : CW_USEDEFAULT, r ? r->top : CW_USEDEFAULT,
777 r? r->right - r->left + 1 : CW_USEDEFAULT,
778 r? r->bottom - r->top + 1 :CW_USEDEFAULT,
779 // Parent Window
780 parent == NULL ? (HWND) NULL : parent->GetHWND (),
781 // use class menu
782 (HMENU) MAKEINTRESOURCE (IDC_CHOOSE_LIST),
783 // The application instance
784 GetInstance (),
785 // The this ptr, which we'll use to set up the WindowProc reflection.
786 reinterpret_cast<void *>((Window *)this));
693916f8
RC
787 if (GetHWND() == NULL)
788 {
789 log (LOG_BABBLE) << "Failed to create PickView " << GetLastError () << endLog;
790 return false;
791 }
792
793 return true;
794}
22120c90
RC
795
796void
797PickView::defaultTrust (trusts trust)
798{
799 this->deftrust = trust;
800 packagedb db;
801 for (vector <packagemeta *>::iterator i = db.packages.begin ();
802 i != db.packages.end (); ++i)
803 {
804 packagemeta & pkg = **i;
805 if (pkg.installed
806 || pkg.categories.find ("Base") != pkg.categories.end ()
807 || pkg.categories.find ("Misc") != pkg.categories.end ())
808 {
809 pkg.desired = pkg.trustp (trust);
810 if (pkg.desired)
811 pkg.desired.pick (pkg.desired.accessible()
812 && pkg.desired != pkg.installed);
813 }
814 else
815 pkg.desired = packageversion ();
816 }
817 RECT r;
818 ::GetClientRect (this->GetHWND(), &r);
819 InvalidateRect (this->GetHWND(), &r, TRUE);
820 // and then do the same for categories with no packages.
821 for (packagedb::categoriesType::iterator n = packagedb::categories.begin();
822 n != packagedb::categories.end(); ++n)
823 if (!n->second.size())
824 {
825 log (LOG_BABBLE) << "Removing empty category " << n->first << endLog;
826 packagedb::categories.erase (n++);
827 }
828}
ec2dbbf0
RC
829
830void
831PickView::refresh()
832{
833 setViewMode (get_view_mode ());
834}
This page took 0.119937 seconds and 5 git commands to generate.