Mail Archives: cygwin-developers/2001/06/29/20:51:17
This is a multi-part message in MIME format.
------=_NextPart_000_031D_01C10152.A6F4ED60
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
This is what I've got right now.
>Known bugs:
>1) The partial view when you enter the package list has a scroll bar one
>line too many long.
Not addressed. May not be present with the default view now categories.
>2) The category view always shows _all_ packages. There's no
>category-partial view. Do we need one?
not addressed.
3) I haven't added the lex rule for multi category parsing yet (but the
suporting c code is there.
I've changed the default view to categories. (It's the view constructor
call).
> >> I just played with this and I like what I see.
> >>
> >> I had a hard time getting all of the changes into the current CVS,
though,
> >> and the view was sort of screwed up.
clean patch attached.
> Either way, there would still be problems. I think that they are mainly
because
> of Michael's white space fixes.
>
> I sometimes wish that we had a C/C++ aware version of patch.
My .2c: update your CVS server. I have much much less problems with merges
with the sourceforge CVS server.
> >> Robert, if you are still interested, then I think that this is
definitely the
> >> way to go. If you have something worth checking in, then please do so.
I'll draw up change log stuff and send something to cygwin-patches... or did
you want me to hit CVS directly?
> I've included a new patch below. I took another stab at this and found
that I'd
> wiped out a huge chunk of a function. setup.exe seems to work much better
now.
>
> I've also included a setup.ini with categories. I haven't added
dependencies yet.
>
> I'm thinking that we should just nuke the "latest" and "contrib"
directories and
> create directories based on the name of the categories.
I don't think we even need separate directories - they don't do much once
the package system manages the view :].
Rob
------=_NextPart_000_031D_01C10152.A6F4ED60
Content-Type: application/octet-stream;
name="choose.h"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="choose.h"
/*=0A=
* Copyright (c) 2000, Red Hat, Inc.=0A=
*=0A=
* This program is free software; you can redistribute it and/or =
modify=0A=
* it under the terms of the GNU General Public License as published =
by=0A=
* the Free Software Foundation; either version 2 of the License, or=0A=
* (at your option) any later version.=0A=
*=0A=
* A copy of the GNU General Public License can be found at=0A=
* http://www.gnu.org/=0A=
*=0A=
* Written by Robert Collins <rbtcollins AT hotmail DOT com>=0A=
*=0A=
*/=0A=
=0A=
#ifndef _CHOOSE_H_=0A=
#define _CHOOSE_H_=0A=
=0A=
#include "ini.h"=0A=
=0A=
#define CATEGORY_EXPANDED 0=0A=
#define CATEGORY_COLLAPSED 1=0A=
=0A=
=0A=
struct _header=0A=
{=0A=
char *text;=0A=
int slen;=0A=
int width;=0A=
int x;=0A=
};=0A=
=0A=
typedef class _view view;=0A=
=0A=
class pick_line=0A=
{=0A=
public:=0A=
void set_line (Package *_pkg);=0A=
void set_line (Category *_cat);=0A=
void paint (HDC hdc, int x, int y, int row, int show_cat);=0A=
Package *get_pkg (void) { return pkg; };=0A=
Category *get_category (void) { return cat; };=0A=
int click (int x);=0A=
private:=0A=
Package *pkg;=0A=
Category *cat;=0A=
};=0A=
=0A=
class _view=0A=
{=0A=
public:=0A=
int num_columns;=0A=
views get_view_mode () { return view_mode; };=0A=
void set_view_mode(views _mode);=0A=
struct _header *headers;=0A=
_view (views mode, HDC dc);=0A=
char *mode_caption ();=0A=
void insert_pkg (Package *);=0A=
void insert_category (Category *, int);=0A=
void clear_view (void);=0A=
int click (int row, int x);=0A=
int current_col;=0A=
int new_col;=0A=
int src_col;=0A=
int cat_col;=0A=
int pkg_col;=0A=
int last_col;=0A=
pick_line * lines;=0A=
int nlines;=0A=
=0A=
private:=0A=
views view_mode;=0A=
void set_headers (void);=0A=
void init_headers (HDC dc);=0A=
void insert_at (int, pick_line);=0A=
void insert_under (int linen, pick_line line); =0A=
=0A=
};=0A=
=0A=
#endif /* _CHOOSE_H_ */=0A=
------=_NextPart_000_031D_01C10152.A6F4ED60
Content-Type: application/octet-stream;
name="currentsetup.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="currentsetup.patch"
? choose.h=0A=
? currentsetup.patch=0A=
? depends2.patch=0A=
? depends4.patch=0A=
? hierarchy.patch=0A=
? hierarchy2.patch=0A=
? home.patch=0A=
? work.patch=0A=
Index: choose.cc=0A=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A=
RCS file: /cvs/src/src/winsup/cinstall/choose.cc,v=0A=
retrieving revision 2.35=0A=
diff -u -p -r2.35 choose.cc=0A=
--- choose.cc 2001/06/25 05:55:22 2.35=0A=
+++ choose.cc 2001/06/30 00:48:22=0A=
@@ -25,7 +25,7 @@=0A=
install packages, or to install packages that aren't installed by=0A=
default. */=0A=
=0A=
-static char *cvsid =3D "\n%%% $Id: choose.cc,v 2.35 2001/06/25 05:55:22 =
cgf Exp $\n";=0A=
+static char *cvsid =3D "\n%%% $Id: choose.cc,v 2.33 2001/06/16 18:50:13 =
cgf Exp $\n";=0A=
=0A=
#include "win32.h"=0A=
#include <stdio.h>=0A=
@@ -43,6 +43,7 @@ static char *cvsid =3D "\n%%% $Id: choose.=0A=
#include "find.h"=0A=
#include "filemanip.h"=0A=
#include "mount.h"=0A=
+#include "choose.h"=0A=
=0A=
#include "port.h"=0A=
=0A=
@@ -55,8 +56,6 @@ static char *cvsid =3D "\n%%% $Id: choose.=0A=
=0A=
static int initialized =3D 0;=0A=
=0A=
-static int full_list =3D 0;=0A=
-=0A=
static int scroll_ulc_x, scroll_ulc_y;=0A=
=0A=
static HWND lv, nextbutton, choose_inst_text;=0A=
@@ -66,29 +65,30 @@ static HANDLE sysfont;=0A=
static int row_height;=0A=
static HANDLE bm_spin, bm_rtarrow, bm_checkyes, bm_checkno, bm_checkna;=0A=
static HDC bitmap_dc;=0A=
+static view *chooser =3D NULL;=0A=
+=0A=
+static struct _header pkg_headers[] =3D {=0A=
+ { "Current", 7, 0, 0 },=0A=
+ { "New", 3, 0, 0 },=0A=
+ { "Src?", 4, 0, 0 },=0A=
+ { "Category", 8, 0, 0 },=0A=
+ { "Package", 7, 0, 0 },=0A=
+ { 0, 0, 0, 0 }=0A=
+};=0A=
=0A=
-static struct=0A=
- {=0A=
- char *text;=0A=
- int slen;=0A=
- int width;=0A=
- int x;=0A=
- }=0A=
-headers[] =3D {=0A=
+static struct _header cat_headers[] =3D {=0A=
+ { "Category", 8, 0, 0 },=0A=
{ "Current", 7, 0, 0 },=0A=
-#define CURRENT_COL 0=0A=
{ "New", 3, 0, 0 },=0A=
-#define NEW_COL 1=0A=
{ "Src?", 4, 0, 0 },=0A=
-#define SRC_COL 2=0A=
{ "Package", 7, 0, 0 },=0A=
-#define PACKAGE_COL 3=0A=
{ 0, 0, 0, 0 }=0A=
};=0A=
-#define NUM_COLUMNS (sizeof (headers) / (sizeof (headers[0])) - 1)=0A=
=0A=
-int *package_indexes, nindexes;=0A=
+static int add_required(Package *pkg);=0A=
+static void set_view_mode (HWND h, views mode);=0A=
=0A=
+=0A=
static bool=0A=
isinstalled (Package *pkg, int trust)=0A=
{=0A=
@@ -100,11 +100,9 @@ isinstalled (Package *pkg, int trust)=0A=
static void=0A=
set_action (Package *pkg, bool preinc)=0A=
{=0A=
+ pkg->srcpicked =3D 0;=0A=
if (!pkg->action || preinc)=0A=
- {=0A=
- ((int) pkg->action)++;=0A=
- pkg->srcpicked =3D 0;=0A=
- }=0A=
+ ((int) pkg->action)++;=0A=
=0A=
/* Exercise the action state machine. */=0A=
for (;; ((int) pkg->action)++)=0A=
@@ -147,33 +145,89 @@ set_action (Package *pkg, bool preinc)=0A=
case ACTION_UNINSTALL:=0A=
if (pkg->installed)=0A=
return;=0A=
- break;=0A=
case ACTION_REDO:=0A=
- if (pkg->installed && pkg->info[pkg->installed_ix].install_exists)=0A=
+ if (pkg->installed)=0A=
{=0A=
pkg->trust =3D pkg->installed_ix;=0A=
return;=0A=
}=0A=
- break;=0A=
case ACTION_SRC_ONLY:=0A=
- if (pkg->info[pkg->trust].source_exists)=0A=
- {=0A=
- pkg->srcpicked =3D 1;=0A=
- return;=0A=
- }=0A=
+ if (pkg->installed && pkg->installed->source_exists)=0A=
+ return;=0A=
break;=0A=
case ACTION_SAME_LAST:=0A=
pkg->action =3D ACTION_SKIP;=0A=
/* Fall through intentionally */=0A=
case ACTION_SKIP:=0A=
- if (!pkg->installed || !pkg->info[pkg->installed_ix].install_exists)=0A=
- return;=0A=
- break;=0A=
+ return;=0A=
default:=0A=
log (0, "should never get here %d\n", pkg->action);=0A=
}=0A=
}=0A=
=0A=
+static int=0A=
+add_required (Package *pkg)=0A=
+{=0A=
+ Dependency *dp;=0A=
+ Package *required;=0A=
+ int c;=0A=
+ int changed =3D 0;=0A=
+ dp =3D pkg->required;=0A=
+ switch (pkg->action)=0A=
+ {=0A=
+ case ACTION_UNINSTALL:=0A=
+ case ACTION_ERROR:=0A=
+ case ACTION_UNKNOWN:=0A=
+ case ACTION_SRC_ONLY:=0A=
+ case ACTION_SKIP:=0A=
+ return 0;=0A=
+ default:=0A=
+ break;=0A=
+ }=0A=
+ while (dp)=0A=
+ {=0A=
+ if ((required =3D getpkgbyname(dp->package)) =3D=3D NULL)=0A=
+ {=0A=
+ dp=3Ddp->next;=0A=
+ continue;=0A=
+ }=0A=
+ switch (required->action)=0A=
+ {=0A=
+ case ACTION_PREV:=0A=
+ case ACTION_CURR:=0A=
+ case ACTION_TEST:=0A=
+ case ACTION_LAST:=0A=
+ case ACTION_SAME_CURR:=0A=
+ case ACTION_SAME_TEST:=0A=
+ case ACTION_SAME_PREV:=0A=
+ case ACTION_REDO:=0A=
+ case ACTION_SAME_LAST:=0A=
+ /* we are installing a user selected version */=0A=
+ break;=0A=
+ =0A=
+ case ACTION_UNINSTALL:=0A=
+ /* it's already installed - leave it */=0A=
+ required->action =3D ACTION_SKIP;=0A=
+ break;=0A=
+ case ACTION_ERROR:=0A=
+ case ACTION_UNKNOWN:=0A=
+ case ACTION_SRC_ONLY:=0A=
+ case ACTION_SKIP:=0A=
+ /* the current install will fail */=0A=
+ required->action =3D ACTION_PREV; /* this find prev, then curr, then =
test. */=0A=
+ set_action(required, 0); /* we need a find_best that gets =
installed, */=0A=
+ changed++; /* then current, then prev, then test */=0A=
+ chooser->insert_pkg (required);=0A=
+ break;=0A=
+ default:=0A=
+ log (0, "should never get here %d\n", required->action);=0A=
+ }=0A=
+ changed +=3D add_required (required);=0A=
+ dp=3Ddp->next;=0A=
+ }=0A=
+ return changed;=0A=
+}=0A=
+=0A=
/* Return an appropriate caption given the current action. */=0A=
const char *=0A=
choose_caption (Package *pkg)=0A=
@@ -226,56 +280,19 @@ paint (HWND hwnd)=0A=
y =3D cr.top - scroll_ulc_y + header_height;=0A=
=0A=
=0A=
- for (i =3D 0; headers[i].text; i++)=0A=
+ for (i =3D 0; i <=3D chooser->last_col ; i++)=0A=
{=0A=
- TextOut (hdc, x + headers[i].x, 3, headers[i].text, =
headers[i].slen);=0A=
- MoveToEx (hdc, x + headers[i].x, header_height-3, &p);=0A=
- LineTo (hdc, x + headers[i].x + headers[i].width, =
header_height-3);=0A=
+ TextOut (hdc, x + chooser->headers[i].x, 3, =
chooser->headers[i].text, chooser->headers[i].slen);=0A=
+ MoveToEx (hdc, x + chooser->headers[i].x, header_height-3, &p);=0A=
+ LineTo (hdc, x + chooser->headers[i].x + =
chooser->headers[i].width, header_height-3);=0A=
}=0A=
=0A=
IntersectClipRect (hdc, cr.left, cr.top + header_height, cr.right, =
cr.bottom);=0A=
-=0A=
- for (ii =3D 0; ii < nindexes; ii++)=0A=
- {=0A=
- i =3D package_indexes[ii];=0A=
- Package *pkg =3D package + i;=0A=
- int r =3D y + ii * row_height;=0A=
- int by =3D r + tm.tmHeight - 11;=0A=
- if (pkg->installed)=0A=
- {=0A=
- TextOut (hdc, x + headers[CURRENT_COL].x, r,=0A=
- pkg->installed->version, strlen (pkg->installed->version));=0A=
- SelectObject (bitmap_dc, bm_rtarrow);=0A=
- BitBlt (hdc, x + headers[CURRENT_COL].x + headers[0].width +=0A=
- ICON_MARGIN/2 + HMARGIN/2, by,=0A=
- 11, 11, bitmap_dc, 0, 0, SRCCOPY);=0A=
- }=0A=
=0A=
- const char *s =3D choose_caption (pkg);=0A=
- TextOut (hdc, x + headers[NEW_COL].x + NEW_COL_SIZE_SLOP, r,=0A=
- s, strlen (s));=0A=
- SelectObject (bitmap_dc, bm_spin);=0A=
- BitBlt (hdc, x + headers[NEW_COL].x, by, 11, 11,=0A=
- bitmap_dc, 0, 0, SRCCOPY);=0A=
+ for (ii =3D 0; ii < chooser->nlines; ii++)=0A=
+ chooser->lines[ii].paint (hdc, x, y, ii, (chooser->get_view_mode =
() =3D=3D VIEW_CATEGORY) ? 0 : 1);=0A=
=0A=
- HANDLE check_bm;=0A=
- if (pkg->srcpicked)=0A=
- check_bm =3D bm_checkyes;=0A=
- else=0A=
- check_bm =3D bm_checkno;=0A=
-=0A=
- SelectObject (bitmap_dc, check_bm);=0A=
- BitBlt (hdc, x + headers[SRC_COL].x, by, 11, 11,=0A=
- bitmap_dc, 0, 0, SRCCOPY);=0A=
-=0A=
- if (package[i].sdesc)=0A=
- s =3D package[i].sdesc;=0A=
- else=0A=
- s =3D package[i].name;=0A=
- TextOut (hdc, x + headers[PACKAGE_COL].x, r, s, strlen (s));=0A=
- }=0A=
-=0A=
- if (nindexes =3D=3D 0)=0A=
+ if (chooser->nlines =3D=3D 0)=0A=
{=0A=
static char *msg =3D "Nothing to Install/Update";=0A=
if (source =3D=3D IDC_SOURCE_DOWNLOAD)=0A=
@@ -360,9 +377,9 @@ list_hscroll (HWND hwnd, HWND hctl, UINT=0A=
static LRESULT CALLBACK=0A=
list_click (HWND hwnd, BOOL dblclk, int x, int y, UINT hitCode)=0A=
{=0A=
- int r;=0A=
+ int r,refresh;=0A=
=0A=
- if (nindexes =3D=3D 0)=0A=
+ if (chooser->nlines =3D=3D 0)=0A=
return 0;=0A=
=0A=
if (y < header_height)=0A=
@@ -372,26 +389,38 @@ list_click (HWND hwnd, BOOL dblclk, int =0A=
=0A=
r =3D (y + ROW_MARGIN/2) / row_height;=0A=
=0A=
- if (r < 0 || r >=3D nindexes)=0A=
+ if (r < 0 || r >=3D chooser->nlines)=0A=
return 0;=0A=
+=0A=
+ refresh =3D chooser->click (r, x);=0A=
+ =0A=
+ if (refresh)=0A=
+ {=0A=
+ RECT r;=0A=
+ GetClientRect (lv, &r);=0A=
+ SCROLLINFO si;=0A=
+ memset (&si, 0, sizeof (si));=0A=
+ si.cbSize =3D sizeof (si);=0A=
+ si.fMask =3D SIF_ALL; /* SIF_RANGE was giving strange behaviour */=0A=
+ si.nMin =3D 0;=0A=
+=0A=
+ si.nMax =3D chooser->nlines * row_height;=0A=
+ si.nPage =3D r.bottom - header_height;=0A=
+ si.nPos =3D scroll_ulc_y;=0A=
+ SetScrollInfo (lv, SB_VERT, &si, TRUE);=0A=
=0A=
- Package *pkg =3D package + package_indexes[r];=0A=
+ InvalidateRect (lv, &r, TRUE);=0A=
=0A=
- if (x >=3D headers[NEW_COL].x - (HMARGIN / 2)=0A=
- && x <=3D headers[NEW_COL + 1].x - (HMARGIN / 2))=0A=
- set_action (pkg, 1);=0A=
-=0A=
- if (pkg->info[pkg->trust].source_exists=0A=
- && x >=3D headers[SRC_COL].x - HMARGIN / 2=0A=
- && x <=3D headers[SRC_COL + 1].x - (HMARGIN / 2))=0A=
- pkg->srcpicked ^=3D 1;=0A=
-=0A=
- RECT rect;=0A=
- rect.left =3D headers[NEW_COL].x - scroll_ulc_x;=0A=
- rect.right =3D headers[SRC_COL + 1].x - scroll_ulc_x;=0A=
- rect.top =3D header_height + r * row_height - scroll_ulc_y;=0A=
- rect.bottom =3D rect.top + row_height;=0A=
- InvalidateRect (hwnd, &rect, TRUE);=0A=
+ }=0A=
+ else=0A=
+ {=0A=
+ RECT rect;=0A=
+ rect.left =3D chooser->headers[chooser->new_col].x - scroll_ulc_x;=0A=
+ rect.right =3D chooser->headers[chooser->src_col + 1].x - =
scroll_ulc_x;=0A=
+ rect.top =3D header_height + r * row_height - scroll_ulc_y;=0A=
+ rect.bottom =3D rect.top + row_height;=0A=
+ InvalidateRect (hwnd, &rect, TRUE);=0A=
+ }=0A=
}=0A=
=0A=
static LRESULT CALLBACK=0A=
@@ -437,14 +466,14 @@ register_windows (HINSTANCE hinst)=0A=
}=0A=
=0A=
static void=0A=
-note_width (HDC dc, char *string, int addend, int column)=0A=
+note_width (struct _header *hdrs, HDC dc, char *string, int addend, int =
column)=0A=
{=0A=
if (!string)=0A=
return;=0A=
SIZE s;=0A=
GetTextExtentPoint32 (dc, string, strlen (string), &s);=0A=
- if (headers[column].width < s.cx + addend)=0A=
- headers[column].width =3D s.cx + addend;=0A=
+ if (hdrs[column].width < s.cx + addend)=0A=
+ hdrs[column].width =3D s.cx + addend;=0A=
}=0A=
=0A=
static int=0A=
@@ -487,6 +516,14 @@ set_existence ()=0A=
}=0A=
=0A=
static void=0A=
+fill_missing_category ()=0A=
+{=0A=
+ for (Package *pkg =3D package; pkg->name; pkg++)=0A=
+ if (!pkg->category)=0A=
+ add_category (pkg, register_category ("Misc"));=0A=
+}=0A=
+=0A=
+static void=0A=
default_trust (HWND h, trusts trust)=0A=
{=0A=
int i, t, c;=0A=
@@ -494,6 +531,9 @@ default_trust (HWND h, trusts trust)=0A=
for (Package *pkg =3D package; pkg->name; pkg++)=0A=
{=0A=
pkg->action =3D (actions) trust;=0A=
+ if (pkg->category && !(getpackagecategorybyname (pkg, "Required") =
||=0A=
+ getpackagecategorybyname (pkg, "Misc")))=0A=
+ pkg->action =3D ACTION_SKIP;=0A=
set_action (pkg, 0);=0A=
}=0A=
RECT r;=0A=
@@ -503,24 +543,450 @@ default_trust (HWND h, trusts trust)=0A=
SetFocus (nextbutton);=0A=
}=0A=
=0A=
-static void=0A=
-set_full_list (HWND h, int isfull)=0A=
+void=0A=
+pick_line::set_line (Package *_pkg)=0A=
+{=0A=
+ pkg =3D _pkg;=0A=
+ cat =3D NULL;=0A=
+}=0A=
+=0A=
+void=0A=
+pick_line::set_line (Category *_cat)=0A=
+{=0A=
+ cat =3D _cat;=0A=
+ pkg =3D NULL;=0A=
+}=0A=
+=0A=
+void=0A=
+pick_line::paint (HDC hdc, int x, int y, int row, int show_cat)=0A=
+{=0A=
+ int r =3D y + row * row_height;=0A=
+ int by =3D r + tm.tmHeight - 11;=0A=
+ if (pkg)=0A=
+ {=0A=
+ if (pkg->installed)=0A=
+ {=0A=
+ TextOut (hdc, x + chooser->headers[chooser->current_col].x, r,=0A=
+ pkg->installed->version, strlen =
(pkg->installed->version));=0A=
+ SelectObject (bitmap_dc, bm_rtarrow);=0A=
+ BitBlt (hdc, x + chooser->headers[chooser->current_col].x + =
chooser->headers[0].width + ICON_MARGIN/2 + HMARGIN/2, by,=0A=
+ 11, 11, bitmap_dc, 0, 0, SRCCOPY);=0A=
+ }=0A=
+=0A=
+ const char *s =3D choose_caption (pkg);=0A=
+ TextOut (hdc, x + chooser->headers[chooser->new_col].x + =
NEW_COL_SIZE_SLOP, r,=0A=
+ s, strlen (s));=0A=
+ SelectObject (bitmap_dc, bm_spin);=0A=
+ BitBlt (hdc, x + chooser->headers[chooser->new_col].x, by, 11, 11,=0A=
+ bitmap_dc, 0, 0, SRCCOPY);=0A=
+=0A=
+ HANDLE check_bm;=0A=
+ if (pkg->srcpicked)=0A=
+ check_bm =3D bm_checkyes;=0A=
+ else=0A=
+ check_bm =3D bm_checkno;=0A=
+=0A=
+ SelectObject (bitmap_dc, check_bm);=0A=
+ BitBlt (hdc, x + chooser->headers[chooser->src_col].x, by, 11, 11,=0A=
+ bitmap_dc, 0, 0, SRCCOPY);=0A=
+=0A=
+ /* shows "first" category - do we want to show any? */=0A=
+ if (pkg->category && show_cat)=0A=
+ TextOut (hdc, x + chooser->headers[chooser->cat_col].x, r, =
pkg->category->name, strlen (pkg->category->name));=0A=
+=0A=
+ if (pkg->sdesc)=0A=
+ s =3D pkg->sdesc;=0A=
+ else=0A=
+ s =3D pkg->name;=0A=
+ TextOut (hdc, x + chooser->headers[chooser->pkg_col].x, r, s, =
strlen (s));=0A=
+ }=0A=
+ else if (cat)=0A=
+ {=0A=
+ TextOut (hdc, x + chooser->headers[chooser->cat_col].x, r, =
cat->name, strlen (cat->name));=0A=
+ }=0A=
+}=0A=
+=0A=
+int=0A=
+pick_line::click (int x)=0A=
+{=0A=
+ if (pkg)=0A=
+ {=0A=
+ if (x >=3D chooser->headers[chooser->src_col].x - HMARGIN/2 && x =
<=3D chooser->headers[chooser->src_col + 1].x - HMARGIN/2)=0A=
+ pkg->srcpicked ^=3D 1;=0A=
+=0A=
+ if (x >=3D chooser->headers[chooser->new_col].x - (HMARGIN / 2) && =
x <=3D chooser->headers[chooser->new_col + 1].x - HMARGIN/2)=0A=
+ {=0A=
+ set_action (pkg, 1);=0A=
+ /* Add any packages that are needed by this package */=0A=
+ return add_required (pkg);=0A=
+ }=0A=
+ }=0A=
+ else if (cat)=0A=
+ {=0A=
+ /* handle the catalog being clicked ... does this belong up a =
level.. ? */=0A=
+ }=0A=
+ =0A=
+ return 0;=0A=
+}=0A=
+=0A=
+_view::_view (views _mode, HDC dc)=0A=
+{=0A=
+ lines =3D NULL;=0A=
+ nlines =3D 0;=0A=
+ view_mode =3D VIEW_PACKAGE;=0A=
+ set_headers ();=0A=
+ init_headers (dc);=0A=
+ view_mode =3D VIEW_CATEGORY;=0A=
+ set_headers ();=0A=
+ init_headers (dc);=0A=
+=0A=
+ view_mode =3D _mode;=0A=
+ set_headers ();=0A=
+}=0A=
+=0A=
+void=0A=
+_view::set_view_mode (views _mode)=0A=
+{=0A=
+ if (_mode =3D=3D NVIEW)=0A=
+ view_mode =3D VIEW_PACKAGE_FULL;=0A=
+ else=0A=
+ view_mode =3D _mode;=0A=
+ set_headers ();=0A=
+}=0A=
+=0A=
+char *=0A=
+_view::mode_caption ()=0A=
+{=0A=
+ switch (view_mode)=0A=
+ {=0A=
+ case VIEW_UNKNOWN: return "";=0A=
+ case VIEW_PACKAGE_FULL: return "Full";=0A=
+ case VIEW_PACKAGE: return "Partial";=0A=
+ case VIEW_CATEGORY: return "Category";=0A=
+ default: return "";=0A=
+ }=0A=
+}=0A=
+=0A=
+void=0A=
+_view::set_headers (void)=0A=
+{=0A=
+ switch (view_mode)=0A=
+ {=0A=
+ case VIEW_UNKNOWN:=0A=
+ return;=0A=
+ case VIEW_PACKAGE_FULL: =0A=
+ case VIEW_PACKAGE: =0A=
+ headers =3D pkg_headers;=0A=
+ current_col =3D 0;=0A=
+ new_col =3D 1;=0A=
+ src_col =3D 2;=0A=
+ cat_col =3D 3;=0A=
+ pkg_col =3D 4;=0A=
+ last_col =3D 4;=0A=
+ break;=0A=
+ case VIEW_CATEGORY:=0A=
+ headers =3D cat_headers;=0A=
+ current_col =3D 1;=0A=
+ new_col =3D 2;=0A=
+ src_col =3D 3;=0A=
+ cat_col =3D 0;=0A=
+ pkg_col =3D 4;=0A=
+ last_col =3D 4;=0A=
+ default:=0A=
+ return;=0A=
+ }=0A=
+}=0A=
+=0A=
+void=0A=
+_view::init_headers (HDC dc)=0A=
{=0A=
int i;=0A=
- full_list =3D isfull;=0A=
+=0A=
+ for (i =3D 0; headers[i].text; i++)=0A=
+ headers[i].width =3D 0;=0A=
+=0A=
+ for (i =3D 0; headers[i].text; i++)=0A=
+ note_width (headers, dc, headers[i].text, 0, i);=0A=
+ for (Package *pkg =3D package; pkg->name; pkg++)=0A=
+ {=0A=
+ if (pkg->installed)=0A=
+ {=0A=
+ note_width (headers, dc, pkg->installed->version, 0, =
current_col);=0A=
+ note_width (headers, dc, pkg->installed->version, =
NEW_COL_SIZE_SLOP, new_col);=0A=
+ }=0A=
+ for (Info *inf =3D pkg->infoscan; inf < pkg->infoend; inf++)=0A=
+ note_width (headers, dc, inf->version, NEW_COL_SIZE_SLOP, =
new_col);=0A=
+ for (Category *cat =3D pkg->category; cat ; cat =3D cat->next)=0A=
+ note_width (headers, dc, cat->name, 0, cat_col);=0A=
+ note_width (headers, dc, pkg->name, 0, pkg_col);=0A=
+ note_width (headers, dc, pkg->sdesc, 0, pkg_col);=0A=
+ }=0A=
+ note_width (headers, dc, "keep", NEW_COL_SIZE_SLOP, new_col);=0A=
+ note_width (headers, dc, "uninstall", NEW_COL_SIZE_SLOP, new_col);=0A=
+=0A=
+ headers[0].x =3D HMARGIN/2;=0A=
+ for (i =3D 1; i <=3D last_col ; i++)=0A=
+ headers[i].x =3D headers[i-1].x + headers[i-1].width + ((i =3D=3D =
new_col) ? NEW_COL_SIZE_SLOP : 0) + HMARGIN;=0A=
+;=0A=
+}=0A=
+=0A=
+void=0A=
+_view::insert_pkg (Package *pkg)=0A=
+{=0A=
+ pick_line line;=0A=
+ line.set_line (pkg);=0A=
+ if (view_mode !=3D VIEW_CATEGORY)=0A=
+ {=0A=
+ if (lines =3D=3D NULL)=0A=
+ {=0A=
+ lines =3D (pick_line *) malloc ((npackages + ncategories) * =
sizeof (pick_line));=0A=
+ memset (lines, '\0', (npackages + ncategories) * sizeof =
(pick_line) );=0A=
+ nlines =3D 0;=0A=
+ insert_at (0, line);=0A=
+ }=0A=
+ else=0A=
+ insert_under (0, line);=0A=
+ }=0A=
+ else=0A=
+ {=0A=
+// assert (lines); /* protect against a coding change in future */=0A=
+ for (Category *cat =3D pkg->category; cat; cat =3D cat->next)=0A=
+ {=0A=
+ /* insert the package under this category in the list. If this =
category is not=0A=
+ visible, add it */=0A=
+ int n=3D0;=0A=
+ while (n < nlines)=0A=
+ {=0A=
+ /* this should be a generic call to list_sort_cmp */=0A=
+ if (lines[n].get_category ()=0A=
+ && cat->name =3D=3D lines[n].get_category ()->name)=0A=
+ insert_under (n, line);=0A=
+ n++;=0A=
+ }=0A=
+ if (n =3D=3D nlines)=0A=
+ {=0A=
+ /* the category wasn't visible - insert at the end */=0A=
+ insert_category (cat, CATEGORY_COLLAPSED);=0A=
+ insert_pkg (pkg);=0A=
+ }=0A=
+ }=0A=
+ }=0A=
+}=0A=
+=0A=
+void=0A=
+_view::insert_category (Category *cat, int collapsed)=0A=
+{=0A=
+ pick_line line;=0A=
+ line.set_line (cat);=0A=
+ if (lines =3D=3D NULL)=0A=
+ {=0A=
+ lines =3D (pick_line *) malloc ((npackages + ncategories) * =
sizeof (pick_line));=0A=
+ memset (lines, '\0', (npackages + ncategories) * sizeof =
(pick_line) );=0A=
+ nlines =3D 0;=0A=
+ insert_at (0, line);=0A=
+ if (!collapsed)=0A=
+ for (CategoryPackage *catpkg =3D cat->packages; catpkg; catpkg =3D =
catpkg->next)=0A=
+ insert_pkg (getpkgbyname (catpkg->pkg));=0A=
+ }=0A=
+ else=0A=
+ {=0A=
+ int n=3D0;=0A=
+ while (n < nlines)=0A=
+ {=0A=
+ /* this should be a generic call to list_sort_cmp */=0A=
+ if (lines[n].get_category ()=0A=
+ && strcasecmp (cat->name, lines[n].get_category ()->name) =
< 0)=0A=
+ {=0A=
+ insert_at (n, line);=0A=
+ if (!collapsed)=0A=
+ for (CategoryPackage *catpkg =3D cat->packages; catpkg; catpkg =3D =
catpkg->next)=0A=
+ insert_pkg (getpkgbyname (catpkg->pkg));=0A=
+ n =3D nlines;=0A=
+ }=0A=
+ else if (lines[n].get_category () =3D=3D cat)=0A=
+ n =3D nlines;=0A=
+ n++;=0A=
+=0A=
+ }=0A=
+ if (n =3D=3D nlines)=0A=
+ {=0A=
+ /* insert at the end */=0A=
+ insert_at (n, line);=0A=
+ if (!collapsed)=0A=
+ for (CategoryPackage *catpkg =3D cat->packages; catpkg; catpkg =3D =
catpkg->next)=0A=
+ insert_pkg (getpkgbyname (catpkg->pkg));=0A=
+ }=0A=
+ }=0A=
+}=0A=
+=0A=
+/* insert a new line at line n */=0A=
+void=0A=
+_view::insert_at (int n, pick_line line)=0A=
+{=0A=
+ if (n < 0 || n > nlines)=0A=
+ return;=0A=
+ memmove (&lines[n + 1], &lines[n], (nlines - n) * sizeof (pick_line));=0A=
+ lines[n] =3D line;=0A=
+ nlines++;=0A=
+}=0A=
+=0A=
+/* insert a new line in the chooser, at the next depth in from linen */=0A=
+void=0A=
+_view::insert_under (int linen, pick_line line)=0A=
+{=0A=
+ int n;=0A=
+ /* special case - empty view */=0A=
+ if (nlines =3D=3D 0)=0A=
+ {=0A=
+ insert_at (0, line);=0A=
+ return;=0A=
+ }=0A=
+ /* part 1 - find the appropriate bucket beginning */=0A=
+ if (lines[linen].get_category ())=0A=
+ {=0A=
+ n =3D linen + 1;=0A=
+ }=0A=
+ else if (lines[linen].get_pkg ())=0A=
+ {=0A=
+ n =3D linen;=0A=
+ /* walk up to the beginning of the bucket */=0A=
+ while (n > 0 && lines[n - 1].get_pkg ())=0A=
+ n--;=0A=
+ }=0A=
+ /* part 2 - insert in sorted order in the bucket */=0A=
+ while (n < nlines)=0A=
+ {=0A=
+ if (lines[n].get_category () || (lines[n].get_pkg ()=0A=
+ && strcasecmp (line.get_pkg ()->name, lines[n].get_pkg ()->name) < =
0))=0A=
+ {=0A=
+ insert_at (n, line);=0A=
+ n =3D nlines;=0A=
+ }=0A=
+ else if (lines[n].get_pkg () =3D=3D line.get_pkg ())=0A=
+ {=0A=
+ n =3D nlines;=0A=
+ }=0A=
+ n++;=0A=
+ }=0A=
+ if (n =3D=3D nlines)=0A=
+ {=0A=
+ /* insert at the end of this bucket */=0A=
+ insert_at (n, line);=0A=
+ }=0A=
+}=0A=
+=0A=
+void=0A=
+_view::clear_view (void)=0A=
+{=0A=
+ nlines =3D 0;=0A=
+}=0A=
+=0A=
+static views=0A=
+viewsplusplus(views theview)=0A=
+{=0A=
+ switch (theview)=0A=
+ {=0A=
+ case VIEW_UNKNOWN: return VIEW_PACKAGE_FULL;=0A=
+ case VIEW_PACKAGE_FULL: return VIEW_PACKAGE;=0A=
+ case VIEW_PACKAGE: return VIEW_CATEGORY;=0A=
+ case VIEW_CATEGORY: return NVIEW;=0A=
+ default: return VIEW_UNKNOWN;=0A=
+ }=0A=
+}=0A=
+=0A=
+int=0A=
+_view::click (int row, int x)=0A=
+{=0A=
+ if (row > nlines)=0A=
+ return 0;=0A=
+ if (lines[row].get_pkg ())=0A=
+ return lines[row].click (x);=0A=
+ else=0A=
+ {=0A=
+ /* if we are the last line or the next line is a category too, =
expand */=0A=
+ if (row =3D=3D (nlines -1) || lines[row + 1].get_category ())=0A=
+ {=0A=
+ int count =3D nlines;=0A=
+ for (CategoryPackage *catpkg =3D lines[row].get_category =
()->packages; catpkg; catpkg =3D catpkg->next)=0A=
+ {=0A=
+ Package * pkg =3D getpkgbyname (catpkg->pkg);=0A=
+ int n =3D row + 1;=0A=
+ pick_line line;=0A=
+ line.set_line (pkg);=0A=
+ /* this is a nasty hack. It will go away when the hierarchy is =
coded */=0A=
+ while (n < nlines)=0A=
+ {=0A=
+ if (lines[n].get_category () || (lines[n].get_pkg ()=0A=
+ && strcasecmp (pkg->name, lines[n].get_pkg ()->name) < 0))=0A=
+ {=0A=
+ insert_at (n, line);=0A=
+ n =3D nlines;=0A=
+ }=0A=
+ else if (lines[n].get_pkg () =3D=3D pkg)=0A=
+ {=0A=
+ n =3D nlines;=0A=
+ }=0A=
+ n++;=0A=
+ }=0A=
+ if (n =3D=3D nlines)=0A=
+ {=0A=
+ /* insert at the end of this category */=0A=
+ insert_at (n, line);=0A=
+ n=3Dnlines + 1;=0A=
+ }=0A=
+ }=0A=
+ return nlines - count;=0A=
+ }=0A=
+ else=0A=
+ /* contract */=0A=
+ {=0A=
+ int count =3D 0, n =3D row + 1;=0A=
+ while (n < nlines &! lines[n].get_category ())=0A=
+ {=0A=
+ memmove (&lines[n], &lines[n + 1], (nlines - n) * sizeof =
(pick_line));=0A=
+ nlines--;=0A=
+ count++;=0A=
+ }=0A=
+ return count;=0A=
+ }=0A=
+ }=0A=
+}=0A=
=0A=
- if (package_indexes =3D=3D 0)=0A=
- package_indexes =3D (int *) malloc (npackages * sizeof (int));=0A=
=0A=
- nindexes =3D 0;=0A=
+static void=0A=
+set_view_mode (HWND h, views mode)=0A=
+{=0A=
+ int i;=0A=
+ chooser->set_view_mode (mode);=0A=
+=0A=
+ chooser->clear_view ();=0A=
for (Package *pkg =3D package; pkg->name; pkg++)=0A=
if (!pkg->exclude)=0A=
{=0A=
- set_action (pkg, 0);=0A=
- if (isfull || !is_full_action (pkg))=0A=
- package_indexes[nindexes++] =3D pkg - package;=0A=
+ set_action (pkg, 0);=0A=
}=0A=
=0A=
+ switch (chooser->get_view_mode ())=0A=
+ {=0A=
+ case VIEW_PACKAGE:=0A=
+ for (Package *pkg =3D package; pkg->name; pkg++)=0A=
+ if (!pkg->exclude && is_download_action (pkg)) =0A=
+ chooser->insert_pkg (pkg); =0A=
+ break;=0A=
+ case VIEW_PACKAGE_FULL:=0A=
+ for (Package *pkg =3D package; pkg->name; pkg++)=0A=
+ if (!pkg->exclude) =0A=
+ chooser->insert_pkg (pkg); =0A=
+ break;=0A=
+ case VIEW_CATEGORY:=0A=
+ /* start collapsed. TODO: make this a chooser flag */=0A=
+ for (Category *cat =3D category; cat; cat =3D cat->next)=0A=
+ chooser->insert_category (cat, CATEGORY_COLLAPSED);=0A=
+ break;=0A=
+ default:=0A=
+ break;=0A=
+ }=0A=
+=0A=
RECT r;=0A=
GetClientRect (h, &r);=0A=
SCROLLINFO si;=0A=
@@ -528,11 +994,11 @@ set_full_list (HWND h, int isfull)=0A=
si.cbSize =3D sizeof (si);=0A=
si.fMask =3D SIF_ALL;=0A=
si.nMin =3D 0;=0A=
- si.nMax =3D headers[2].x + headers[2].width + HMARGIN;=0A=
+ si.nMax =3D chooser->headers[chooser->last_col].x + =
chooser->headers[chooser->last_col].width + HMARGIN;=0A=
si.nPage =3D r.right;=0A=
SetScrollInfo (h, SB_HORZ, &si, TRUE);=0A=
=0A=
- si.nMax =3D nindexes * row_height;=0A=
+ si.nMax =3D chooser->nlines * row_height;=0A=
si.nPage =3D r.bottom - header_height;=0A=
SetScrollInfo (h, SB_VERT, &si, TRUE);=0A=
=0A=
@@ -559,10 +1025,6 @@ create_listview (HWND dlg, RECT *r)=0A=
hinstance,=0A=
0);=0A=
ShowWindow (lv, SW_SHOW);=0A=
-=0A=
- for (i =3D 0; headers[i].text; i++)=0A=
- headers[i].width =3D 0;=0A=
-=0A=
HDC dc =3D GetDC (lv);=0A=
sysfont =3D GetStockObject (DEFAULT_GUI_FONT);=0A=
SelectObject (dc, sysfont);=0A=
@@ -576,32 +1038,14 @@ create_listview (HWND dlg, RECT *r)=0A=
if (row_height < irh)=0A=
row_height =3D irh;=0A=
=0A=
- for (i =3D 0; headers[i].text; i++)=0A=
- note_width (dc, headers[i].text, 0, i);=0A=
- for (Package *pkg =3D package; pkg->name; pkg++)=0A=
- {=0A=
- if (pkg->installed)=0A=
- {=0A=
- note_width (dc, pkg->installed->version, 0, CURRENT_COL);=0A=
- note_width (dc, pkg->installed->version, NEW_COL_SIZE_SLOP, NEW_COL);=0A=
- }=0A=
- for (Info *inf =3D pkg->infoscan; inf < pkg->infoend; inf++)=0A=
- note_width (dc, inf->version, NEW_COL_SIZE_SLOP, NEW_COL);=0A=
- note_width (dc, pkg->name, 0, PACKAGE_COL);=0A=
- note_width (dc, pkg->sdesc, 0, PACKAGE_COL);=0A=
- }=0A=
- note_width (dc, "keep", NEW_COL_SIZE_SLOP, NEW_COL);=0A=
- note_width (dc, "uninstall", NEW_COL_SIZE_SLOP, NEW_COL);=0A=
-=0A=
- headers[CURRENT_COL].x =3D HMARGIN/2;=0A=
- headers[NEW_COL].x =3D headers[CURRENT_COL].x + =
headers[CURRENT_COL].width +=0A=
- NEW_COL_SIZE_SLOP + HMARGIN;=0A=
- headers[SRC_COL].x =3D headers[NEW_COL].x + headers[NEW_COL].width + =
HMARGIN;=0A=
- headers[PACKAGE_COL].x =3D headers[SRC_COL].x + =
headers[SRC_COL].width +=0A=
- HMARGIN;=0A=
+ chooser =3D new (view) (VIEW_CATEGORY, dc);=0A=
=0A=
default_trust (lv, TRUST_CURR);=0A=
- set_full_list (lv, full_list);=0A=
+ set_view_mode (lv, VIEW_PACKAGE);=0A=
+ if (!SetDlgItemText (dlg, IDC_CHOOSE_VIEWCAPTION, =
chooser->mode_caption()))=0A=
+ log (LOG_BABBLE, "Failed to set View button caption %d", =
GetLastError() );=0A=
+ for (Package *foo =3D package; foo->name; foo++)=0A=
+ add_required(foo);=0A=
static int ta[] =3D { IDC_CHOOSE_CURR, 0 };=0A=
rbset (dlg, ta, IDC_CHOOSE_CURR);=0A=
=0A=
@@ -615,18 +1059,26 @@ dialog_cmd (HWND h, int id, HWND hwndctl=0A=
{=0A=
case IDC_CHOOSE_PREV:=0A=
default_trust (lv, TRUST_PREV);=0A=
- set_full_list (lv, full_list);=0A=
+ for (Package *foo =3D package; foo->name; foo++)=0A=
+ add_required(foo);=0A=
+ set_view_mode (lv, chooser->get_view_mode ());=0A=
break;=0A=
case IDC_CHOOSE_CURR:=0A=
default_trust (lv, TRUST_CURR);=0A=
- set_full_list (lv, full_list);=0A=
+ for (Package *foo =3D package; foo->name; foo++)=0A=
+ add_required(foo);=0A=
+ set_view_mode (lv, chooser->get_view_mode ());=0A=
break;=0A=
case IDC_CHOOSE_EXP:=0A=
default_trust (lv, TRUST_TEST);=0A=
- set_full_list (lv, full_list);=0A=
+ for (Package *foo =3D package; foo->name; foo++)=0A=
+ add_required(foo);=0A=
+ set_view_mode (lv, chooser->get_view_mode ());=0A=
break;=0A=
- case IDC_CHOOSE_FULLPART:=0A=
- set_full_list (lv, !full_list);=0A=
+ case IDC_CHOOSE_VIEW:=0A=
+ set_view_mode (lv, viewsplusplus (chooser->get_view_mode ()));=0A=
+ if (!SetDlgItemText (h, IDC_CHOOSE_VIEWCAPTION, =
chooser->mode_caption()))=0A=
+ log (LOG_BABBLE, "Failed to set View button caption %d", =
GetLastError() );=0A=
break;=0A=
=0A=
case IDOK:=0A=
@@ -804,6 +1256,28 @@ getpkgbyname (const char *pkgname)=0A=
return NULL;=0A=
}=0A=
=0A=
+/* Return a pointer to a category given the name. */=0A=
+Category *=0A=
+getcategorybyname (const char *categoryname)=0A=
+{=0A=
+ for (Category *cat =3D category; cat; cat=3Dcat->next)=0A=
+ if (strcasecmp (cat->name, categoryname) =3D=3D 0)=0A=
+ return cat;=0A=
+=0A=
+ return NULL;=0A=
+}=0A=
+=0A=
+/* Return a pointer to a category of a given package given the name. */=0A=
+Category *=0A=
+getpackagecategorybyname (Package *pkg, const char *categoryname)=0A=
+{=0A=
+ for (Category *cat =3D pkg->category; cat; cat =3D cat->next)=0A=
+ if (strcasecmp (cat->name, categoryname) =3D=3D 0)=0A=
+ return cat;=0A=
+=0A=
+ return NULL;=0A=
+}=0A=
+=0A=
static void=0A=
scan2 (char *path, unsigned int size)=0A=
{=0A=
@@ -936,7 +1410,7 @@ package_sort (const void *va, const void=0A=
{=0A=
Package *a =3D (Package *)va;=0A=
Package *b =3D (Package *)vb;=0A=
- return strcmp (a->name, b->name);=0A=
+ return strcasecmp (a->name, b->name);=0A=
}=0A=
=0A=
void=0A=
@@ -946,15 +1420,15 @@ do_choose (HINSTANCE h)=0A=
=0A=
nextbutton =3D 0;=0A=
bm_spin =3D LoadImage (h, MAKEINTRESOURCE (IDB_SPIN), IMAGE_BITMAP, =
0, 0, 0);=0A=
- bm_rtarrow =3D LoadImage (h, MAKEINTRESOURCE (IDB_RTARROW), =
IMAGE_BITMAP,=0A=
- 0, 0, 0);=0A=
+ bm_rtarrow =3D LoadImage (h, MAKEINTRESOURCE (IDB_RTARROW), =
IMAGE_BITMAP, =0A=
+ 0, 0, 0);=0A=
=0A=
bm_checkyes =3D LoadImage (h, MAKEINTRESOURCE (IDB_CHECK_YES), =
IMAGE_BITMAP,=0A=
- 0, 0, 0);=0A=
+ 0, 0, 0);=0A=
bm_checkno =3D LoadImage (h, MAKEINTRESOURCE (IDB_CHECK_NO), =
IMAGE_BITMAP,=0A=
- 0, 0, 0);=0A=
+ 0, 0, 0);=0A=
bm_checkna =3D LoadImage (h, MAKEINTRESOURCE (IDB_CHECK_NA), =
IMAGE_BITMAP,=0A=
- 0, 0, 0);=0A=
+ 0, 0, 0);=0A=
=0A=
register_windows (h);=0A=
=0A=
@@ -963,6 +1437,7 @@ do_choose (HINSTANCE h)=0A=
=0A=
read_installed_db ();=0A=
set_existence ();=0A=
+ fill_missing_category ();=0A=
=0A=
qsort (package, npackages, sizeof (package[0]), package_sort);=0A=
=0A=
@@ -986,24 +1461,24 @@ do_choose (HINSTANCE h)=0A=
: "unknown");=0A=
const char *excluded =3D (pkg->exclude ? "yes" : "no");=0A=
=0A=
- log (LOG_BABBLE,=0A=
- "[%s] action=3D%s trust=3D%s installed=3D%s excluded=3D%s =
src?=3D%s",=0A=
+ log (LOG_BABBLE, "[%s] action=3D%s trust=3D%s installed=3D%s =
excluded=3D%s src?=3D%s"=0A=
+ "category=3D%s",=0A=
pkg->name, action, trust, installed,=0A=
- excluded, pkg->srcpicked ? "yes" : "no");=0A=
+ excluded, pkg->srcpicked ? "yes" : "no", pkg->category);=0A=
for (int t =3D 1; t < NTRUST; t++)=0A=
{=0A=
if (pkg->info[t].install)=0A=
- log (LOG_BABBLE, " [%s] ver=3D%s\n"=0A=
- " inst=3D%s %d exists=3D%s\n"=0A=
- " src=3D%s %d exists=3D%s",=0A=
+ log (LOG_BABBLE, " [%s] ver=3D%s\r\n"=0A=
+ " inst=3D%s %d exists=3D%s\r\n"=0A=
+ " src=3D%s %d exists=3D%s",=0A=
infos[t],=0A=
pkg->info[t].version ?: "(none)",=0A=
pkg->info[t].install ?: "(none)",=0A=
pkg->info[t].install_size,=0A=
- (pkg->info[t].install_exists) ? "yes" : "no",=0A=
+ (pkg->info[t].install_exists) ? "yes":"no",=0A=
pkg->info[t].source ?: "(none)",=0A=
pkg->info[t].source_size,=0A=
- (pkg->info[t].source_exists) ? "yes" : "no");=0A=
+ (pkg->info[t].source_exists =3D=3D 1) ? "yes":"no");=0A=
}=0A=
}=0A=
}=0A=
Index: ini.h=0A=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A=
RCS file: /cvs/src/src/winsup/cinstall/ini.h,v=0A=
retrieving revision 2.13=0A=
diff -u -p -r2.13 ini.h=0A=
--- ini.h 2001/06/25 05:48:38 2.13=0A=
+++ ini.h 2001/06/30 00:48:22=0A=
@@ -13,6 +13,9 @@=0A=
*=0A=
*/=0A=
=0A=
+#ifndef _INI_H_=0A=
+#define _INI_H_=0A=
+=0A=
/* When setup.ini is parsed, the information is stored according to=0A=
the declarations here. ini.cc (via inilex and iniparse)=0A=
initializes these structures. choose.cc sets the action and trust=0A=
@@ -62,6 +65,15 @@ typedef enum=0A=
EXCLUDE_NOT_FOUND=0A=
} excludes;=0A=
=0A=
+typedef enum =0A=
+{=0A=
+ VIEW_UNKNOWN,=0A=
+ VIEW_PACKAGE_FULL,=0A=
+ VIEW_PACKAGE,=0A=
+ VIEW_CATEGORY,=0A=
+ NVIEW=0A=
+} views;=0A=
+=0A=
#define is_download_action(pkg) \=0A=
((pkg)->action =3D=3D ACTION_PREV || \=0A=
(pkg)->action =3D=3D ACTION_CURR || \=0A=
@@ -79,10 +91,6 @@ typedef enum=0A=
(pkg)->action =3D=3D ACTION_PREV || \=0A=
(pkg)->action =3D=3D ACTION_UNINSTALL)=0A=
=0A=
-#define is_full_action(pkg) \=0A=
- (((pkg)->action >=3D ACTION_SAME_PREV && (pkg)->action <=3D =
ACTION_SAME_TEST) \=0A=
- || (pkg)->action =3D=3D ACTION_SKIP)=0A=
-=0A=
#define SRCACTION_NO 0=0A=
#define SRCACTION_YES 1=0A=
typedef struct _Info=0A=
@@ -101,6 +109,19 @@ typedef struct _Info=0A=
#endif=0A=
} Info; /* +1 for TRUST_UNKNOWN */=0A=
=0A=
+typedef struct _CategoryPackage=0A=
+{=0A=
+ struct _CategoryPackage *next; /* The next package pointer in the =
list */=0A=
+ char *pkg; /* This should be Package *, but the packages can =
move*/=0A=
+} CategoryPackage;=0A=
+=0A=
+typedef struct _Category=0A=
+{=0A=
+ struct _Category *next; /* the next category in the list */=0A=
+ char *name; /* the category */=0A=
+ CategoryPackage *packages; /* the packages in this category */=0A=
+} Category;=0A=
+=0A=
typedef struct _Dependency=0A=
{=0A=
struct _Dependency *next; /* the next package in this dependency list =
*/=0A=
@@ -112,7 +133,7 @@ typedef struct=0A=
char *name; /* package name, like "cygwin" */=0A=
char *sdesc; /* short description (replaces "name" if provided) */=0A=
char *ldesc; /* long description (multi-line) */=0A=
- char *category; /* the category the package belongs to, like =
"required" or "XFree86" */=0A=
+ Category *category; /* the categories the package belongs to */ =0A=
Dependency *required; /* the packages required for this package to =
work */=0A=
actions action; /* A range of states applicable to this package */=0A=
trusts trust; /* Selects among info[] below, a subset of action */=0A=
@@ -133,6 +154,8 @@ typedef struct=0A=
=0A=
extern Package *package;=0A=
extern int npackages;=0A=
+extern Category *category;=0A=
+extern int ncategories;=0A=
=0A=
#ifdef __cplusplus=0A=
extern "C" {=0A=
@@ -142,7 +165,13 @@ Package *new_package (char *name);=0A=
void ini_init (char *string);=0A=
Package *getpkgbyname (const char *pkgname);=0A=
void new_requirement (Package *package, char *dependson);=0A=
+Category *getcategorybyname (const char *categoryname);=0A=
+Category *getpackagecategorybyname (Package *pkg, const char =
*categoryname); =0A=
+Category *register_category (char *name);=0A=
+void add_category (Package *package, Category *cat);=0A=
=0A=
#ifdef __cplusplus=0A=
}=0A=
#endif=0A=
+=0A=
+#endif /* _INI_H_ */=0A=
Index: iniparse.y=0A=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A=
RCS file: /cvs/src/src/winsup/cinstall/iniparse.y,v=0A=
retrieving revision 2.9=0A=
diff -u -p -r2.9 iniparse.y=0A=
--- iniparse.y 2001/06/15 04:05:31 2.9=0A=
+++ iniparse.y 2001/06/30 00:48:22=0A=
@@ -86,7 +86,8 @@ simple_line=0A=
: VERSION STRING { cpt->version =3D $2; }=0A=
| SDESC STRING { cp->sdesc =3D $2; }=0A=
| LDESC STRING { cp->ldesc =3D $2; }=0A=
- | CATEGORY STRING { cp->category =3D $2; }=0A=
+ | CATEGORY STRING { add_category (cp, register_category ($2));=0A=
+ }=0A=
| REQUIRES requires=0A=
| INSTALL STRING STRING { cpt->install =3D $2;=0A=
cpt->install_size =3D atoi($3);=0A=
@@ -121,11 +122,13 @@ requires=0A=
Package *package =3D NULL;=0A=
int npackages =3D 0;=0A=
static int maxpackages =3D 0;=0A=
+Category *category =3D NULL;=0A=
+int ncategories =3D 0;=0A=
=0A=
Package *=0A=
new_package (char *name)=0A=
{=0A=
- if (package =3D=3D 0)=0A=
+ if (package =3D=3D NULL)=0A=
maxpackages =3D npackages =3D 0;=0A=
if (npackages >=3D maxpackages)=0A=
{=0A=
@@ -149,7 +152,7 @@ new_package (char *name)=0A=
}=0A=
=0A=
void=0A=
-new_requirement(Package *package, char *dependson)=0A=
+new_requirement (Package *package, char *dependson)=0A=
{=0A=
Dependency *dp;=0A=
if (!dependson)=0A=
@@ -158,4 +161,58 @@ new_requirement(Package *package, char *=0A=
dp->next =3D cp->required;=0A=
dp->package =3D dependson;=0A=
cp->required =3D dp;=0A=
+}=0A=
+=0A=
+Category *=0A=
+register_category (char *name)=0A=
+{=0A=
+ Category *tempcat;=0A=
+ if (category =3D=3D NULL)=0A=
+ ncategories =3D 0;=0A=
+ tempcat =3D getcategorybyname (name);=0A=
+ if (!tempcat)=0A=
+ {=0A=
+ Category *sortcat =3D category;=0A=
+ tempcat =3D new (Category);=0A=
+ memset (tempcat, '\0', sizeof (Category));=0A=
+ tempcat->name =3D strdup (name);=0A=
+ if (!sortcat || strcasecmp(sortcat->name, name) > 0)=0A=
+ {=0A=
+ tempcat->next =3D category;=0A=
+ category =3D tempcat;=0A=
+ }=0A=
+ else=0A=
+ {=0A=
+ while (sortcat->next && =0A=
+ strcasecmp(sortcat->next->name, tempcat->name) < 0)=0A=
+ {=0A=
+ tempcat->next =3D sortcat->next;=0A=
+ sortcat->next =3D tempcat;=0A=
+ }=0A=
+ }=0A=
+ ncategories++;=0A=
+ }=0A=
+ return tempcat;=0A=
+}=0A=
+=0A=
+void=0A=
+add_category (Package *package, Category *cat)=0A=
+{=0A=
+ /* add a new record for the package list */=0A=
+ /* TODO: alpabetical inserts ? */=0A=
+ Category *tempcat;=0A=
+ CategoryPackage *templink;=0A=
+ tempcat =3D new (Category);=0A=
+ memset (tempcat, '\0', sizeof (Category));=0A=
+ tempcat->next =3D package->category;=0A=
+ tempcat->name =3D cat->name;=0A=
+ package->category =3D tempcat;=0A=
+=0A=
+ templink =3D new (CategoryPackage);=0A=
+ templink->next =3D cat->packages;=0A=
+ templink->pkg =3D package->name;=0A=
+ cat->packages =3D templink;=0A=
+ =0A=
+ /* hack to ensure we allocate enough space */=0A=
+ ncategories++; =0A=
}=0A=
Index: res.rc=0A=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A=
RCS file: /cvs/src/src/winsup/cinstall/res.rc,v=0A=
retrieving revision 2.20=0A=
diff -u -p -r2.20 res.rc=0A=
--- res.rc 2001/05/28 08:31:02 2.20=0A=
+++ res.rc 2001/06/30 00:48:23=0A=
@@ -240,7 +240,8 @@ BEGIN=0A=
CONTROL "SPIN",IDC_STATIC,"Static",SS_BITMAP,55,170,15,13=0A=
LTEXT "=3D click to choose action, (p) =3D previous =
version, (x) =3D experimental",=0A=
IDC_STATIC,65,170,220,8=0A=
- PUSHBUTTON "Full/Part",IDC_CHOOSE_FULLPART,283,5,35,10=0A=
+ PUSHBUTTON "View",IDC_CHOOSE_VIEW,278,5,20,10=0A=
+ LTEXT "", IDC_CHOOSE_VIEWCAPTION, 300,5,30,10=0A=
CONTROL "E&xp",IDC_CHOOSE_EXP,"Button",BS_AUTORADIOBUTTON | =0A=
WS_GROUP,248,5,25,10=0A=
CONTROL =
"&Curr",IDC_CHOOSE_CURR,"Button",BS_AUTORADIOBUTTON,222,=0A=
Index: resource.h=0A=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A=
RCS file: /cvs/src/src/winsup/cinstall/resource.h,v=0A=
retrieving revision 2.11=0A=
diff -u -p -r2.11 resource.h=0A=
--- resource.h 2001/05/28 08:31:02 2.11=0A=
+++ resource.h 2001/06/30 00:48:23=0A=
@@ -84,7 +84,7 @@=0A=
#define IDC_NET_PASSWD 1031=0A=
#define IDC_VERSION 1033=0A=
#define IDC_LISTVIEW_POS 1034=0A=
-#define IDC_CHOOSE_FULLPART 1035=0A=
+#define IDC_CHOOSE_VIEW 1035=0A=
#define IDC_CHOOSE_EXP 1036=0A=
#define IDC_CHOOSE_CURR 1037=0A=
#define IDC_CHOOSE_PREV 1038=0A=
@@ -100,6 +100,7 @@=0A=
#define IDC_DLS_PPROGRESS_TEXT 1048=0A=
#define IDC_DLS_IPROGRESS_TEXT 1049=0A=
#define IDC_CHOOSE_INST_TEXT 1050=0A=
+#define IDC_CHOOSE_VIEWCAPTION 1051=0A=
#define IDC_STATIC -1=0A=
=0A=
// Next default values for new objects=0A=
@@ -110,7 +111,7 @@=0A=
#define _APS_3D_CONTROLS 1=0A=
#define _APS_NEXT_RESOURCE_VALUE 127=0A=
#define _APS_NEXT_COMMAND_VALUE 40003=0A=
-#define _APS_NEXT_CONTROL_VALUE 1051=0A=
+#define _APS_NEXT_CONTROL_VALUE 1052=0A=
#define _APS_NEXT_SYMED_VALUE 101=0A=
#endif=0A=
#endif=0A=
------=_NextPart_000_031D_01C10152.A6F4ED60--
- Raw text -