source: lliurex-java-panel/trunk/fuentes/install-files/usr/share/lliurex-java-panel/lliurex-java-panel.py @ 2071

Last change on this file since 2071 was 2071, checked in by jrpelegrina, 3 years ago

Update alternatives when new java is installed

  • Property svn:executable set to *
File size: 30.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import gi
5gi.require_version('Gtk', '3.0')
6gi.require_version('PangoCairo', '1.0')
7
8import cairo
9import os
10import threading
11import ConfigParser
12import platform
13import subprocess
14import sys
15from math import pi
16
17from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
18
19import signal
20signal.signal(signal.SIGINT, signal.SIG_DFL)
21
22
23import gettext
24gettext.textdomain('lliurex-java-panel')
25_ = gettext.gettext
26
27
28BASE_DIR="/usr/share/lliurex-java-panel/"
29RSRC_DIR=BASE_DIR+"rsrc/"
30SHADOW_BANNER=RSRC_DIR+"shadow.png"
31UNKNOWN_BANNER=RSRC_DIR+"unknown.png"
32BANNERS_PATH=BASE_DIR+"banners/"
33JAVAS_CONFIG_PATH=BASE_DIR+"supported-javas/"
34
35CURRENT_PLATFORM=platform.machine()
36
37class GridButton:
38       
39        def __init__(self,info):
40               
41                self.info=info
42                self.info["installed"]=False
43                self.info["shadow_alpha"]=0.1
44                self.info["animation_active"]=False
45                self.info["shadow_start"]=0
46                self.info["available"]=True
47               
48                if os.path.exists(BANNERS_PATH+self.info["pkg"]+".png"):
49                        self.info["image"]=BANNERS_PATH+self.info["pkg"]+".png"
50                else:
51                        self.info["image"]=UNKNOWN_BANNER
52               
53        #def init
54       
55       
56#class GridButton
57
58
59class ConfButton:
60       
61        def __init__(self,info):
62               
63                self.txt=info["txt"]
64                self.icon=info["icon"]
65                self.name=info["name"]
66                self.da=None
67                if "active" not in info:
68                        self.active=False
69                else:
70                        self.active=info["active"]
71               
72        #def
73
74#class ConfButton
75       
76       
77class Alternative(Gtk.RadioButton):
78
79        def __init__(self,label,command):
80               
81                Gtk.RadioButton.__init__(self, label)
82                self.command=command
83                #self.connect("toggled",self.alternative_toggled)
84               
85        def alternative_toggled(self,widget):
86               
87                if widget.get_active():
88                        print("* Executing %s ..."%self.command)
89                        os.system(self.command)
90               
91#class Alternative
92
93
94class CpanelButton(Gtk.Button):
95
96        def __init__(self,label,command):
97               
98                Gtk.Button.__init__(self, label)
99                self.command=command
100                self.connect("clicked",self.button_clicked)
101               
102       
103        def button_clicked(self,widget):
104               
105                print("* Executing %s ..."%self.command)
106                os.system(self.command)
107               
108#class CpanelButton
109
110
111
112class ConfigurationParser:
113       
114        def __init__(self):
115                pass
116       
117        def load_plugin(self,path):
118       
119                try:
120                        config = ConfigParser.ConfigParser()
121                        config.optionxform=str
122                        config.read(path)
123                        if config.has_section("JAVA"):
124                                info={}
125                                info["pkg"]=config.get("JAVA","pkg")
126                                info["name"]=config.get("JAVA","name")
127                                info["cmd"]=config.get("JAVA","cmd")
128                                return GridButton(info)
129                               
130                except Exception as e:
131                        print e
132                        return None
133       
134       
135#class ConfigParser
136
137
138class CustomColor:
139       
140        def __init__(self,r,g,b):
141               
142                self.r=r/255.0
143                self.g=g/255.0
144                self.b=b/255.0
145
146#class CustomColor             
147
148class AwesomeTabs:
149       
150        def __init__(self):
151               
152                self.configuration_parser=ConfigurationParser()
153               
154                self.current_tab=-1
155                self.current_width=0
156                self.animation_left=False
157                self.animation_right=False
158               
159                self.current_red_width=0
160                self.current_red_pos=0
161                self.configuration_start=0
162               
163                self.first_run=True
164                self.update_alternatives=False
165               
166                self.current_grid_width=0
167                self.current_grid_height=0
168               
169                self.max_grid_width=2
170               
171                self.dark_gray=CustomColor(130.0,151.0,161.0)
172                self.light_gray=CustomColor(185.0,195.0,195.0)
173               
174                self.green=CustomColor(74.0,166.,69.0)
175                self.light_green=CustomColor(88.0,208.0,86.0)
176               
177               
178                self.conf_light=CustomColor(49.0,55.0,66.0)
179                self.conf_dark=CustomColor(30.0,36.0,42.0)
180               
181                self.conf_light_shadow=CustomColor(107.0,116.0,137.0)
182                self.conf_dark_shadow=CustomColor(0,0,0)
183               
184                self.current_conf_height=0
185                self.conf_buttons=[]
186                self.start_gui()
187               
188               
189        #def __init__
190       
191       
192       
193        def start_gui(self):
194               
195                builder=Gtk.Builder()
196                builder.set_translation_domain('lliurex-java-panel')
197                glade_path=RSRC_DIR+"lliurex-java-panel.ui"
198                builder.add_from_file(glade_path)
199               
200                self.installers_eb=builder.get_object("installers_eventbox")
201                self.installers_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
202                self.installers_eb.connect("button-press-event",self.label_clicked,0)
203               
204                self.configuration_eb=builder.get_object("configuration_eventbox")
205                self.configuration_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
206                self.configuration_eb.connect("button-press-event",self.label_clicked,1)
207               
208                self.installers_label=builder.get_object("installers_label")
209                self.configuration_label=builder.get_object("configuration_label")
210                self.alternatives_label=builder.get_object("alternatives_label")
211               
212                self.top_divider_da=builder.get_object("top_divider_drawingarea")
213                self.bottom_divider_da=builder.get_object("bottom_divider_drawingarea")
214                #self.install_da.connect("draw",self.drawing_label_event,0)
215                self.top_divider_da.connect("draw",self.draw_top_divider)
216                self.bottom_divider_da.connect("draw",self.draw_bottom_divider)
217               
218                self.button_scroll=builder.get_object("button_scrolledwindow")
219                self.main_box=builder.get_object("main_box")
220                self.close_eb=builder.get_object("close_eventbox")
221                self.close_da=builder.get_object("close_drawingarea")
222                self.close_eb.connect("button-press-event",self.quit)
223                self.close_da.connect("draw",self.draw_close_button)
224               
225               
226                self.stack = Gtk.Stack()
227                self.stack.set_transition_duration(1000)
228                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
229               
230                self.installers_grid=builder.get_object("button_grid")
231                self.configuration_box=builder.get_object("configuration_box")
232               
233                '''
234                grid=GridButton("oracle-java6","Oracle Java 6")
235                self.add_grid_button(grid)
236               
237                grid=GridButton("oracle-java7","Oracle Java 7")
238                self.add_grid_button(grid)
239               
240                grid=GridButton("oracle-java8","Oracle Java 8")
241                self.add_grid_button(grid)
242               
243                grid=GridButton("openjdk6","Open JRE 6")
244                self.add_grid_button(grid)
245               
246                grid=GridButton("openjdk7","Open JRE 7")
247                self.add_grid_button(grid)
248                '''
249               
250                       
251               
252               
253                self.stack.add_titled(self.button_scroll, "installers", "Installers")
254                self.stack.add_titled(self.configuration_box, "configuration", "Configuration")
255               
256                self.main_box.add(self.stack)
257               
258                self.main_window=builder.get_object("main_window")
259               
260               
261                self.main_window.connect("destroy",self.quit)
262               
263               
264                self.progress_window=builder.get_object("progress_window")
265                self.pbar=builder.get_object("progressbar")
266                self.progress_window.set_transient_for(self.main_window)
267               
268                self.gather_window=builder.get_object("gather_window")
269                self.gather_pbar=builder.get_object("progressbar1")
270                self.progress_label=builder.get_object("progress_label")
271               
272                self.label_clicked(None,None,0)
273               
274                self.confbutton_grid=builder.get_object("confbutton_grid")
275               
276                info={}
277                info["txt"]="Control Panel"
278                info["icon"]=RSRC_DIR+"control_panel.png"
279                info["name"]="cpanel"
280                info["active"]=True
281               
282                self.add_conf_button(info)
283               
284                info["txt"]="Java Web Start"
285                info["icon"]=RSRC_DIR+"java_conf.png"
286                info["name"]="jws"
287                info["active"]=False
288               
289                self.add_conf_button(info)
290               
291                info["txt"]="Java Runtime\nEnvironment"
292                info["icon"]=RSRC_DIR+"java_conf.png"
293                info["name"]="jre"
294               
295                self.add_conf_button(info)
296               
297                info["txt"]="Firefox Plugin"
298                info["icon"]=RSRC_DIR+"firefox.png"
299                info["name"]="firefox"
300               
301                self.add_conf_button(info)
302               
303                self.configuration_box=builder.get_object("configuration_box")
304                self.alternatives_box=builder.get_object("alternatives_box")
305               
306                self.conf_stack=Gtk.Stack()
307                self.conf_stack.set_transition_duration(500)
308                self.conf_stack.set_transition_type(Gtk.StackTransitionType.UNDER_DOWN)
309               
310                self.alternatives_box.pack_start(self.conf_stack,True,True,0)
311               
312                self.build_cpanel_alternatives()
313                self.build_jws_alternatives()
314                self.build_jre_alternatives()
315                self.build_firefox_alternatives()
316                self.configuration_box.show_all()
317
318                self.set_css_info()
319               
320                #self.main_window.show_all()
321                self.gather_window.show_all()
322                GLib.timeout_add(100,self.pulsate_gathering_info)
323               
324                self.t=threading.Thread(target=self.gather_info)
325                self.t.daemon=True
326                self.t.start()
327               
328               
329                GObject.threads_init()         
330                Gtk.main()
331               
332        #def start_gui
333       
334        def gather_info(self):
335               
336                import time
337                base_apt_cmd="apt-cache policy "
338               
339                gbs=[]
340               
341                for item in sorted(os.listdir(JAVAS_CONFIG_PATH)):
342                        if os.path.isfile(JAVAS_CONFIG_PATH+item):
343                                gb=self.configuration_parser.load_plugin(JAVAS_CONFIG_PATH+item)
344                                if gb!=None:
345                                        sys.stdout.write("* Checking %s ...\t"%gb.info["pkg"])
346                                        gb.info["installed"]=self.is_installed(gb.info["pkg"])
347                                        sys.stdout.write("%s\n"%gb.info["installed"])
348                                        base_apt_cmd += "%s "%gb.info["pkg"]
349                                        gbs.append(gb)
350                                       
351                p=subprocess.Popen([base_apt_cmd],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)     
352                output=p.communicate()
353               
354                for gb in gbs:
355                       
356                        if gb.info["pkg"] not in output[0]:
357                                print(" [!] %s not available [!] "%gb.info["pkg"])
358                                gb.info["available"]=False
359                        else:   
360                                self.add_grid_button(gb)       
361                       
362               
363
364       
365        #def gather_info
366       
367        def pulsate_gathering_info(self):
368               
369                self.gather_pbar.pulse()
370               
371                if not self.t.is_alive():
372                       
373                        self.gather_window.hide()
374                        self.main_window.show_all()
375               
376                return self.t.is_alive()
377               
378        #def pulsate_gathering
379       
380        def set_css_info(self):
381               
382                css = """
383               
384                #BLUE {
385                        background-image:-gtk-gradient (linear, left top, left bottom, from (#0f72ff),  to (#0f72ff));;
386               
387                }
388               
389                #BLACK{
390                        background-image:-gtk-gradient (linear, left top, left bottom, from (#000000),  to (#000000));;
391               
392                }
393               
394               
395                #BACK_GRADIENT{
396                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff), to (#eceff3));;
397                }
398               
399                #WHITE {
400                        color: white;
401                        text-shadow: 0px 1px black;
402                }
403               
404                #MAIN_LABEL_ENABLED{
405                        color: #8297a1;
406                        font: Quattrocento Sans Bold 18;
407                }
408               
409                #ALTERNATIVES_LABEL{
410                        color: #8297a1;
411                        font: Quattrocento Sans Bold 12;
412                }
413               
414                #MAIN_LABEL_DISABLED{
415                        color: #c9d4e2;
416                        font: Quattrocento Sans Bold 18;
417                }
418               
419                #RED_PROGRESS{
420                       
421                        background-color: #FF0000;
422                        border: 0px;
423
424                }
425               
426                #DARK_BACK{
427                        background-color: #070809;
428                }
429               
430                #GREEN {
431                        background-image:-gtk-gradient (linear, left top, left bottom, from (#41ff70),  to (#41ff70));;
432               
433                }
434               
435                #ORANGE {
436                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff7f2a),  to (#ff7f2a));;
437               
438                }
439               
440                #LIGHTBLUE {
441                        -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
442                        from (shade (#ff0000, 0.68)),
443                        to (shade (#ff0000, 0.68)));
444               
445                }
446               
447
448
449                .radio#RED {
450                  -gtk-icon-source: -gtk-scaled(url("/usr/share/lliurex-java-panel/rsrc/radio-unchecked.png"), url("/usr/share/lliurex-java-panel/rsrc/radio-unchecked.png")); }
451
452               
453               
454                .radio:checked#RED {
455                  -gtk-icon-source: -gtk-scaled(url("/usr/share/lliurex-java-panel/rsrc/radio-checked.png"), url("/usr/share/lliurex-java-panel/rsrc/radio-checked.png")); }
456
457                GtkButton#RED GtkLabel {
458                        color: #8297a1;
459                        font: Quattrocento Sans 11;
460                }
461
462
463                """
464                self.style_provider=Gtk.CssProvider()
465                self.style_provider.load_from_data(css)
466                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
467               
468                self.main_window.set_name("BACK_GRADIENT")
469                self.installers_label.set_name("MAIN_LABEL_ENABLED")
470                self.alternatives_label.set_name("ALTERNATIVES_LABEL")
471                self.configuration_label.set_name("MAIN_LABEL_DISABLED")
472                self.pbar.set_name("RED_PROGRESS")
473                self.gather_pbar.set_name("RED_PROGRESS")
474                self.confbutton_grid.set_name("DARK_BACK")
475                self.progress_label.set_name("ALTERNATIVES_LABEL")
476               
477               
478        #def css_info
479
480       
481        def is_installed(self,pkg):
482               
483               
484                p=subprocess.Popen(["dpkg-query -W -f='${db:Status-Status}' %s"%pkg],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
485                output=p.communicate()
486               
487                if output[0]=="installed":
488                        return True
489                       
490                return False
491               
492               
493        #def is_installed
494       
495        def quit(self,widget,event=None):
496               
497                Gtk.main_quit()
498               
499        #def quit
500       
501        def execute(self,command):
502               
503                self.thread_ret=-1
504               
505                self.thread_ret=os.system(command)
506               
507        #def execute
508       
509       
510        def pulsate_pbar(self,grid_button,da):
511               
512                if self.t.is_alive():
513                       
514                        self.pbar.pulse()
515                       
516                       
517                if not self.t.is_alive():
518                        self.progress_window.hide()
519                        if self.thread_ret==0:
520                                grid_button.info["installed"]=True
521                                self.update_alternatives=True
522                        da.queue_draw()
523                       
524                return self.t.is_alive()
525       
526        #def pulsate_pbar
527
528       
529        def add_conf_button(self,info):
530               
531                cb=ConfButton(info)
532                da=Gtk.DrawingArea()
533                da.set_size_request(110,123)
534                da.connect("draw",self.draw_configure_button,cb)
535                da.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
536                da.connect("button-press-event",self.conf_clicked,cb)
537                da.show()
538                self.confbutton_grid.attach(da,0,self.current_conf_height,1,1)
539                self.current_conf_height+=1
540                self.conf_buttons.append(cb)
541                cb.da=da
542               
543               
544        #deff add_conf_button
545       
546
547        def build_cpanel_alternatives(self):
548               
549                tmp_box=Gtk.VBox()
550               
551                alternative_list=[]
552                cpanel_label_list=[]
553                cpanel_cmd_list=[]
554               
555                # build alternatives list here
556               
557                # ############### #
558                               
559                java_cmd='update-alternatives --list java | grep -v "gij"'
560                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
561                java_label='update-alternatives --list java | grep -v "gij" | cut -d"/" -f5'
562                java_label_list=(subprocess.check_output(java_label, shell=True)).split("\n")
563                       
564                i=0
565                for item in java_label_list:
566                        print item
567                        if java_label_list[i]!='':
568                                if not ('openjdk' in java_label_list[i]):
569                                        cpanel_label_list.append(item)
570                                        cpanel_cmd_list.append(java_cmd_list[i].replace("bin/java", "bin/ControlPanel"))
571                                i+=1
572                               
573                if len(cpanel_label_list)>0:   
574                        for x in cpanel_label_list:
575                                j=cpanel_label_list.index(x)
576                                a=CpanelButton(x.upper(),cpanel_cmd_list[j])
577                                #a.set_name("RED")
578                                #alternative_list.append(a)
579                                tmp_box.pack_start(a,False,False,15)
580                '''     
581                if len(alternative_list) > 0:
582                        for alternative in alternative_list[1:]:
583                                alternative.join_group(alternative_list[0])
584                               
585               
586               
587                for alternative in alternative_list:
588                        alternative.connect("toggled",alternative.alternative_toggled)
589                '''
590                               
591                self.conf_stack.add_titled(tmp_box, "cpanel", "Control Panel")
592
593               
594        #def build_cpanel_alternatives 
595       
596       
597        def build_jws_alternatives(self):
598       
599                tmp_box=Gtk.VBox()
600               
601                alternative_list=[]
602                jws_label_list=[]
603                jws_cmd_list=[]
604
605                # build alternatives list here
606               
607                # ############### #
608       
609                java_cmd='update-alternatives --list javaws | grep -v "gij"'
610                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
611                java_label='update-alternatives --list javaws | grep -v "gij" | cut -d"/" -f5'
612                java_label_list=(subprocess.check_output(java_label, shell=True)).split("\n")
613               
614                i=0
615                for item in java_label_list:
616                        if java_label_list[i]!='':
617                                jws_label_list.append(item)
618                                jws_cmd_list.append('update-alternatives --set javaws ' + java_cmd_list[i])
619                                i+=1
620               
621                if len(jws_label_list)>0:
622                        for x in jws_label_list:
623                                j=jws_label_list.index(x)
624                                a=Alternative(x.upper(),jws_cmd_list[j])
625                                a.set_name("RED")
626                                alternative_list.append(a)
627                                tmp_box.pack_start(a,False,False,15)
628                       
629                if len(alternative_list) > 0:
630                        for alternative in alternative_list[1:]:
631                                alternative.join_group(alternative_list[0])
632                               
633                                                               
634                # get jws configured actually
635               
636                # ################ #
637               
638                jws_configured_cmd='update-alternatives --get-selections |grep javaws$' 
639                jws_configured_label= (subprocess.check_output(jws_configured_cmd, shell=True)).split("/")[4]   
640               
641                try:
642                        k=jws_label_list.index(jws_configured_label)
643                        alternative_list[k].set_active(True)
644                except Exception as e:
645                        print e
646                        jws_remove=(subprocess.check_output(jws_configured_cmd, shell=True)).split()[2]
647                        remove_alternative='update-alternatives --remove "javaws"' + ' "'+ jws_remove+'"'
648                        os.system(remove_alternative)
649                        jws_configured_cmd='update-alternatives --get-selections |grep javaws$' 
650                        jws_configured_label= (subprocess.check_output(jws_configured_cmd, shell=True)).split("/")[4]
651                        k=jws_label_list.index(jws_configured_label)
652                        alternative_list[k].set_active(True)
653                       
654                for alternative in alternative_list:
655                        alternative.connect("toggled",alternative.alternative_toggled)
656               
657                self.conf_stack.add_titled(tmp_box, "jws", "Java Web Start")
658
659               
660        #def  build_jws_alternatives
661       
662       
663        def build_jre_alternatives(self):
664       
665                tmp_box=Gtk.VBox()
666               
667                alternative_list=[]
668                jre_label_list=[]
669                jre_cmd_list=[]
670
671                # build alternatives list here
672               
673                # ############### #
674                       
675                java_cmd='update-alternatives --list java | grep -v "gij"'
676                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
677                java_label='update-alternatives --list java | grep -v "gij" | cut -d"/" -f5'
678                java_label_list=(subprocess.check_output(java_label, shell=True)).split("\n")
679               
680                i=0
681                for item in java_label_list:
682                        if java_label_list[i]!='':
683                                jre_label_list.append(item)
684                                jre_cmd_list.append('update-alternatives --set java ' + java_cmd_list[i])
685                                i+=1
686                               
687                if len(java_label_list)>0:
688                        for x in jre_label_list:
689                                j=jre_label_list.index(x)
690                                a=Alternative(x.upper(),jre_cmd_list[j])
691                                a.set_name("RED")
692                                alternative_list.append(a)
693                                tmp_box.pack_start(a,False,False,15)
694                       
695                if len(alternative_list) > 0:
696                        for alternative in alternative_list[1:]:
697                                alternative.join_group(alternative_list[0])
698                               
699                # get jre configured actually
700               
701                # ################ #
702               
703                jre_configured_cmd='update-alternatives --get-selections |grep java$' 
704                jre_configured_label= (subprocess.check_output(jre_configured_cmd, shell=True)).split("/")[4]   
705               
706                try:
707                        k=jre_label_list.index(jre_configured_label)
708                        alternative_list[k].set_active(True)
709                except Exception as e:
710                        print e
711               
712                for alternative in alternative_list:
713                        alternative.connect("toggled",alternative.alternative_toggled)
714               
715               
716                self.conf_stack.add_titled(tmp_box, "jre", "JRE Selector")
717
718               
719        #def build_jre_alternatives
720
721       
722        def build_firefox_alternatives(self):
723       
724                tmp_box=Gtk.VBox()
725               
726                alternative_list=[]
727                firefox_label_list=[]
728                firefox_cmd_list=[]     
729               
730                # build alternatives list here
731               
732                # ############### #
733               
734                javaplugin_cmd='update-alternatives --list mozilla-javaplugin.so | grep -v "gij"' 
735                javaplugin_cmd_list=(subprocess.check_output(javaplugin_cmd, shell=True)).split("\n")
736                javaplugin_label='update-alternatives --list mozilla-javaplugin.so | grep -v "gij" | cut -d"/" -f5'
737                javaplugin_label_list=(subprocess.check_output(javaplugin_label, shell=True)).split("\n")
738
739                       
740                i=0
741                for item in javaplugin_label_list:
742                        if javaplugin_label_list[i]!='':
743                                firefox_label_list.append(item)
744                                firefox_cmd_list.append('update-alternatives --set mozilla-javaplugin.so ' + javaplugin_cmd_list[i])
745                                i+=1
746               
747                if len(firefox_label_list)>0:
748                        for x in firefox_label_list:
749                                j=firefox_label_list.index(x)
750                                a=Alternative(x.upper(),firefox_cmd_list[j])
751                                a.set_name("RED")
752                                alternative_list.append(a)
753                                tmp_box.pack_start(a,False,False,15)
754                       
755                if len(alternative_list) > 0:
756                        for alternative in alternative_list[1:]:
757                                alternative.join_group(alternative_list[0])
758                               
759                               
760                                       
761                # get mozilla plugin configured actually
762               
763                # ################ #
764               
765                firefox_configured_cmd='update-alternatives --get-selections |grep mozilla-javaplugin.so' 
766                firefox_configured_label= (subprocess.check_output(firefox_configured_cmd, shell=True)).split("/")[4]   
767               
768                try:
769                        k=firefox_label_list.index(firefox_configured_label)
770                        alternative_list[k].set_active(True)
771                except Exception as e:
772                        print e
773               
774                for alternative in alternative_list:
775                        alternative.connect("toggled",alternative.alternative_toggled)
776               
777                self.conf_stack.add_titled(tmp_box, "firefox", "Firefox Alternatives")
778
779               
780        #def  build_firefox_alternatives
781       
782        def refresh_alternatives(self):
783               
784                cpanel_alter=self.conf_stack.get_child_by_name("cpanel")
785                self.conf_stack.remove(cpanel_alter)
786                jws_alter=self.conf_stack.get_child_by_name("jws")
787                self.conf_stack.remove(jws_alter)
788                jre_alter=self.conf_stack.get_child_by_name("jre")
789                self.conf_stack.remove(jre_alter)
790                firefox_alter=self.conf_stack.get_child_by_name("firefox")
791                self.conf_stack.remove(firefox_alter)
792                self.build_cpanel_alternatives()
793                self.build_jws_alternatives()
794                self.build_jre_alternatives()
795                self.build_firefox_alternatives()
796                self.configuration_box.show_all()
797               
798                try:
799                        self.conf_stack.set_visible_child_name(self.cb_active)
800                except:
801                        self.conf_stack.set_visible_child_name("cpanel")
802                       
803                self.update_alternatives=False 
804               
805        #def refresh_alternatives       
806               
807        def add_grid_button(self,grid_button):
808               
809                da=Gtk.DrawingArea()
810                da.set_size_request(140,148)
811                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
812               
813                da.connect("draw",self.draw_button,grid_button)
814                da.connect("motion-notify-event",self.mouse_over,grid_button)
815                da.connect("leave_notify_event",self.mouse_left,grid_button)
816                da.connect("button-press-event",self.button_clicked,grid_button)
817               
818               
819                #button.connect("motion-notify-event",self.mouse_over,app,image)
820                da.show()
821                self.installers_grid.attach(da,self.current_grid_width,self.current_grid_height,1,1)
822               
823                self.current_grid_width+=1
824               
825                if self.current_grid_width > self.max_grid_width:
826                        self.current_grid_width=0
827                        self.current_grid_height+=1
828                       
829        #def add_grid_button
830       
831       
832        def conf_clicked(self,widget,event,cb):
833               
834                for item in self.conf_buttons:
835                        item.active=False
836                        item.da.queue_draw()
837                       
838                cb.active=True
839                self.cb_active=cb.name
840                self.conf_stack.set_visible_child_name(cb.name)
841                widget.queue_draw()
842               
843        #def conf_clicked
844       
845       
846        def button_clicked(self,widget,event,grid_button):
847               
848                self.t=threading.Thread(target=self.execute,args=(grid_button.info["cmd"],))
849                self.t.daemon=True
850                self.t.start()
851                GLib.timeout_add(100,self.pulsate_pbar,grid_button,widget)
852                self.progress_window.show()
853               
854               
855        #def button_clicked
856       
857       
858        def draw_configure_button(self,widget,ctx,cb):
859               
860                if cb.active:
861                        ctx.set_source_rgba(self.conf_light.r,self.conf_light.g,self.conf_light.b,1)
862                        ctx.rectangle(0,0,110,123)
863                        ctx.fill()
864                       
865                        ctx.set_source_rgba(1,0,0,1)
866                        ctx.move_to(0,0)
867                        ctx.rectangle(0,1,5,121)
868                        ctx.fill()
869                       
870                else:
871                        ctx.set_source_rgba(self.conf_dark.r,self.conf_dark.g,self.conf_dark.b,1)
872                        ctx.rectangle(0,0,110,123)
873                        ctx.fill()
874               
875               
876               
877                ctx.move_to(0,0)
878                ctx.set_source_rgba(self.conf_light_shadow.r,self.conf_light_shadow.g,self.conf_light_shadow.b,1)
879                ctx.rectangle(0,0,110,1)
880                ctx.fill()
881               
882                ctx.move_to(0,0)
883                ctx.set_source_rgba(self.conf_dark_shadow.r,self.conf_dark_shadow.g,self.conf_dark_shadow.b,1)
884                ctx.rectangle(0,121,110,2)
885                ctx.fill()
886               
887                ctx.move_to(0,0)
888                img=cairo.ImageSurface.create_from_png(cb.icon)
889                ctx.set_source_surface(img,33,22)
890                ctx.paint()
891               
892                pctx = PangoCairo.create_layout(ctx)
893                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
894                pctx.set_font_description(desc)
895                pctx.set_markup(cb.txt)
896                ctx.set_source_rgba(self.light_gray.r,self.light_gray.g,self.light_gray.b,1)
897                width=pctx.get_pixel_size()[0]
898                ctx.move_to((110-width)/2,80)
899                PangoCairo.show_layout(ctx, pctx)
900               
901        #def draw_configure_button
902       
903
904        def draw_button(self,widget,ctx,grid_button):
905               
906                ctx.move_to(0,0)
907                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
908                ctx.set_source_surface(img,0,grid_button.info["shadow_start"])
909                ctx.paint_with_alpha(grid_button.info["shadow_alpha"])
910               
911                ctx.move_to(0,0)
912                img=cairo.ImageSurface.create_from_png(grid_button.info["image"])
913                ctx.set_source_surface(img,0,0)
914                ctx.paint()
915               
916                ctx.move_to(0,0)
917                ctx.set_source_rgba(1,1,1,1)
918                ctx.rectangle(0,110,140,30)
919                ctx.fill()
920               
921               
922                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
923               
924                pctx = PangoCairo.create_layout(ctx)
925                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
926                pctx.set_font_description(desc)
927                pctx.set_markup(grid_button.info["name"])
928                ctx.move_to(5,118)
929                PangoCairo.show_layout(ctx, pctx)
930                width=pctx.get_pixel_size()[0]
931               
932               
933               
934                if grid_button.info["installed"]:
935               
936                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 8")
937                        pctx.set_font_description(desc)
938                        ctx.set_source_rgba(self.green.r,self.green.g,self.green.b,1)
939                        txt=_("Installed")
940                        pctx.set_markup(txt)
941                        width=pctx.get_pixel_size()[0]
942                        ctx.move_to(140-width-5,120)
943                        PangoCairo.show_layout(ctx, pctx)
944                       
945                       
946                        #ctx.set_source_rgba(self.light_green.r,self.light_green.g,self.light_green.b,1)
947                        ctx.rectangle(5,139,130,1)
948                        ctx.fill()
949               
950               
951        #def draw_button
952       
953       
954        def drawing_label_event(self,widget,ctx,id):
955               
956                if id==self.current_tab:
957
958                        lg1 = cairo.LinearGradient(0.0,0.0, 300.0, 3.0)
959                        lg1.add_color_stop_rgba(0, 0, 1, 1, 0)
960                        lg1.add_color_stop_rgba(0.5, 0, 1, 1, 1)
961                        lg1.add_color_stop_rgba(1, 0, 1, 1, 0)
962                        ctx.rectangle(0, 0, 300, 3)
963                        ctx.set_source(lg1)
964                        ctx.fill()
965                       
966        #drawing_label_event
967       
968       
969        def draw_close_button(self,widget,ctx):
970               
971               
972                button_border=22
973               
974                pctx = PangoCairo.create_layout(ctx)
975                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 12")
976                pctx.set_font_description(desc)
977               
978                pctx.set_markup(_("CLOSE"))
979                width=pctx.get_pixel_size()[0]
980                widget.set_size_request(width+button_border*2,30)
981               
982                ctx.set_source_rgba(1,1,0,1)
983                xx=0
984                yx=0
985                widthx=width+44
986                heightx=30
987                radius=5
988               
989                r=47.0
990                g=167.0
991                b=223.0
992                alpha=1.0
993               
994                r=r/255.0
995                g=g/255.0
996                b=b/255.0
997               
998                r2=83
999                g2=153
1000                b2=252
1001               
1002                r2=r2/255.0
1003                g2=g2/255.0
1004                b2=b2/255.0
1005               
1006               
1007                lg1 = cairo.LinearGradient(0.0,0.0, 90.0, 0)
1008                lg1.add_color_stop_rgba(0, r, g, b, 1)
1009                lg1.add_color_stop_rgba(1, r2, g2, b2, 1)
1010                ctx.set_source(lg1)
1011               
1012               
1013                ctx.move_to (xx + radius, yx);
1014                ctx.arc (xx + widthx - radius, yx + radius, radius, pi * 1.5, pi * 2);
1015                ctx.arc (xx + widthx - radius, yx + heightx - radius, radius, 0, pi * .5);
1016                ctx.arc (xx + radius, yx + heightx - radius, radius, pi * .5, pi);
1017                ctx.arc (xx + radius, yx + radius, radius, pi , pi * 1.5);
1018                ctx.fill ();
1019               
1020                ctx.set_source_rgb(0.9,0.9,0.9)
1021                ctx.move_to(button_border,7)
1022                PangoCairo.show_layout(ctx, pctx)
1023               
1024        #def draw_close_button
1025
1026       
1027        def draw_top_divider(self,widget,ctx):
1028               
1029                r=self.light_gray.r
1030                g=self.light_gray.g
1031                b=self.light_gray.b
1032                alpha=1.0
1033               
1034               
1035                ctx.set_source_rgba(r,g,b,alpha)
1036                ctx.rectangle(0,1,510,3)
1037                ctx.fill()
1038               
1039                width=0
1040
1041                if self.first_run:
1042               
1043                        pctx = PangoCairo.create_layout(ctx)
1044                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 18")
1045                        pctx.set_font_description(desc)
1046                        pctx.set_markup(_("Installers"))
1047                        self.installers_width=pctx.get_pixel_size()[0]
1048                        pctx.set_markup(_("Configuration"))
1049                        self.configuration_width=pctx.get_pixel_size()[0]
1050                       
1051                        self.first_run=False
1052                       
1053                if self.current_tab==0:
1054                        width=self.installers_width
1055                else:
1056                        width=self.configuration_width
1057                        self.configuration_start=469-width
1058                       
1059                ctx.set_source_rgba(1.0,0,0,alpha)
1060               
1061                               
1062                if not self.animation_left and not self.animation_right:
1063               
1064                        if self.current_tab==0:
1065                                ctx.rectangle(0,0,width,3)
1066                               
1067                                self.current_red_width=width
1068                                self.current_red_start=0
1069                               
1070                        else:
1071                                ctx.rectangle(469-width,0,width,3)
1072                                self.current_red_width=width
1073                                self.current_red_start=469-width
1074                       
1075                       
1076                        ctx.fill()
1077               
1078                else:
1079               
1080                        ctx.rectangle(self.current_red_start,0,self.current_red_width,3)
1081                        ctx.fill()
1082               
1083               
1084        #def draw_top_divider
1085       
1086       
1087        def draw_bottom_divider(self,widget,ctx):
1088               
1089                r=self.dark_gray.r
1090                g=self.dark_gray.g
1091                b=self.dark_gray.b
1092                alpha=1.0
1093               
1094                ctx.set_source_rgba(r,g,b,alpha)
1095                ctx.rectangle(0,1,500,3)
1096                ctx.fill()
1097               
1098        #def draw_bottom_divider
1099       
1100       
1101        def mouse_over(self,widget,event,grid_button):
1102               
1103                grid_button.info["animation_active"]=False
1104                if grid_button.info["shadow_alpha"] <0.5 :
1105                        grid_button.info["shadow_alpha"]+=0.1
1106                        widget.queue_draw()
1107                        return True
1108                       
1109                return False
1110               
1111        #def mouse_over
1112
1113       
1114        def mouse_left(self,widget,event,grid_button):
1115               
1116                if not grid_button.info["animation_active"]:
1117                       
1118                        grid_button.info["animation_active"]=True
1119                        GLib.timeout_add(10,self.restore_shadow_alpha,grid_button,widget)
1120                       
1121        #def mouse_left
1122
1123       
1124        def restore_shadow_alpha(self,grid_button,widget):
1125
1126                if grid_button.info["shadow_alpha"] >0.2 :
1127                        grid_button.info["shadow_alpha"]-=0.1
1128               
1129                       
1130                        widget.queue_draw()
1131                        return True
1132                       
1133                grid_button.info["animation_active"]=False
1134                return False
1135               
1136        #def  restore_shadow_alpha
1137       
1138        def update_divider_right(self):
1139               
1140                if self.configuration_width > self.installers_width:
1141               
1142
1143                        if self.current_red_width < self.configuration_width:
1144                                self.current_red_width+=1
1145                        if self.current_red_start < self.configuration_start:
1146                                self.current_red_start+=1
1147                       
1148                       
1149                        if self.current_red_width >= self.configuration_width and self.current_red_start >= self.configuration_start:
1150                               
1151                                self.animation_right=False
1152                               
1153                        self.top_divider_da.queue_draw()
1154                       
1155                else:
1156                       
1157                        if self.current_red_width > self.configuration_width:
1158                                self.current_red_width-=1
1159                        if self.current_red_start < self.configuration_start:
1160                                self.current_red_start+=1
1161                       
1162                       
1163                        if self.current_red_width <= self.configuration_width and self.current_red_start >= self.configuration_start:
1164                               
1165                                self.animation_right=False
1166                               
1167                        self.top_divider_da.queue_draw()
1168               
1169                return self.animation_right
1170               
1171        #def update_divider_right
1172       
1173        def update_divider_left(self):
1174               
1175               
1176                if self.configuration_width > self.installers_width:
1177
1178                        if self.current_red_width > self.installers_width:
1179                                self.current_red_width-=1
1180                        if self.current_red_start > 0:
1181                                self.current_red_start-=1
1182                       
1183                       
1184                        if self.current_red_width <= self.installers_width and self.current_red_start <= 0:
1185                               
1186                                self.animation_left=False
1187                               
1188                        self.top_divider_da.queue_draw()
1189                       
1190                else:
1191                       
1192                        if self.current_red_width < self.installers_width:
1193                                self.current_red_width+=1
1194                        if self.current_red_start > 0:
1195                                self.current_red_start-=1
1196                       
1197                       
1198                        if self.current_red_width >= self.installers_width and self.current_red_start <= 0:
1199                               
1200                                self.animation_left=False
1201                               
1202                        self.top_divider_da.queue_draw()
1203               
1204                return self.animation_left
1205               
1206        #def update_divider_left
1207       
1208
1209       
1210        def label_clicked(self,widget,event,id):
1211               
1212                if id==0 and self.current_tab!=id:
1213                        try:
1214                               
1215                                self.stack.set_visible_child_name("installers")
1216                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1217                                self.installers_label.set_name("MAIN_LABEL_ENABLED")
1218                                self.configuration_label.set_name("MAIN_LABEL_DISABLED")
1219                                if not self.first_run:
1220                                        self.animation_left=True
1221                                        self.animation_right=False
1222                                        GLib.timeout_add(1,self.update_divider_left)
1223                                       
1224                               
1225                        except Exception as e:
1226                                print e
1227               
1228                if id==1 and self.current_tab!=id:
1229                        try:
1230
1231                                self.stack.set_visible_child_name("configuration")
1232                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1233                                self.installers_label.set_name("MAIN_LABEL_DISABLED")
1234                                self.configuration_label.set_name("MAIN_LABEL_ENABLED")
1235                                self.animation_right=True
1236                                self.animation_left=False
1237                                GLib.timeout_add(1,self.update_divider_right)
1238                                if self.update_alternatives:
1239                                        self.refresh_alternatives()
1240                               
1241                        except:
1242                                pass
1243               
1244                self.current_tab=id
1245               
1246        #def label_clicked
1247       
1248
1249       
1250#awesome tabs
1251
1252if __name__=="__main__":
1253       
1254        at=AwesomeTabs()
Note: See TracBrowser for help on using the repository browser.