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