bug 6977 fixed: ATOMS GUI: In the presentation frame, URLs and emails were not hyperl...
[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     // Process URLs and Emails
266     htmlcode = processHTMLLinks(htmlcode);
267
268     // Update the main description
269     set(Desc,"String",htmlcode);
270
271     // Description title management
272     // =========================================================================
273
274     descFrameHTML    = thisModuleDetails.Title;
275
276     descFramePos     = get(DescTitle,"Position");
277     descFramePos(3)  = 300;
278
279     set(DescTitle, "String"   , descFrameHTML );
280     set(DescTitle, "Position" , descFramePos );
281
282     // Buttons
283     // =========================================================================
284
285     // Tests for update available
286     // --------------------------
287
288     canUpdate = "off";
289
290     if atomsIsInstalled(thisModuleName) & atomsVersionCompare(MRVersionInstalled,MRVersionAvailable) == -1 then
291         // Not up-to-date
292         canUpdate = "on";
293         showWarning(sprintf(gettext("A new version (''%s'') of ''%s'' is available"),MRVersionAvailable,thisModuleDetails.Title));
294     end
295
296     // Can be removed
297     // --------------------------
298
299     if atomsIsInstalled(thisModuleName) then
300         canRemove = "on";
301     else
302         canRemove = "off";
303     end
304
305     // Can be installed
306     // --------------------------
307
308     if ~ atomsIsInstalled(thisModuleName) then
309         canInstall = "on";
310     else
311         canInstall = "off";
312     end
313
314     // Update the buttons
315     // --------------------------
316
317     set(findobj("tag", "installButton"), "Enable", canInstall);
318     set(findobj("tag", "updateButton") , "Enable", canUpdate );
319     set(findobj("tag", "removeButton") , "Enable", canRemove );
320
321 endfunction
322
323 // =============================================================================
324 // atomsSize2human()
325 // =============================================================================
326
327 function human_str = atomsSize2human(size_str)
328
329     size_int = strtod(size_str);
330
331     if size_int < 1024 then
332         human_str = string(size_int) + " " + gettext("Bytes");
333
334     elseif size_int < 1024*1024 then
335         human_str = string(round(size_int/1024)) + " " + gettext("KB");
336
337     else
338         human_str = string( round((size_int*10)/(1024*1024)) / 10 ) + " " + gettext("MB");
339
340     end
341
342 endfunction
343
344 // =============================================================================
345 // show()
346 // =============================================================================
347
348 function show(tag)
349     obj = findobj("tag",tag);
350     set(obj,"Visible","On");
351 endfunction
352
353 // =============================================================================
354 // hide()
355 // =============================================================================
356
357 function hide(tag)
358     obj = findobj("tag",tag);
359     set(obj,"Visible","Off");
360 endfunction
361
362 // =============================================================================
363 // showHome()
364 // + Hide the detailed description of a module
365 // + Show the home page
366 // =============================================================================
367
368 function showHome()
369
370     // Reset the message frame
371     set(findobj("tag","msgText"),"String","");
372
373     // Hide the Desc frame
374     hide("DescFrame");
375     hide("DescTitle");
376     hide("Desc");
377     hide("removeButton");
378     hide("installButton");
379     hide("updateButton");
380
381     // Show the Home page
382     show("HomeFrame");
383     show("HomeTitle");
384     show("HomeListbox");
385
386 endfunction
387
388 // =============================================================================
389 // showDesc()
390 // + Hide the home page
391 // + Show the detailed description of a module
392 // =============================================================================
393
394 function showDesc()
395
396     // Show the Home page
397     hide("HomeFrame");
398     hide("HomeTitle");
399     hide("HomeListbox");
400
401     // Hide the Desc frame
402     show("DescFrame");
403     show("DescTitle");
404     show("Desc");
405     show("removeButton");
406     show("installButton");
407     show("updateButton");
408
409 endfunction
410
411
412 // =============================================================================
413 // showWarning
414 // + Update the string in the msg Frame
415 // =============================================================================
416
417 function showWarning(msg)
418
419     str =       "<html>";
420     str = str + "<table><tr>";
421     str = str + "<td><img src=""file:///"+SCI+"/modules/atoms/images/icons/software-update-available.png"" /></td>";
422     str = str + "<td><div style=""color:red;font-style:italic;"">"+msg+"</div></td>";
423     str = str + "</tr></table>";
424     str = str + "</html>";
425
426     msgText = findobj("tag","msgText");
427
428     set(msgText,"String",str);
429
430 endfunction
431
432 // =============================================================================
433 // processHTMLLinks
434 // + Find URLs and emails
435 // + Convert them in HTML
436 // =============================================================================
437
438 function txtout = processHTMLLinks(txtin)
439
440     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;%\$#\=~_\-\/]+))*/";
441     regexEmail = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/";
442     txtout     = "";
443
444     // Process URLs
445
446     [mat_start,mat_end,mat_match] = regexp(txtin,regexUrl);
447
448     if ~isempty(mat_match) then
449         mat_end = [ 0 mat_end ];
450         for i=1:size(mat_match,"*")
451             txtout = txtout + part(txtin,[mat_end(i)+1:mat_start(i)-1]) ..
452                             + "<a href="""+mat_match(i)+""" target=""_blank"">" ..
453                             + mat_match(i) ..
454                             + "</a>";
455         end
456         txtout = txtout + part(txtin,mat_end(size(mat_end,"*"))+1:length(txtin));
457         txtin  = txtout;
458         txtout = "";
459     end
460
461     // Process Emails
462
463     [mat_start,mat_end,mat_match] = regexp(txtin,regexEmail);
464
465     if ~isempty(mat_match) then
466         mat_end = [ 0 mat_end ];
467         for i=1:size(mat_match,"*")
468             txtout = txtout + part(txtin,[mat_end(i)+1:mat_start(i)-1]) ..
469                             + "<a href=""mailto:"+mat_match(i)+""" target=""_blank"">" ..
470                             + mat_match(i) ..
471                             + "</a>";
472         end
473         txtout = txtout + part(txtin,mat_end(size(mat_end,"*"))+1:length(txtin));
474     else
475         txtout = txtin;
476     end
477
478 endfunction