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