update of localizatio (same error message)
[scilab.git] / scilab / modules / action_binding / src / c / dynamic_menus.c
1 /*--------------------------------------------------------------------------*/
2 /*
3  *      Copyright (C) 2001-2003 Enpc/Jean-Philippe Chancelier
4  *    jpc@cermics.enpc.fr 
5  *    Changed: steer, jpc 2004 
6  */
7 /*--------------------------------------------------------------------------*/
8 #include <string.h>
9 #include "stack-c.h"
10 #include "MALLOC.h"
11 #include "dynamic_menus.h"
12 #include "sciprint.h"
13 #include "sciprint_full.h"
14 #include "localization.h"
15 /*--------------------------------------------------------------------------*/
16 /*
17  *  Command queue functions
18  *  This function is used to store Scilab command in a queue 
19  *  ( the queue is checked in the Scilab Event Loop )
20  *  The queue is filled by the function related to dynamic buttons and menus 
21  *  One can also set a handler to deal with the commands 
22  *  if he wants to bypass the queue 
23  *
24  *  PUBLIC : set_scig_command_handler(Scig_command_handler f)
25  *           void reset_scig_command_handler() 
26  *           int StoreCommand( char *command)
27  *           integer C2F(ismenu)()
28  *           int C2F(getmen)(char * btn_cmd,integer * lb, integer * entry)  
29  */
30 /*--------------------------------------------------------------------------*/
31 typedef int (*Scig_command_handler) __PARAMS((char *));
32 typedef struct commandRec
33 {
34         char              *command;             /* command info one string two integers */
35         int               flag; /* 1 if the command execution cannot be interrupted */
36         struct commandRec *next;
37 } CommandRec, *CommandRecPtr;
38 /*--------------------------------------------------------------------------*/
39 int  scig_command_handler_none (char *command);
40 extern Scig_command_handler set_scig_command_handler __PARAMS((Scig_command_handler f));
41 extern int C2F (getmen) __PARAMS((char *btn_cmd, integer *lb, integer *entry));  
42 extern void  reset_scig_command_handler __PARAMS((void));
43 extern void write_scilab  __PARAMS((char *s));
44 extern int get_is_reading  __PARAMS((void));
45 #ifdef _MSC_VER
46 extern BOOL IsToThePrompt(void);
47 #endif /*_MSC_VER*/
48 /*--------------------------------------------------------------------------*/
49 static CommandRec *commandQueue = NULL;
50 static Scig_command_handler scig_command_handler = scig_command_handler_none;
51 /*--------------------------------------------------------------------------*/
52 /*
53  * changing the default command handler 
54  */
55 /*--------------------------------------------------------------------------*/
56 int  scig_command_handler_none (char *command)
57 {
58         return 0;
59 }
60 /*--------------------------------------------------------------------------*/
61 Scig_command_handler set_scig_command_handler (Scig_command_handler f)
62 {
63   Scig_command_handler old = scig_command_handler;
64   scig_command_handler = f;
65   return old;
66 }
67 /*--------------------------------------------------------------------------*/
68 void reset_scig_command_handler ()
69 {
70   scig_command_handler = scig_command_handler_none;
71 }
72 /*--------------------------------------------------------------------------*/
73 int StoreCommand ( char *command)
74 {
75         return (StoreCommand1 (command, 0));
76 }
77 /*--------------------------------------------------------------------------*/
78 /*
79  * try to execute a command or add it to the end of command queue
80  * flag = 0 : the command is not shown in scilab window
81  * flag = 1 : the command is shown in scilab window (if at prompt) 
82  */
83 /*--------------------------------------------------------------------------*/
84 int StoreCommand1 (char *command,int flag)
85 {
86 #ifdef _MSC_VER
87  //if ( (flag == 1) && ( !IsToThePrompt () ) ) flag=0;
88 #endif
89  switch (flag)
90  {
91  case 1: /* the command is shown in scilab window (if at prompt) */
92                 {
93                         //write_scilab (command);
94                         return (0);
95                 }
96                 break;
97          case 0: 
98          default : /* the command is not shown in Scilab */
99                 {
100                           CommandRec *p, *q, *r;
101
102                           /** first check if we have a special handler set for commands **/
103                           if (scig_command_handler (command) == 1)  return 0;
104
105                           p = (CommandRec *) MALLOC (sizeof (CommandRec));
106                           if (p == (CommandRec *) 0)
107                                 {
108                                         sciprint(_("%s: No more memory.\n"),"send_command");
109                                         return (1);
110                                 }
111                           p->flag = 0;
112                           p->command = (char *) MALLOC ((strlen (command) + 1) * sizeof (char));
113                           if (p->command == (char *) 0)
114                                 {
115                                   FREE(p);
116                                   sciprint(_("%s: No more memory.\n"),"send_command");
117                                   return (1);
118                                 }
119                           strcpy (p->command, command);
120                           p->next = NULL;
121                           if (!commandQueue) commandQueue = p;
122                           else
123                                 {
124                                         q = commandQueue;
125                                         while ((r = q->next))   q = r;
126                                         q->next = p;
127                                 }
128 #ifdef _MSC_VER
129                         //if (IsToThePrompt ()) write_scilab ("\n");
130 #endif
131                         return (0);
132                         
133                 break;
134                 }
135  }
136 }
137 void SetCommandflag(int flag)
138 {
139   CommandRec *p, *r;
140   if (commandQueue != NULL) {
141     p = commandQueue;
142     while ((r = p->next))       p = r;
143     p->flag=flag;
144   }
145 }
146 /*--------------------------------------------------------------------------*/
147 /*
148  * Gets info on the first queue element 
149  * and remove it from the queue 
150  */
151 /*--------------------------------------------------------------------------*/
152 int GetCommand ( char *str)
153 {
154   int flag;
155   flag = 0;     
156   if (commandQueue != NULL)
157     {
158
159       CommandRec *p;
160
161                 
162       p = commandQueue;
163       strcpy (str, p->command);
164       flag=p->flag;
165
166       commandQueue = p->next;
167       FREE (p->command);
168       FREE (p);
169       if (C2F(iop).ddt==-1) {
170         if (flag==0) { sciprint_full("   Unqueuing %s - No option\n",str); }
171         else         { sciprint_full("   Unqueuing %s - seq\n",str); }
172       }
173     }
174   return flag;
175 }
176
177 integer ismenu(void)
178 {
179   /* Do not manage commands while compiling scilab function */
180   if ( (commandQueue == NULL) || (C2F(com).comp[0] != 0)) 
181     return(0) ;
182   else 
183     return(1);
184 }
185 /*--------------------------------------------------------------------------*/
186 /*
187  * menu/button info for Scilab 
188  */
189 /*--------------------------------------------------------------------------*/
190 int C2F(getmen)(char * btn_cmd,integer * lb, integer * entry)
191 {
192   int flag;
193   if (ismenu()==1) 
194     {
195       flag=GetCommand(btn_cmd);
196       *lb=(integer)strlen(btn_cmd);
197       *entry=0;  /* This parameter entry seems to be unused. Probably a very old thing... */
198     }
199   else
200     { 
201       flag=0;
202       *lb =0;
203       *entry=0;  /* This parameter entry seems to be unused. Probably a very old thing... */
204     }
205   return flag;
206 }
207 /*--------------------------------------------------------------------------*/