322ff6ae2df8716d59c3b7ee658e2c72e4deebab
[scilab.git] / scilab / modules / atoms / macros / atoms_gui / cbAtomsGui.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
3 // Copyright (C) 2009-2010 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution. The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10
11 // Internal function
12
13 function cbAtomsGui()
14
15     // Load Atoms Internals lib if it's not already loaded
16     if ~ exists("atomsinternalslib") then
17         load("SCI/modules/atoms/macros/atoms_internals/lib");
18     end
19
20     UItag = get(gcbo,"Tag");
21
22     // Get the description frame object
23     DescFrame = findobj("tag","DescFrame");
24
25     // Display selected module informations
26     // =========================================================================
27
28     if or(UItag == ["LeftListbox";"HomeListbox"]) then
29
30         // Get the selected module
31         module = getSelected(UItag);
32
33         // Save the module name
34         set(DescFrame,"userdata",module);
35
36         // Update the description frame
37         updateDescFrame();
38
39         // Show the description frame
40         showDesc();
41     end
42
43     // A button has been pressed
44     // =========================================================================
45
46     if or(UItag == ["installButton";"removeButton";"updateButton"]) then
47         // Get the module name
48         module = get(DescFrame,"userdata");
49
50         // Disable callbacks
51         disableAtomsGui();
52     end
53
54     // Install selected module
55     // =========================================================================
56
57     if UItag == "installButton" then
58         if execstr("atomsInstall("""+module+""")","errcatch")<>0 then
59             messagebox(gettext("Installation failed!"),gettext("Atoms error"),"error");
60         else
61             messagebox(gettext("Installation done! Please restart Scilab to take changes into account."),gettext("Atoms"),"info");
62         end
63
64     // Remove selected module
65     // =========================================================================
66
67     elseif UItag == "removeButton" then // Remove selected module
68         if execstr("atomsRemove("""+module+""")", "errcatch")<>0 then
69             messagebox(gettext("Remove failed!"),gettext("Atoms error"),"error");
70         else
71             messagebox(gettext("Remove done! Please restart Scilab to take changes into account. "),gettext("Atoms"),"info");
72         end
73
74     // Update selected module
75     // =========================================================================
76
77     elseif UItag == "updateButton" then // Update selected module
78         if execstr("atomsUpdate("""+module+""")","errcatch")<>0 then
79             messagebox(gettext("Update failed!"),gettext("Atoms error"),"error");
80         else
81             messagebox(gettext("Update done! Please restart Scilab to take changes into account."),gettext("Atoms"),"info");
82         end
83     end
84
85     // End of the button action
86     // =========================================================================
87
88     if or(UItag == ["installButton";"removeButton";"updateButton"]) then
89         updateDescFrame();
90         enableLeftListbox();
91     end
92
93
94     // Menu
95     // =========================================================================
96
97     // File:Home
98     if UItag == "homeMenu" then
99         showHome();
100
101     // File:Close
102     elseif UItag == "closeMenu" then
103         delete(findobj("Tag", "atomsFigure"));
104
105     // ?:Help
106     elseif UItag == "helpMenu" then
107         help("atoms")
108
109     end
110
111 endfunction
112
113
114 // =============================================================================
115 // getSelected()
116 //  + Return the module name selected from a listbox.
117 //  + Accepted listboxes:
118 //    - LeftListbox
119 //    - HomeListbox
120 // =============================================================================
121
122 function name = getSelected(listbox)
123
124     selected = get(findobj("Tag",listbox),"Value");
125
126     if listbox == "HomeListbox" then
127         modulesNames       = atomsGetInstalled();
128         modulesNames       = modulesNames(:,1);
129     elseif listbox == "LeftListbox" then
130         allModules         = get(findobj("Tag", "atomsFigure"), "userdata");
131         modulesNames       = getfield(1, allModules);
132         modulesNames (1:2) = [];
133     else
134         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"),"getSelected",1,"HomeListbox","LeftListbox"));
135     end
136
137     name = modulesNames(selected);
138
139 endfunction
140
141
142 // =============================================================================
143 // disableAtomsGui()
144 //  + Disable all callback
145 // =============================================================================
146
147
148 function disableAtomsGui()
149
150     set(findobj("tag", "installButton"), "Enable", "off");
151     set(findobj("tag", "updateButton") , "Enable", "off");
152     set(findobj("tag", "removeButton") , "Enable", "off");
153     disableLeftListbox()
154 endfunction
155
156 function disableLeftListbox()
157     set(findobj("tag", "LeftListbox"),"Callback", "");
158     set(findobj("tag", "LeftListbox"),"ForegroundColor",[0.5 0.5 0.5]);
159 endfunction
160
161 function enableLeftListbox()
162     set(findobj("tag", "LeftListbox"),"Callback", "cbAtomsGui");
163     set(findobj("tag", "LeftListbox"),"ForegroundColor",[0 0 0]);
164 endfunction
165
166
167 // =============================================================================
168 // updateDescFrame()
169 //  + Update the description frame with the selected module
170 //  + does not change the description frame visibility
171 // =============================================================================
172
173 function updateDescFrame()
174
175     // Operating system detection + Architecture detection
176     // =========================================================================
177     [OSNAME,ARCH,LINUX,MACOSX,SOLARIS,BSD] = atomsGetPlatform();
178
179     // Get the modules list and the selected module
180     // =========================================================================
181
182     thisFigure     = findobj("tag","atomsFigure");
183
184     Desc           = findobj("tag","Desc");
185     DescFrame      = findobj("tag","DescFrame");
186     DescTitle      = findobj("tag","DescTitle");
187
188     allModules     = get(thisFigure,"userdata");
189     thisModuleName = get(DescFrame ,"userdata");
190
191     // Reset the message frame
192     // =========================================================================
193     set(findobj("tag","msgText"),"String","");
194
195     // Get the module details
196     // =========================================================================
197
198     modulesNames       = getfield(1, allModules);
199     modulesNames (1:2) = [];
200     thisModuleStruct   = allModules(thisModuleName);
201
202     MRVersionAvailable = atomsGetMRVersion(thisModuleName);
203     MRVersionInstalled = "";
204
205     if atomsIsInstalled(thisModuleName) then
206         MRVersionInstalled = atomsVersionSort(atomsGetInstalledVers(thisModuleName),"DESC");
207         MRVersionInstalled = MRVersionInstalled(1);
208         thisModuleDetails  = thisModuleStruct(MRVersionInstalled);
209     else
210         thisModuleDetails  = thisModuleStruct(MRVersionAvailable);
211     end
212
213     // Manage size
214     // =========================================================================
215
216     if isfield(thisModuleDetails,OSNAME+ARCH+"Size") then
217         sizeHTML = ..
218             "<div style=""font-weight:bold;margin-top:10px;margin-bottom:5px;"">" + ..
219             gettext("Download size")                                              + ..
220             "</div>"                                                              + ..
221             "<div>"                                                               + ..
222             atomsSize2human(thisModuleDetails(OSNAME+ARCH+"Size"))                + ..
223             "</div>";
224     else
225         sizeHTML = "";
226     end
227
228     // Manage authors
229     // =========================================================================
230
231     authorMat  = thisModuleDetails.Author;
232
233     authorHTML = "<div style=""font-weight:bold;margin-top:10px;margin-bottom:5px;"">" + ..
234                  gettext("Author(s)") + ..
235                  "</div>" + ..
236                  "<div>";
237
238     for i=1:size(authorMat,"*")
239         authorHTML = authorHTML + authorMat(i)+"<br>";
240     end
241
242     authorHTML = authorHTML + "</div>";
243
244     // Build and Set the HTML code
245     // =========================================================================
246
247
248     htmlcode = "<html>" + ..
249                "<body>" + ..
250                "<div style=""font-weight:bold;margin-top:10px;margin-bottom:5px;"">" + ..
251                gettext("Version") + ..
252                "</div>" + ..
253                "<div>" + thisModuleDetails.Version  + "</div>" + ..
254                authorHTML + ..
255                "<div style=""font-weight:bold;margin-top:10px;margin-bottom:5px;"">" + ..
256                gettext("Description") + ..
257                "</div>" + ..
258                "<div>" + ..
259                strcat(thisModuleDetails.Description,"<br>")  + ..
260                "</div>" + ..
261                sizeHTML + ..
262                "</body>" + ..
263                "</html>";
264
265     // Update the main description
266     set(Desc,"String",htmlcode);
267
268     // Description title management
269     // =========================================================================
270
271     descFrameHTML    = thisModuleDetails.Title;
272
273     descFramePos     = get(DescTitle,"Position");
274     descFramePos(3)  = 300;
275
276     set(DescTitle, "String"   , descFrameHTML );
277     set(DescTitle, "Position" , descFramePos );
278
279     // Buttons
280     // =========================================================================
281
282     // Tests for update available
283     // --------------------------
284
285     canUpdate = "off";
286
287     if atomsIsInstalled(thisModuleName) & atomsVersionCompare(MRVersionInstalled,MRVersionAvailable) == -1 then
288         // Not up-to-date
289         canUpdate = "on";
290         showWarning(sprintf(gettext("A new version (''%s'') of ''%s'' is available"),MRVersionAvailable,thisModuleDetails.Title));
291     end
292
293     // Can be removed
294     // --------------------------
295
296     if atomsIsInstalled(thisModuleName) then
297         canRemove = "on";
298     else
299         canRemove = "off";
300     end
301
302     // Can be installed
303     // --------------------------
304
305     if ~ atomsIsInstalled(thisModuleName) then
306         canInstall = "on";
307     else
308         canInstall = "off";
309     end
310
311     // Update the buttons
312     // --------------------------
313
314     set(findobj("tag", "installButton"), "Enable", canInstall);
315     set(findobj("tag", "updateButton") , "Enable", canUpdate );
316     set(findobj("tag", "removeButton") , "Enable", canRemove );
317
318 endfunction
319
320 // =============================================================================
321 // atomsSize2human()
322 // =============================================================================
323
324 function human_str = atomsSize2human(size_str)
325
326     size_int = strtod(size_str);
327
328     if size_int < 1024 then
329         human_str = string(size_int) + " " + gettext("Bytes");
330
331     elseif size_int < 1024*1024 then
332         human_str = string(round(size_int/1024)) + " " + gettext("KB");
333
334     else
335         human_str = string( round((size_int*10)/(1024*1024)) / 10 ) + " " + gettext("MB");
336
337     end
338
339 endfunction
340
341 // =============================================================================
342 // show()
343 // =============================================================================
344
345 function show(tag)
346     obj = findobj("tag",tag);
347     set(obj,"Visible","On");
348 endfunction
349
350 // =============================================================================
351 // hide()
352 // =============================================================================
353
354 function hide(tag)
355     obj = findobj("tag",tag);
356     set(obj,"Visible","Off");
357 endfunction
358
359 // =============================================================================
360 // showHome()
361 // + Hide the detailed description of a module
362 // + Show the home page
363 // =============================================================================
364
365 function showHome()
366
367     // Reset the message frame
368     set(findobj("tag","msgText"),"String","");
369
370     // Hide the Desc frame
371     hide("DescFrame");
372     hide("DescTitle");
373     hide("Desc");
374     hide("removeButton");
375     hide("installButton");
376     hide("updateButton");
377
378     // Show the Home page
379     show("HomeFrame");
380     show("HomeTitle");
381     show("HomeListbox");
382
383 endfunction
384
385 // =============================================================================
386 // showDesc()
387 // + Hide the home page
388 // + Show the detailed description of a module
389 // =============================================================================
390
391 function showDesc()
392
393     // Show the Home page
394     hide("HomeFrame");
395     hide("HomeTitle");
396     hide("HomeListbox");
397
398     // Hide the Desc frame
399     show("DescFrame");
400     show("DescTitle");
401     show("Desc");
402     show("removeButton");
403     show("installButton");
404     show("updateButton");
405
406 endfunction
407
408
409 // =============================================================================
410 // showWarning
411 // + Update the string in the msg Frame
412 // =============================================================================
413
414 function showWarning(msg)
415
416     str =       "<html>";
417     str = str + "<table><tr>";
418     str = str + "<td><img src=""file:///"+SCI+"/modules/atoms/images/icons/software-update-available.png"" /></td>";
419     str = str + "<td><div style=""color:red;font-style:italic;"">"+msg+"</div></td>";
420     str = str + "</tr></table>";
421     str = str + "</html>";
422
423     msgText = findobj("tag","msgText");
424
425     set(msgText,"String",str);
426
427 endfunction