rewrite of atomsGui
[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.1-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     // Display selected module information
23     // =========================================================================
24     if or(UItag == ["LeftListbox";"HomeListbox"]) then
25         // Get the selected module
26         selected = getSelected(UItag);
27         if selected(1) == "module" then
28             // Save the module name
29             set("DescFrame", "userdata", selected(2));
30             // Update the description frame
31             updateDescFrame();
32             // Show the description frame
33             showDesc();
34         elseif selected(1)=="category" then
35             LeftElements = atomsGetLeftListboxElts(selected(2));
36             set("LeftListbox", "String", LeftElements("items_str"));
37             set("LeftListbox", "UserData", LeftElements("items_mat"));
38             set("LeftFrame", "UserData", selected(2));
39
40             // Figure name
41             set("atomsFigure", "figure_name", LeftElements("title")+" - ATOMS");
42         end
43     end
44
45     // A button has been pressed
46     // =========================================================================
47     if or(UItag == ["installButton";"removeButton";"updateButton"]) then
48         // Get the module name
49         module = get("DescFrame","userdata");
50         // Disable callbacks
51         disableAtomsGui();
52     end
53
54     // Install selected module
55     // =========================================================================
56     if UItag == "installButton" then
57         updateStatusBar("info",_("Installing")+" &hellip;");
58         if execstr("atomsInstall("""+module+""")","errcatch")<>0 then
59             updateStatusBar();
60             messagebox(_("Installation failed!"),_("ATOMS error"),"error");
61         else
62             updateDescFrame();
63             updateStatusBar("success",_("Installation done! Please restart Scilab to take changes into account."));
64         end
65
66     // Remove selected module
67     // =========================================================================
68     elseif UItag == "removeButton" then // Remove selected module
69         updateStatusBar("info",_("Removing")+" &hellip;");
70         if execstr("atomsRemove("""+module+""")", "errcatch")<>0 then
71             updateStatusBar();
72             messagebox(_("Remove failed!"),_("ATOMS error"),"error");
73         else
74             updateDescFrame();
75             updateStatusBar("success",_("Remove done! Please restart Scilab to take changes into account. "));
76         end
77
78     // Update selected module
79     // =========================================================================
80     elseif UItag == "updateButton" then // Update selected module
81         updateStatusBar("info",_("Updating")+" &hellip;");
82         if execstr("atomsUpdate("""+module+""")","errcatch")<>0 then
83             updateStatusBar();
84             messagebox(_("Update failed!"),_("ATOMS error"),"error");
85         else
86             updateDescFrame();
87             updateStatusBar("success",_("Update done! Please restart Scilab to take changes into account."));
88         end
89     end
90
91     // End of the button action
92     // =========================================================================
93     if or(UItag == ["installButton";"removeButton";"updateButton"]) then
94         // Left listbox:
95         //  - Enable it
96         //  - Reload it
97         enableLeftListbox();
98         reloadLeftListbox();
99     end
100
101     // Menu
102     // =========================================================================
103
104     // File:Home
105     if UItag == "homeMenu" then
106         showHome();
107
108     // File:Close
109     elseif UItag == "closeMenu" then
110         delete(findobj("Tag", "atomsFigure"));
111
112     // ?:Help
113     elseif UItag == "helpMenu" then
114         help("atoms")
115     end
116 endfunction
117
118
119 // =============================================================================
120 // getSelected()
121 //  + Return the type: category / module
122 //  + Return the name selected from a listbox.
123 // =============================================================================
124
125 function selected = getSelected(listbox)
126     index    = get(listbox, "Value");
127     UserData = get(listbox, "UserData");
128     selected = UserData(index,:);
129 endfunction
130
131
132 // =============================================================================
133 // disableAtomsGui()
134 //  + Disable all callback
135 // =============================================================================
136
137 function disableAtomsGui()
138     set("installButton", "Enable", "off");
139     set("updateButton", "Enable", "off");
140     set("removeButton", "Enable", "off");
141     disableLeftListbox()
142 endfunction
143
144 function disableLeftListbox()
145     set("LeftListbox", "Callback", "");
146     set("LeftListbox", "ForegroundColor", [0.5 0.5 0.5]);
147 endfunction
148
149 function enableLeftListbox()
150     set("LeftListbox", "Callback", "cbAtomsGui");
151     set("LeftListbox", "ForegroundColor", [0 0 0]);
152 endfunction
153
154 // =============================================================================
155 // reloadLeftListbox()
156 // =============================================================================
157
158 function reloadLeftListbox()
159     category = get("LeftFrame", "UserData");
160     LeftListbox = get("LeftListbox");
161     LeftElements            = atomsGetLeftListboxElts(category);
162     set("LeftListbox", "String", LeftElements("items_str"));
163     set("LeftListbox", "UserData", LeftElements("items_mat"));
164 endfunction
165
166 // =============================================================================
167 // updateDescFrame()
168 //  + Update the description frame with the selected module
169 //  + does not change the description frame visibility
170 // =============================================================================
171
172 function updateDescFrame()
173     // Operating system detection + Architecture detection
174     // =========================================================================
175     [OSNAME,ARCH,LINUX,MACOSX,SOLARIS,BSD] = atomsGetPlatform();
176
177     // Get the modules list and the selected module
178     // =========================================================================
179
180     allModules     = get("atomsFigure", "userdata");
181     thisModuleName = get("DescFrame" ,"userdata");
182
183     // Reset the message frame
184     // =========================================================================
185     set("msgText", "String", "");
186
187     // Get the module details
188     // =========================================================================
189
190     modulesNames       = getfield(1, allModules);
191     modulesNames (1:2) = [];
192     thisModuleStruct   = allModules(thisModuleName);
193
194     MRVersionAvailable = atomsGetMRVersion(thisModuleName);
195     MRVersionInstalled = "";
196
197     if atomsIsInstalled(thisModuleName) then
198         MRVersionInstalled = atomsVersionSort(atomsGetInstalledVers(thisModuleName),"DESC");
199         MRVersionInstalled = MRVersionInstalled(1);
200         thisModuleDetails  = thisModuleStruct(MRVersionInstalled);
201     else
202         thisModuleDetails  = thisModuleStruct(MRVersionAvailable);
203     end
204
205     // Download Size
206     // =========================================================================
207
208     sizeHTML = "";
209
210     if isfield(thisModuleDetails,OSNAME+ARCH+"Size") then
211         sizeHTML = txt2title(_("Download size")) ..
212         + "<div>" ..
213         + atomsSize2human(thisModuleDetails(OSNAME+ARCH+"Size")) ..
214         + "</div>";
215     end
216
217     // Authors
218     // =========================================================================
219
220     authorMat  = thisModuleDetails.Author;
221     authorHTML = "";
222
223     for i=1:size(authorMat,"*")
224         authorHTML = authorHTML + authorMat(i)+"<br>";
225     end
226
227     authorHTML = txt2title(_("Author(s)")) ..
228     + "<div>" ..
229     + authorHTML
230     + "</div>";
231
232     // URLs (See also)
233     // =========================================================================
234
235     URLs        = [];
236     seeAlsoHTML = "";
237
238     if isfield(thisModuleDetails,"URL") & (thisModuleDetails.URL<>"") then
239         URLs = [ URLs ; thisModuleDetails.URL ];
240     end
241
242     if isfield(thisModuleDetails,"WebSite") & (thisModuleDetails.WebSite<>"") then
243         URLs = [ URLs ; thisModuleDetails.WebSite ];
244     end
245
246     if ~isempty(URLs) then
247
248         for i=1:size(URLs,"*")
249             seeAlsoHTML = seeAlsoHTML + "&nbsp;&bull;&nbsp;"+URLs(i)+"<br>";
250         end
251
252         seeAlsoHTML = txt2title(_("See also"))..
253         + "<div>" ..
254         + seeAlsoHTML ..
255         + "</div>";
256     end
257
258     // Release date
259     // =========================================================================
260
261     dateHTML = "";
262
263     if isfield(thisModuleDetails,"Date") ..
264         & ~isempty(regexp(thisModuleDetails.Date,"/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]\s/")) then
265
266         dateHTML = txt2title(_("Release date")) ..
267         + "<div>" ..
268         + part(thisModuleDetails.Date,1:10) ..
269         + "</div>";
270     end
271
272     // Build and Set the HTML code
273     // =========================================================================
274
275
276     htmlcode = "<html>" + ..
277     "<body>" + ..
278     txt2title(_("Version")) + ..
279     "<div>" + thisModuleDetails.Version  + "</div>" + ..
280     authorHTML + ..
281     txt2title(_("Description")) + ..
282     "<div>" + ..
283     strcat(thisModuleDetails.Description,"<br>")  + ..
284     "</div>" + ..
285     seeAlsoHTML + ..
286     dateHTML + ..
287     sizeHTML + ..
288     "</body>" + ..
289     "</html>";
290
291     // Process URLs and Emails
292     htmlcode = processHTMLLinks(htmlcode);
293
294     // Update the main description
295     set("Desc", "String", htmlcode);
296
297     // Description title management
298     // =========================================================================
299
300     descFrameHTML = thisModuleDetails.Title;
301
302     border = get("DescFrame", "border");
303     border.title = descFrameHTML;
304     set("DescFrame", "border", border);
305
306     // Buttons
307     // =========================================================================
308
309     // Tests for update available
310     // --------------------------
311
312     canUpdate = "off";
313     if atomsIsInstalled(thisModuleName) & atomsVersionCompare(MRVersionInstalled,MRVersionAvailable) == -1 then
314         // Not up-to-date
315         canUpdate = "on";
316         updateStatusBar("warning",sprintf(_("A new version (''%s'') of ''%s'' is available"),MRVersionAvailable,thisModuleDetails.Title));
317     end
318
319     // Can be removed
320     // --------------------------
321     if atomsIsInstalled(thisModuleName) then
322         canRemove = "on";
323     else
324         canRemove = "off";
325     end
326
327     // Can be installed
328     // --------------------------
329     if ~ atomsIsInstalled(thisModuleName) then
330         canInstall = "on";
331     else
332         canInstall = "off";
333     end
334
335     // Update the buttons
336     // --------------------------
337     set("installButton", "Enable", canInstall);
338     set("updateButton", "Enable", canUpdate );
339     set("removeButton", "Enable", canRemove );
340
341 endfunction
342
343 // =============================================================================
344 // atomsSize2human()
345 // =============================================================================
346 function human_str = atomsSize2human(size_str)
347     size_int = strtod(size_str);
348     if size_int < 1024 then
349         human_str = string(size_int) + " " + _("Bytes");
350     elseif size_int < 1024*1024 then
351         human_str = string(round(size_int/1024)) + " " + _("KB");
352     else
353         human_str = string( round((size_int*10)/(1024*1024)) / 10 ) + " " + _("MB");
354     end
355 endfunction
356
357 // =============================================================================
358 // show()
359 // =============================================================================
360 function show(tag)
361     set(tag, "Visible", "On");
362 endfunction
363
364 // =============================================================================
365 // hide()
366 // =============================================================================
367
368 function hide(tag)
369     set(tag, "Visible", "Off");
370 endfunction
371
372 // =============================================================================
373 // showHome()
374 // + Hide the detailed description of a module
375 // + Show the home page
376 // =============================================================================
377
378 function showHome()
379
380     // Reset the message frame
381     set("msgText", "String", "");
382
383     //active home layer
384     set("LayerFrame", "String", "HomeFrame");
385
386     // update the left listbox
387     LeftElements = atomsGetLeftListboxElts("filter:main");
388     set("LeftListbox", "String", LeftElements("items_str"));
389     set("LeftListbox", "UserData", LeftElements("items_mat"));
390 endfunction
391
392 // =============================================================================
393 // showDesc()
394 // + Hide the home page
395 // + Show the detailed description of a module
396 // =============================================================================
397
398 function showDesc()
399
400     //active description layer
401     set("LayerFrame", "String", "DescFrame");
402 endfunction
403
404
405 // =============================================================================
406 // updateStatusBar
407 // + Update the string in the msg Frame
408 // =============================================================================
409
410 function updateStatusBar(status,msg)
411
412     rhs = argn(2);
413
414     if rhs==0 then
415         set("msgText", "String", "");
416         return
417     end
418
419     select status
420     case "warning" then
421         fontcolor = "#ff0000"; // red
422         icon      = "status/software-update-available.png";
423     case "success" then
424         fontcolor = "#009a1b"; // dark green
425         icon      = "emblems/emblem-default.png";
426     case "info" then
427         fontcolor = "#7d7d7d"; // dark green
428         icon      = "status/dialog-information.png";
429     end
430
431     str =       "<html>";
432     str = str + "<table><tr>";
433     str = str + "<td><img src=""file:///"+SCI+"/modules/atoms/images/icons/16x16/"+icon+""" /></td>";
434     str = str + "<td><div style=""color:"+fontcolor+";font-style:italic;"">"+msg+"</div></td>";
435     str = str + "</tr></table>";
436     str = str + "</html>";
437
438     set("msgText", "String", str);
439
440 endfunction
441
442 // =============================================================================
443 // processHTMLLinks
444 // + Find URLs
445 // + Convert them in HTML (hyperlinks)
446 // =============================================================================
447
448 function txtout = processHTMLLinks(txtin)
449
450     regexUrl   = "/((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))\:\/\/)(www|[a-zA-Z0-9])[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]{1,5})*(\/($|[a-zA-Z0-9\.\,\;\?\''\\\+&amp;%\$#\=~_\-\/]+))*/";
451     txtout     = "";
452
453     [mat_start,mat_end,mat_match] = regexp(txtin,regexUrl);
454
455     if ~isempty(mat_match) then
456         mat_end = [ 0 mat_end ];
457         for i=1:size(mat_match,"*")
458             txtout = txtout + part(txtin,[mat_end(i)+1:mat_start(i)-1]) ..
459             + "<a href="""+mat_match(i)+""" target=""_blank"">" ..
460             + mat_match(i) ..
461             + "</a>";
462         end
463         txtout = txtout + part(txtin,mat_end(size(mat_end,"*"))+1:length(txtin));
464     else
465         txtout = txtin;
466     end
467
468 endfunction
469
470 // =============================================================================
471 // txt2title
472 // =============================================================================
473
474 function txtout = txt2title(txtin)
475
476     txtout = "<div style=""font-weight:bold;margin-top:10px;margin-bottom:3px;"">" + ..
477     txtin + ..
478     "</div>";
479
480 endfunction
481