static Widget filterText;
static char filterString[MSG_SIZ];
-static int listLength, wins, losses, draws;
+static int listLength, wins, losses, draws, page;
char gameListTranslations[] =
"<Btn1Up>(2): LoadSelectedProc(0) \n \
<Key>Home: LoadSelectedProc(-2) \n \
<Key>End: LoadSelectedProc(2) \n \
+ Ctrl<Key>Up: LoadSelectedProc(-3) \n \
+ Ctrl<Key>Down: LoadSelectedProc(3) \n \
<Key>Up: LoadSelectedProc(-1) \n \
<Key>Down: LoadSelectedProc(1) \n \
<Key>Left: LoadSelectedProc(-1) \n \
char filterTranslations[] =
"<Key>Return: SetFilterProc() \n";
+char *dummyList[] = { N_("no games matched your request"), NULL };
+
typedef struct {
Widget shell;
Position x, y;
return shell;
}
+extern int soughtCounts[];
+extern Board soughtBoard;
+
static int
GameListPrepare(int byPos)
{ // [HGM] filter: put in separate routine, to make callable from call-back
int nstrings;
ListGame *lg;
char **st, *line;
+ TimeMark t, t2;
+ GetTimeMark(&t);
if(st = glc->strings) while(*st) free(*st++);
nstrings = ((ListGame *) gameList.tailPred)->number;
glc->strings = (char **) malloc((nstrings + 1) * sizeof(char *));
st = glc->strings;
lg = (ListGame *) gameList.head;
listLength = wins = losses = draws = 0;
+ if(byPos) InitSearch();
while (nstrings--) {
int pos = -1;
line = GameListLine(lg->number, &lg->gameInfo);
if((filterString[0] == NULLCHAR || SearchPattern( line, filterString )) && (!byPos || (pos=GameContainsPosition(glc->fp, lg)) >= 0) ) {
- if(listLength < 1500) *st++ = line; // [HGM] filter: make adding line conditional. *** X listboxes have severe size limit ***
+ *st++ = line; // [HGM] filter: make adding line conditional.
listLength++;
if( lg->gameInfo.result == WhiteWins ) wins++; else
if( lg->gameInfo.result == BlackWins ) losses++; else
lg->position = pos;
lg = (ListGame *) lg->node.succ;
}
+GetTimeMark(&t2);printf("GameListPrepare %ld msec\n", SubtractTimeMarks(&t2,&t));
DisplayTitle("XBoard");
*st = NULL;
return listLength;
}
+static char *list[1003];
+int listEnd;
+
static void
-GameListReplace()
+GameListReplace(int page)
{
// filter: put in separate routine, to make callable from call-back
Widget listwidg;
Arg arg;
- char buf[MSG_SIZ],*p;
+ char buf[MSG_SIZ], *p, **st=list;
+ int i;
+
+ if(page) *st++ = _("previous page"); else if(listLength > 1000) *st++ = "";
+ for(i=0; i<1000; i++) if( !(*st++ = glc->strings[page+i]) ) { st--; break; }
+ listEnd = st - list;
+ if(page + 1000 <= listLength) *st++ = _("next page");
+ *st = NULL;
listwidg = XtNameToWidget(glc->shell, "*form.viewport.list");
- XtSetArg(arg, XtNlist, glc->strings);
- XawListChange(listwidg, glc->strings, 0, 0, True);
+ XtSetArg(arg, XtNlist, listLength ? list : dummyList); // empty list displays message
+ XawListChange(listwidg, list, 0, 0, True);
XtSetValues(listwidg, &arg, 1);
XawListHighlight(listwidg, 0);
- snprintf(buf, MSG_SIZ, "%s- %d/%d games (%d-%d-%d)", glc->filename, listLength, ((ListGame *) gameList.tailPred)->number, wins, losses, draws);
+ snprintf(buf, MSG_SIZ, _("%s - %d/%d games (%d-%d-%d)"), glc->filename, listLength, ((ListGame *) gameList.tailPred)->number, wins, losses, draws);
XtSetArg(arg, XtNtitle, buf);
XtSetValues(glc->shell, &arg, 1);
}
}
} else if (strcmp(name, _("next")) == 0) {
index = rs->list_index + 1;
- if (index >= listLength) {
+ if (index >= listLength || !list[index]) {
DisplayError(_("Can't go forward any further"), 0);
return;
}
XtGetValues(filterText, args, j);
safeStrCpy(filterString, text, sizeof(filterString)/sizeof(filterString[0]));
XawListHighlight(listwidg, 0);
- if(GameListPrepare(strcmp(name, _("find position")) == 0)) GameListReplace(); // crashes on empty list...
+ GameListPrepare(strcmp(name, _("find position")) == 0); GameListReplace(0);
return;
}
#if 1
- index = atoi(glc->strings[index])-1; // [HGM] filter: read true index from sequence nr of line
+ index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line
if (cmailMsgLoaded) {
CmailLoadGame(glc->fp, index + 1, glc->filename, True);
} else {
if (glc == NULL) {
glc = (GameListClosure *) calloc(1, sizeof(GameListClosure));
glc->x = glc->y = -1;
+ glc->filename = NULL;
+ glc->shell = NULL;
}
GameListPrepare(False); // [HGM] filter: code put in separate routine
if (glc->filename != NULL) free(glc->filename);
glc->filename = StrSave(filename);
-
if (glc->shell == NULL) {
glc->shell = GameListCreate(filename, GameListCallback, glc);
} else {
// XtSetArg(args[j], XtNtitle, (XtArgVal) filename); j++;
XtSetValues(glc->shell, args, j);
}
- GameListReplace(); // [HGM] filter: code put in separate routine, and also called to set title
+ page = 0;
+ GameListReplace(0); // [HGM] filter: code put in separate routine, and also called to set title
XtPopup(glc->shell, XtGrabNone);
glc->up = True;
rs = XawListShowCurrent(listwidg);
index = rs->list_index;
if (index < 0) return;
+ if(page && index == 0) {
+ page -= 1000;
+ if(page < 0) page = 0; // safety
+ GameListReplace(page);
+ return;
+ }
+ if(index == 1001) {
+ page += 1000;
+ GameListReplace(page);
+ return;
+ }
+
if(direction != 0) {
+ int doLoad = abs(direction) > 2;
+ if(doLoad) direction /= 3;
index += direction;
if(direction == -2) index = 0;
- if(direction == 2) index = listLength-1;
- if(index < 0 || index >= listLength) return;
+ if(direction == 2) index = listEnd-1;
+ if(index < 0 || index >= listEnd) return;
XawListHighlight(listwidg, index);
- return;
+ if(!doLoad) return;
}
- index = atoi(glc->strings[index])-1; // [HGM] filter: read true index from sequence nr of line
+ index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line
if (cmailMsgLoaded) {
CmailLoadGame(glc->fp, index + 1, glc->filename, True);
} else {
LoadGame(glc->fp, index + 1, glc->filename, True);
+ XSync(xDisplay, False);
+ XSetInputFocus(xDisplay, XtWindow(boardWidget), RevertToPointerRoot, CurrentTime);
}
}
XtSetArg(args[j], XtNstring, &name); j++;
XtGetValues(filterText, args, j);
safeStrCpy(filterString, name, sizeof(filterString)/sizeof(filterString[0]));
- if(GameListPrepare(False)) GameListReplace(); // crashes on empty list...
+ GameListPrepare(False); GameListReplace(0);
list = XtNameToWidget(glc->shell, "*form.viewport.list");
XawListHighlight(list, 0);
j = 0;
int i=0; char **st;
if (glc == NULL || !glc->up) return;
listwidg = XtNameToWidget(glc->shell, "*form.viewport.list");
- st = glc->strings;
+ st = list;
while(*st && atoi(*st)<index) st++,i++;
XawListHighlight(listwidg, i);
}
int nItem;
if( !glc || ((ListGame *) gameList.tailPred)->number <= 0 ) {
- DisplayError("Game list not loaded or empty", 0);
+ DisplayError(_("Game list not loaded or empty"), 0);
return False;
}
XtSetArg(args[j], XtNresizable, True); j++;
XtSetArg(args[j], XtNallowShellResize, True); j++;
shell = gameListOptShell =
- XtCreatePopupShell("Game-list options", transientShellWidgetClass,
+ XtCreatePopupShell(_("Game-list options"), transientShellWidgetClass,
shellWidget, args, j);
layout =
XtCreateManagedWidget(layoutName, formWidgetClass, shell,