new developer release
[xboard.git] / xhistory.c
1 /*
2  * xhistory.c -- Move list window, part of X front end for XBoard
3  *
4  * Copyright 2000,2009 Free Software Foundation, Inc.
5  * ------------------------------------------------------------------------
6  *
7  * GNU XBoard is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU XBoard is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see http://www.gnu.org/licenses/.  *
19  *
20  *------------------------------------------------------------------------
21  ** See the file ChangeLog for a revision history.  */
22
23 #include "config.h"
24
25 #include <gtk/gtk.h>
26 #include <stdio.h>
27 #include <ctype.h>
28 #include <errno.h>
29 #include <sys/types.h>
30
31 #if STDC_HEADERS
32 # include <stdlib.h>
33 # include <string.h>
34 #else /* not STDC_HEADERS */
35 extern char *getenv();
36 # if HAVE_STRING_H
37 #  include <string.h>
38 # else /* not HAVE_STRING_H */
39 #  include <strings.h>
40 # endif /* not HAVE_STRING_H */
41 #endif /* not STDC_HEADERS */
42
43 #if HAVE_UNISTD_H
44 # include <unistd.h>
45 #endif
46
47 #include "common.h"
48 #include "frontend.h"
49 #include "backend.h"
50 #include "xboard.h"
51 #include "xhistory.h"
52 #include "gettext.h"
53
54 #ifdef ENABLE_NLS
55 # define  _(s) gettext (s)
56 # define N_(s) gettext_noop (s)
57 #else
58 # define  _(s) (s)
59 # define N_(s)  s
60 #endif
61
62 extern GtkWidget               *GUI_History;
63 extern GtkListStore            *LIST_MoveHistory;
64
65 String dots=" ... ";
66 Position gameHistoryX, gameHistoryY;
67 Dimension gameHistoryW, gameHistoryH;
68
69 void
70 HistoryPopDown(object, user_data)
71      GtkObject *object;
72      gpointer user_data;
73 {
74   /* hides the history window */
75
76   gtk_widget_hide (GUI_History);
77   return;
78 }
79
80 void HistoryMoveProc(Widget w, XtPointer closure, XtPointer call_data)
81 {
82     int to;
83     /*
84     XawListReturnStruct *R = (XawListReturnStruct *) call_data;
85     if (w == hist->mvn || w == hist->mvw) {
86       to=2*R->list_index-1;
87       ToNrEvent(to);
88     }
89     else if (w == hist->mvb) {
90       to=2*R->list_index;
91       ToNrEvent(to);
92     }
93     */
94 }
95
96
97 void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current)
98 {
99   int i,b,m;
100   char movewhite[2*MOVE_LEN],moveblack[2*MOVE_LEN],move[2*MOVE_LEN];
101   GtkTreeIter iter;
102
103   /* TODO need to add highlights for current move */
104   /* TODO need to add navigation by keyboard or mouse (double click on move) */
105
106   /* first clear everything, do we need this? */
107   gtk_list_store_clear(LIST_MoveHistory);
108
109   /* copy move list into history window */
110
111   /* go through all moves */
112   for(i=0;i<last;i++) 
113     {
114       /* test if there is a move */
115       if(movelist[i][0]) 
116         {
117           /* only copy everything before a  ' ' */
118           char* p = strchr(movelist[i], ' ');
119           if (p) 
120             {
121               strncpy(move, movelist[i], p-movelist[i]);
122               move[p-movelist[i]] = NULLCHAR;
123             } 
124           else 
125             {
126               strcpy(move,movelist[i]);
127             }
128         } 
129       else
130         strcpy(move,dots);
131       
132       if((i%2)==0) 
133         {
134           /* white move */
135           strcpy(movewhite,move);
136         }
137       else
138         {
139           /* black move */
140           strcpy(moveblack,move);
141
142           /* save move */
143           gtk_list_store_append (LIST_MoveHistory, &iter);
144           gtk_list_store_set (LIST_MoveHistory, &iter,
145                               0, i,
146                               1, movewhite,
147                               2, moveblack,
148                               -1);
149
150           strcpy(movewhite,"");
151           strcpy(moveblack,"");
152         };
153     }
154
155   /* check if there is a white move left */
156   if(movewhite[0])
157     {
158       i++;
159       strcpy(moveblack,"");
160       /* save move */
161       gtk_list_store_append (LIST_MoveHistory, &iter);
162       gtk_list_store_set (LIST_MoveHistory, &iter,
163                           0, i,
164                           1, movewhite,
165                           2, moveblack,
166                           -1);
167     };
168
169   //TODO
170   //  EvalGraphSet( first, last, current, pvInfoList ); // piggy-backed
171   
172   return;
173 }
174
175 void HistoryCreate()
176 {
177     String trstr=
178              "<Key>Up: BackwardProc() \n \
179              <Key>Left: BackwardProc() \n \
180              <Key>Down: ForwardProc() \n \
181              <Key>Right: ForwardProc() \n";
182
183     return;
184 //    if(wpMoveHistory.width > 0) {
185 //      gameHistoryW = wpMoveHistory.width;
186 //      gameHistoryH = wpMoveHistory.height;
187 //      gameHistoryX = wpMoveHistory.x;
188 //      gameHistoryY = wpMoveHistory.y;
189 //    }
190 //
191 //  // [HGM] restore old position
192 //  if(gameHistoryW > 0) {
193 //  j = 0;
194 //    XtSetArg(args[j], XtNx, gameHistoryX);  j++;
195 //  XtSetArg(args[j], XtNy, gameHistoryY);  j++;
196 //    XtSetArg(args[j], XtNwidth, gameHistoryW);  j++;
197 //    XtSetArg(args[j], XtNheight, gameHistoryH);  j++;
198 //  XtSetValues(hist->sh, args, j);
199 //  }
200 }
201
202 void
203 HistoryPopUp()
204 {
205   /* show history window */
206
207   gtk_widget_show (GUI_History);
208   return;
209 }
210
211
212 void
213 HistoryShowProc(object, user_data)
214      GtkObject *object;
215      gpointer user_data;
216 {
217   HistoryCreate();
218   HistoryPopUp();
219   //TODO:  ToNrEvent(currentMove);
220
221   return;
222 }
223
224 Boolean
225 MoveHistoryIsUp()
226 {
227   /* return status of history window */
228   
229   return gtk_widget_get_visible (GUI_History);
230 }