~ubuntu-branches/ubuntu/trusty/screenlets/trusty

« back to all changes in this revision

Viewing changes to .pc/91_use_webkit.patch/src/share/screenlets-manager/screenlets-manager.py

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne
  • Date: 2011-07-02 11:06:42 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20110702110642-d0oqdiy8sye8cli2
Tags: 0.1.4-0ubuntu1
* New upstream release.
* debian/patches:
 - 90-disable-resize-grip.patch : Drop, merged upstream.
 - 91_use_webkit.patch: Drop, merged upstream.
* debian/rules:
 - Only fix the permission on 1 file.
* debian/copyright:
 - Update copyright holders.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
 
3
 
# This application is released under the GNU General Public License 
4
 
# v3 (or, at your option, any later version). You can find the full 
5
 
# text of the license under http://www.gnu.org/licenses/gpl.txt. 
6
 
# By using, editing and/or distributing this software you agree to 
7
 
# the terms and conditions of this license. 
8
 
# Thank you for using free software!
9
 
 
10
 
# Screenlets Manager - (c) RYX (Rico Pfaus) 2007  / Whise (Helder Fraga) <helder.fraga@hotmail.com>
11
 
#
12
 
# + INFO:
13
 
# This is a graphical manager application that simplifies managing and
14
 
# starting screenlets. It also allows simple install and uninstall of
15
 
# per-user Screenlets.
16
 
#
17
 
# + TODO:
18
 
# - support for using sessions (via commandline), (NOTE: if a session is selected
19
 
#   all autostart-files need to be removed and created new)
20
 
# - Help-button
21
 
# - menu
22
 
#    - different View-modes (icons/details)
23
 
#
24
 
 
25
 
import pygtk
26
 
pygtk.require('2.0')
27
 
import os, sys
28
 
import screenlets
29
 
from screenlets import utils,install
30
 
import gtk, gobject
31
 
import dbus
32
 
import gettext
33
 
import subprocess
34
 
import commands
35
 
import urllib
36
 
 
37
 
 
38
 
gettext.textdomain('screenlets-manager')
39
 
gettext.bindtextdomain('screenlets-manager', screenlets.INSTALL_PREFIX +  '/share/locale')
40
 
 
41
 
 
42
 
# stub for gettext
43
 
def _(s):
44
 
        #return s
45
 
        return gettext.gettext(s)
46
 
 
47
 
 
48
 
# name/version of this app
49
 
APP_NAME        = _('Screenlets Manager')
50
 
APP_VERSION     = '0.1'
51
 
 
52
 
 
53
 
# get executing user (root or normal) and set user-dependant constants
54
 
if os.geteuid()==0:
55
 
        # we run as root, install system-wide
56
 
        USER = 0
57
 
        DIR_USER                = screenlets.DIR_USER_ROOT
58
 
        DIR_AUTOSTART   = '/etc/xdg/autostart'                  # TODO: use pyxdg here
59
 
else:
60
 
        # we run as normal user, install into $HOME
61
 
        USER = 1
62
 
        DIR_USER                = screenlets.DIR_USER
63
 
        DIR_AUTOSTART = utils.get_autostart_dir()
64
 
 
65
 
 
66
 
 
67
 
 
68
 
 
69
 
# classes
70
 
 
71
 
 
72
 
# TEST: 
73
 
#inst = ScreenletInstaller()
74
 
#print inst.get_info_from_package_name('ClockScreenlet-0.3.2.tar.bz2')
75
 
#print inst.get_info_from_package_name('/home/ryx/tmp/ExampleScreenlet-0.3.zip')
76
 
#print inst.get_info_from_package_name('/somewhere/MyScreenlet-0.1.tar.gz')
77
 
#sys.exit(1)
78
 
# /TEST
79
 
 
80
 
 
81
 
class ScreenletsManager(object):
82
 
        """The main application class."""
83
 
        
84
 
        daemon_iface = None
85
 
        
86
 
        def __init__ (self):
87
 
                # inti props
88
 
 
89
 
                if not os.path.isdir(screenlets.DIR_CONFIG):
90
 
                        os.system('mkdir %s' % screenlets.DIR_CONFIG)
91
 
                if not os.path.isdir(DIR_USER):
92
 
                        os.system('mkdir %s' % DIR_USER)        
93
 
                # create ui and populate it
94
 
                self.create_ui()
95
 
                # populate UI
96
 
                self.load_screenlets()
97
 
                # if we are running as root, show error
98
 
                if USER == 0:
99
 
                        screenlets.show_error(None, _("""Important! You are running this application as root user, almost all functionality is disabled. You can use this to install screenlets into the system-wide path."""), 
100
 
                                _('Warning!'))
101
 
                else:
102
 
                        # lookup, connect dameon
103
 
                        utils.lookup_daemon_autostart()
104
 
                        self.lookup_daemon()
105
 
                        self.connect_daemon()   
106
 
                
107
 
        # screenlets stuff
108
 
 
109
 
 
110
 
        
111
 
 
112
 
        
113
 
        def lookup_daemon (self):
114
 
                """Find the screenlets-daemon or try to launch it. Initializes 
115
 
                self.daemon_iface if daemon is found."""
116
 
                self.daemon_iface = utils.get_daemon_iface()
117
 
                # if daemon is not available, 
118
 
                if self.daemon_iface == None:
119
 
                        # try to launch it 
120
 
                        print "Trying to launching screenlets-daemon ..."
121
 
                        os.system(screenlets.INSTALL_PREFIX + \
122
 
                                '/share/screenlets-manager/screenlets-daemon.py &')
123
 
                        def daemon_check ():
124
 
                                print "checking for running daemon again ..."
125
 
                                self.daemon_iface = utils.get_daemon_iface()
126
 
                                if self.daemon_iface:
127
 
                                        print "DAEMON FOUND - Ending timeout"
128
 
                                        self.connect_daemon()
129
 
                                else:
130
 
                                        print "Error: Unable to connect/launch daemon."
131
 
                                        screenlets.show_error(None, _("Unable to connect or launch daemon. Some values may be displayed incorrectly."), _('Error'))
132
 
                        import gobject
133
 
                        gobject.timeout_add(2000, daemon_check)
134
 
                        return False
135
 
                else:
136
 
                        return True
137
 
        
138
 
        def connect_daemon (self):
139
 
                """Connect to org.screenlets.ScreenletsDaemon and connect to
140
 
                the register/unregister signals."""
141
 
                if self.daemon_iface:
142
 
                        print "DAEMON FOUND!"
143
 
                        # connect to signals
144
 
                        self.daemon_iface.connect_to_signal('screenlet_registered', 
145
 
                                self.handle_screenlet_registered)
146
 
                        self.daemon_iface.connect_to_signal('screenlet_unregistered', 
147
 
                                self.handle_screenlet_unregistered)
148
 
        
149
 
 
150
 
        def delete_selected_screenlet (self):
151
 
                """Delete the selected screenlet from the user's screenlet dir."""
152
 
                sel = self.view.get_selected_items()
153
 
                if sel and len(sel) > 0 and len(sel[0]) > 0:
154
 
                        it = self.model.get_iter(sel[0][0])
155
 
                        if it:
156
 
                                info = self.model.get_value(it, 2)
157
 
                                if info and not info.system:
158
 
                                        # delete the file
159
 
                                        if screenlets.show_question(None, _('Do you really want to permanently uninstall and delete the %sScreenlet from your system?') % info.name, _('Delete Screenlet')):
160
 
                                                # delete screenlet's directory from userdir
161
 
                                                os.system('rm -rf %s/%s' % (DIR_USER, info.name))
162
 
                                                # remove entry from model
163
 
                                                self.model.remove(it)
164
 
                                                if screenlets.show_question(None, _('Do you also want to remove the Screenlet configuration files?')):
165
 
                                                        os.system('rm -rf %s/%s' % (screenlets.DIR_CONFIG, info.name))
166
 
                                                        os.system('rm -rf %s/%sScreenlet.log' % (screenlets.DIR_CONFIG, info.name))
167
 
                                else:
168
 
                                        screenlets.show_error(None, _('Can\'t delete system-wide screenlets.'))
169
 
                return False
170
 
        
171
 
        def load_screenlets (self):
172
 
                """Load all available screenlets, create ScreenletInfo-objects for
173
 
                them and add them to the iconview-model."""
174
 
                # fallback icon
175
 
                noimg = gtk.gdk.pixbuf_new_from_file_at_size(\
176
 
                        screenlets.INSTALL_PREFIX + '/share/screenlets-manager/noimage.svg', 
177
 
                        56, 56)
178
 
                # get list of available/running screenlets
179
 
                lst_a = utils.list_available_screenlets()
180
 
                lst_r = utils.list_running_screenlets()
181
 
 
182
 
                if not lst_r:
183
 
                        lst_r = []
184
 
                lst_a.sort()
185
 
                lst_filtered = []
186
 
                filter_input = str(self.txtsearch.get_text()).lower()
187
 
                combo_sel = self.combo.get_active()
188
 
                if filter_input != '':
189
 
                        for s in lst_a:
190
 
                                filter_slname = str(s).lower()
191
 
                                filter_find = filter_slname.find(filter_input)
192
 
                                if filter_input == None or filter_find != -1:
193
 
                                        lst_filtered.append(s)
194
 
                if lst_filtered == [] and filter_input == '': lst_filtered = lst_a
195
 
                for s in lst_filtered:
196
 
                        try:
197
 
                                img = utils.get_screenlet_icon(s, 56, 56)
198
 
                        except Exception, ex:
199
 
                                #print "Exception while loading icon '%s': %s" % (path, ex)
200
 
                                img = noimg
201
 
                        # get metadata and create ScreenletInfo-object from it
202
 
                        meta = utils.get_screenlet_metadata(s)
203
 
                        if meta:
204
 
                                # get meta values
205
 
                                def setfield(name, default):
206
 
                                        if meta.has_key(name):
207
 
                                                if meta[name] != None:
208
 
                                                        return meta[name]
209
 
                                                else:
210
 
                                                        return default
211
 
                                        else:
212
 
                                                return default
213
 
                                name    = setfield('name', '')
214
 
                                info    = setfield('info', '')
215
 
                                author  = setfield('author', '')
216
 
                                version = setfield('version', '')
217
 
                                # get info
218
 
                                slinfo = utils.ScreenletInfo(s, name, info, author, version, img)
219
 
                                # check if already running
220
 
                                if lst_r.count(s + 'Screenlet'):
221
 
                                        slinfo.active = True
222
 
                                # check if system-wide
223
 
                                #if path.startswith(screenlets.INSTALL_PREFIX):
224
 
                                #       print "SYSTEM: %s" % s
225
 
                                #       info.system = True
226
 
                        else:
227
 
                                print 'Error while loading screenlets metadata for "%s".' % s
228
 
                                slinfo = utils.ScreenletInfo(s, '', '', '', '', img)
229
 
                        # add to model
230
 
 
231
 
 
232
 
                        if combo_sel == 0:
233
 
                                self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])     
234
 
                        elif combo_sel == 1:
235
 
                                if slinfo.active :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])   
236
 
                        elif combo_sel == 2:
237
 
                                if slinfo.autostart == True :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])        
238
 
                        elif combo_sel == 3:
239
 
                                if slinfo.system == True :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])   
240
 
                        elif combo_sel == 4:
241
 
                                if slinfo.system == False:self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])                           
242
 
 
243
 
 
244
 
        
245
 
        def get_Info_by_name (self, name):
246
 
                """Returns a ScreenletInfo-object for the screenlet with given name."""
247
 
                for row in self.model:
248
 
                        if row[2] and row[2].name == name:
249
 
                                return row[2]
250
 
                return None
251
 
        
252
 
        def get_selection (self):
253
 
                """Returns a ScreenletInfo-object for the currently selected entry
254
 
                int the IconView."""
255
 
                sel = self.view.get_selected_items()
256
 
                if sel and len(sel)>0 and len(sel[0])>0:
257
 
                        it = self.model.get_iter(sel[0][0])
258
 
                        if it:
259
 
                                return self.model.get_value(it, 2)
260
 
                return None
261
 
        
262
 
        def reset_selected_screenlet(self):
263
 
                sel = self.view.get_selected_items()
264
 
                if sel and len(sel) > 0 and len(sel[0]) > 0:
265
 
                        it = self.model.get_iter(sel[0][0])
266
 
                        if it:
267
 
                                info = self.model.get_value(it, 2)
268
 
                                if screenlets.show_question(None, _('Do you really want to reset the %sScreenlet configuration?') % info.name, _('Reset Screenlet')):
269
 
                                        # delete screenlet's config directory 
270
 
                                        os.system('rm -rf %s/%s' % (screenlets.DIR_CONFIG, info.name))
271
 
                                        # remove entry from model
272
 
                                        
273
 
                                
274
 
        def set_info (self, info_obj):
275
 
                """Set the values in the infobox according to the given data in the ScreenletInfo-object (and recreate infobox first)."""
276
 
                # reset infobox
277
 
                self.recreate_infobox(info_obj)
278
 
        
279
 
        def set_screenlet_active (self, name, active):
280
 
                """Set the screenlet's active-state to active (True/False)."""
281
 
                for row in self.model:
282
 
                        if row[2].name == name[:-9]:
283
 
                                row[2].active = active
284
 
                                # if selected, also toggle checkbox
285
 
                                sel = self.get_selection()
286
 
                                if sel and sel.name == name[:-9]:
287
 
                                        self.recreate_infobox(sel)
288
 
                                break
289
 
        
290
 
        # ui creation
291
 
        
292
 
        def create_ui (self):
293
 
                """Create UI."""
294
 
                # window
295
 
                self.window = w = gtk.Window()
296
 
                if USER == 0:   # add note about "root-mode"
297
 
                        w.set_title(APP_NAME + ' (root mode)')
298
 
                else:
299
 
                        w.set_title(APP_NAME)
300
 
                w.set_skip_taskbar_hint(False)
301
 
                w.set_skip_pager_hint(False)
302
 
                #w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
303
 
                w.set_position(gtk.WIN_POS_CENTER)
304
 
 
305
 
                icontheme = gtk.icon_theme_get_default()
306
 
                w.set_icon_list(icontheme.load_icon("screenlets", 24, 0))
307
 
 
308
 
                w.connect('delete-event', self.delete_event)
309
 
                w.connect('notify::is-active', self.on_active_changed)
310
 
 
311
 
                #w.set_has_separator(False)
312
 
                # create outer vbox in window
313
 
                vbox = gtk.VBox()
314
 
                w.add(vbox)
315
 
                # create hbox for upper part
316
 
                hbox = gtk.HBox()
317
 
                vbox.pack_start(hbox, True, True)
318
 
                hbox.show()
319
 
                # iconview
320
 
                self.model= gtk.ListStore(object)
321
 
                self.view = iv = gtk.IconView()
322
 
                self.model = gtk.ListStore(str, gtk.gdk.Pixbuf, object)
323
 
                iv.set_model(self.model)
324
 
                iv.set_markup_column(0)
325
 
                iv.set_pixbuf_column(1)
326
 
                # disable UI for root user
327
 
                if USER == 0:
328
 
                        iv.set_sensitive(False)
329
 
                iv.connect('selection-changed', self.selection_changed)
330
 
                iv.connect('item-activated', self.item_activated)
331
 
                iv.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
332
 
                                gtk.DEST_DEFAULT_DROP, #gtk.DEST_DEFAULT_ALL, 
333
 
                                [("text/plain", 0, 0), 
334
 
                                ("image", 0, 1),
335
 
                                ("text/uri-list", 0, 2)], 
336
 
                                gtk.gdk.ACTION_COPY)
337
 
                iv.connect("drag_data_received", self.drag_data_received)
338
 
                # wrap iconview in scrollwin
339
 
                sw = self.slwindow = gtk.ScrolledWindow()
340
 
                sw.set_size_request(560, 350)
341
 
                sw.set_shadow_type(gtk.SHADOW_IN)
342
 
                sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
343
 
                sw.add(iv)
344
 
                sw.show()
345
 
                # infobox at bottom (empty yet, filled later)
346
 
                # wrap scrollwin and infobox in a paned
347
 
                self.paned = paned = gtk.VPaned()
348
 
                paned.pack1(sw, True, True)
349
 
                # add paned to hbox
350
 
                hbox.pack_end(paned, True, True)
351
 
                w.set_border_width(5)
352
 
                # add HBox to dialog's vbox
353
 
                #w.vbox.add(hbox)
354
 
                #vbox.add(hbox)
355
 
                # create right area with buttons
356
 
                butbox = self.bbox = gtk.VBox()
357
 
                self.button_add = but1 = gtk.Button(_('Launch/Add'))
358
 
                #but1.set_image(gtk.image_new_from_stock(gtk.STOCK_EXECUTE, 
359
 
                #       gtk.ICON_SIZE_BUTTON))
360
 
                but1.set_sensitive(False)
361
 
                but2 = gtk.Button(_('Install'))
362
 
                #but2.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD, 
363
 
                #       gtk.ICON_SIZE_BUTTON))
364
 
                self.button_delete = but3 = gtk.Button(_('Uninstall'))
365
 
                but3.set_sensitive(False)
366
 
                #but3.set_image(gtk.image_new_from_stock(gtk.STOCK_DELETE, 
367
 
                #       gtk.ICON_SIZE_BUTTON))
368
 
                self.button_reset = but4 = gtk.Button(_('Reset Screenlet Config'))
369
 
                but4.set_sensitive(False)
370
 
                #but4.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, 
371
 
                #       gtk.ICON_SIZE_BUTTON))
372
 
                self.button_theme = but5 = gtk.Button(_('Install New Theme'))
373
 
                but5.set_sensitive(False)
374
 
                #but5.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD, 
375
 
                #       gtk.ICON_SIZE_BUTTON))
376
 
                self.button_restartall = but6 = gtk.Button(_('Re-Start All'))
377
 
                but6.set_sensitive(True)                
378
 
                #but6.set_image(gtk.image_new_from_stock(gtk.STOCK_REFRESH, 
379
 
                #       gtk.ICON_SIZE_BUTTON))
380
 
                self.button_closeall = but7 = gtk.Button(_('Close All'))
381
 
                but7.set_sensitive(True)
382
 
                #but7.set_image(gtk.image_new_from_stock(gtk.STOCK_REMOVE, 
383
 
                #       gtk.ICON_SIZE_BUTTON))
384
 
                self.button_prop = but8 = gtk.Button(_('Options'))
385
 
                but8.set_sensitive(True)
386
 
                self.button_shortcut = but9 = gtk.Button(_('Create Desktop Shortcut'))
387
 
                but9.set_sensitive(False)
388
 
                #but8.set_image(gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, 
389
 
                #       gtk.ICON_SIZE_BUTTON))
390
 
                #self.sep = gtk.Separator()     
391
 
                but1.connect('clicked', self.button_clicked, 'add')
392
 
                but2.connect('clicked', self.button_clicked, 'install')
393
 
                but3.connect('clicked', self.button_clicked, 'uninstall')
394
 
                but4.connect('clicked', self.button_clicked, 'reset')
395
 
                but5.connect('clicked', self.button_clicked, 'theme')
396
 
                but6.connect('clicked', self.button_clicked, 'restartall')
397
 
                but7.connect('clicked', self.button_clicked, 'closeall')
398
 
                but8.connect('clicked', self.button_clicked, 'prop')
399
 
                but9.connect('clicked', self.button_clicked, 'desktop_shortcut')
400
 
                but1.set_relief(gtk.RELIEF_NONE)
401
 
                but2.set_relief(gtk.RELIEF_NONE)
402
 
                but3.set_relief(gtk.RELIEF_NONE)
403
 
                but4.set_relief(gtk.RELIEF_NONE)
404
 
                but5.set_relief(gtk.RELIEF_NONE)
405
 
                but6.set_relief(gtk.RELIEF_NONE)
406
 
                but7.set_relief(gtk.RELIEF_NONE)
407
 
                but8.set_relief(gtk.RELIEF_NONE)
408
 
                but9.set_relief(gtk.RELIEF_NONE)
409
 
                but1.set_alignment(0,0.5)
410
 
                but2.set_alignment(0,0.5)
411
 
                but3.set_alignment(0,0.5)
412
 
                but4.set_alignment(0,0.5)
413
 
                but5.set_alignment(0,0.5)
414
 
                but6.set_alignment(0,0.5)
415
 
                but7.set_alignment(0,0.5)
416
 
                but8.set_alignment(0,0.5)
417
 
                but9.set_alignment(0,0.5)
418
 
                but1.set_tooltip_text(_("Launch/add a new instance of the selected Screenlet ..."))
419
 
                but2.set_tooltip_text(_("Install a new Screenlet, SuperKaramba or Web Widget or Web Application  ..."))
420
 
                but3.set_tooltip_text(_("Permanently uninstall/delete the currently selected Screenlet ..."))
421
 
                but4.set_tooltip_text(_("Reset this Screenlet configuration (will only work if Screenlet isn't running)"))
422
 
                but5.set_tooltip_text(_("Install new theme for this screenlet"))
423
 
                but6.set_tooltip_text(_("Restart all Screenlets that have auto start at login"))
424
 
                but7.set_tooltip_text(_("Close all Screenlets running"))
425
 
                but8.set_tooltip_text(_("New Screenlets Options/Properties"))
426
 
                but9.set_tooltip_text(_("Create a Desktop shortcut for this Screenlet"))
427
 
                self.label = gtk.Label('')
428
 
                self.label.set_line_wrap(1)
429
 
                self.label.set_width_chars(70)
430
 
                self.label.set_alignment(0, 0)
431
 
                self.label.set_size_request(-1, 65)
432
 
                self.btnsearch = gtk.Button()
433
 
                self.searchbox = gtk.HBox()
434
 
                self.txtsearch = gtk.Entry()
435
 
                self.btnsearch.set_image(gtk.image_new_from_stock(gtk.STOCK_CLOSE, 
436
 
                        gtk.ICON_SIZE_BUTTON))
437
 
                self.btnsearch.connect("clicked",self.redraw_screenlets, 'clean')
438
 
                self.txtsearch.connect("changed",self.redraw_screenlets, 'enter')
439
 
                self.txtsearch.connect("backspace",self.redraw_screenlets, 'backspace')
440
 
 
441
 
                self.searchbox.pack_start(self.txtsearch, 1)
442
 
                self.searchbox.pack_start(self.btnsearch, False)
443
 
                butbox.pack_start(self.searchbox, False,0,3)
444
 
                self.combo = gtk.combo_box_new_text()
445
 
                self.combo.append_text(_('All Screenlets'))
446
 
                self.combo.append_text(_('Running Screenlets'))
447
 
                self.combo.append_text(_('Autostart Screenlets'))
448
 
                self.combo.append_text(_('Only native Screenlets'))
449
 
                self.combo.append_text(_('Only third party'))
450
 
                self.combo.set_active(0)
451
 
                self.combo.connect("changed",self.redraw_screenlets, 'enter')
452
 
                self.combo.show()
453
 
                butbox.pack_start(but1, False)
454
 
                butbox.pack_start(but2, False)
455
 
                butbox.pack_start(but3, False)
456
 
                butbox.pack_start(but4, False)
457
 
                butbox.pack_start(but5, False)
458
 
                butbox.pack_start(but6, False)
459
 
                butbox.pack_start(but7, False)
460
 
                butbox.pack_start(but9, False)
461
 
                #sep2 =   gtk.HSeparator()
462
 
                #butbox.pack_start(sep2, False,False,5)
463
 
                butbox.pack_start(but8, False)
464
 
                butbox.pack_start(self.combo, False)
465
 
                #butbox.pack_start(self.label, False)
466
 
                butbox.show_all()
467
 
                hbox.pack_start(butbox, False, False, 10)
468
 
 
469
 
                # create lower buttonbox
470
 
                action_area = gtk.HButtonBox()
471
 
                vbox.pack_start(action_area, False, False)
472
 
                # add about/close buttons to window
473
 
                but_about = gtk.Button(stock=gtk.STOCK_ABOUT)
474
 
                but_close = gtk.Button(stock=gtk.STOCK_CLOSE)
475
 
                but_download = gtk.Button(_('Get more screenlets'))
476
 
                but_download.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, 
477
 
                        gtk.ICON_SIZE_BUTTON))
478
 
                but_about.connect('clicked', self.button_clicked, 'about')
479
 
                but_close.connect('clicked', self.button_clicked, 'close')
480
 
                but_download.connect('clicked', self.button_clicked, 'download')
481
 
                but_about.set_tooltip_text(_("Show info about this dialog ..."))
482
 
                but_download.set_tooltip_text(_("Download more screenlets ..."))
483
 
                but_close.set_tooltip_text(_("Close this dialog ..."))
484
 
                action_area.set_layout(gtk.BUTTONBOX_EDGE)
485
 
                action_area.pack_start(but_about, False, False)
486
 
                action_area.pack_start(but_download, False, False)
487
 
                action_area.pack_end(but_close, False, False)
488
 
                vbox.show_all()
489
 
                # initially create lower infobox
490
 
                self.vbox_info = None
491
 
                self.recreate_infobox(None)
492
 
                # show window
493
 
                #self.gtk_screen = w.get_screen()
494
 
                #colormap = self.gtk_screen.get_rgba_colormap()
495
 
                #if colormap:
496
 
                #       self.window.set_colormap(colormap)
497
 
                w.show_all()
498
 
 
499
 
        
500
 
        def recreate_infobox (self, info_obj):
501
 
                """Recerate the infobox at the bottom and fill data accoring to the
502
 
                given info_obj."""
503
 
                # delete old infobox
504
 
                if self.vbox_info:
505
 
                        self.vbox_info.destroy()
506
 
                        del self.vbox_info
507
 
                # create new infobox
508
 
                self.vbox_info = ibox = gtk.VBox()
509
 
                ibox.set_size_request(-1, 70)
510
 
                #vbox_info.set_spacing(20)
511
 
                self.label_info = itxt = gtk.Label('')
512
 
                itxt.set_alignment(0, 0)
513
 
                itxt.set_line_wrap(True)
514
 
                #itxt.set_padding(3, 3)
515
 
                itxt.show()
516
 
                # create checkboxes
517
 
                self.cb_enable_disable = cb = gtk.CheckButton(_('Start/Stop'))
518
 
                self.cb_autostart = cb2 = gtk.CheckButton(_('Auto start on login'))
519
 
                self.cb_tray = cb3 = gtk.CheckButton(_('Show daemon in tray'))
520
 
                ini = utils.IniReader()
521
 
                
522
 
                if ini.load (DIR_USER + '/config.ini'):
523
 
                
524
 
                        print ini.get_option('show_in_tray')
525
 
                if not os.path.isfile(DIR_USER + '/config.ini'):
526
 
                        f = open(DIR_USER + '/config.ini', 'w')
527
 
                        f.write("[Options]\n")
528
 
                        f.write("show_in_tray=True\n")
529
 
                        f.write("Keep_above=True\n")
530
 
                        f.close()
531
 
                try:
532
 
                        if ini.load(DIR_USER + '/config.ini'):
533
 
                                show_in_tray = ini.get_option('show_in_tray', section='Options')
534
 
                                if show_in_tray == 'True': #doesnt work with the bool variable directly..dont know why
535
 
                                        cb3.set_active(True)
536
 
                                else:
537
 
                                        cb3.set_active(False)
538
 
                        
539
 
                except:
540
 
                        f = open(DIR_USER + '/config.ini', 'w')
541
 
                        f.write("[Options]\n")
542
 
                        f.write("show_in_tray=True\n")
543
 
                        f.write("Keep_above=True\n")
544
 
                        f.close()
545
 
                        if ini.load(DIR_USER + '/config.ini'):
546
 
                                show_in_tray = ini.get_option('show_in_tray', section='Options')
547
 
                                if show_in_tray == 'True':
548
 
                                        cb3.set_active(True)
549
 
                                else:
550
 
                                        cb3.set_active(False)
551
 
                        
552
 
                if info_obj:
553
 
                        cb.set_sensitive(True)
554
 
                        cb2.set_sensitive(True)
555
 
                        cb.set_active(info_obj.active)
556
 
                        cb2.set_active(info_obj.autostart)
557
 
                        itxt.set_markup('<big><b>' + info_obj.name + '</b></big>\n' + \
558
 
                        info_obj.info)
559
 
                else:
560
 
                        cb.set_active(False)
561
 
                        cb2.set_active(False)
562
 
                        cb.set_sensitive(False)
563
 
                        cb2.set_sensitive(False)
564
 
                cb.connect('toggled', self.toggle_enabled)
565
 
                cb2.connect('toggled', self.toggle_autostart)
566
 
                cb3.connect('toggled', self.toggle_tray)
567
 
                #cb.show()
568
 
                sep2 =   gtk.HSeparator()
569
 
                ibox.pack_start(cb, False, False)
570
 
                ibox.pack_start(cb2, False,False, 3)
571
 
                ibox.pack_start(sep2, False,False,3)
572
 
                ibox.pack_start(cb3, False,False)
573
 
                #ibox.pack_start(itxt, True, True)
574
 
                ibox.show_all()
575
 
                # add infbox to lower paned area
576
 
                self.paned.pack2(self.label,False,False)
577
 
                #self.bbox.set_spacing(2)
578
 
                sep1 =   gtk.HSeparator()
579
 
                #self.bbox.pack_start(sep1, False,False,5)
580
 
                self.bbox.pack_start(ibox, False,False)
581
 
 
582
 
        def redraw_screenlets(self,widget,id):
583
 
                if id == 'backspace':
584
 
                        if len(self.txtsearch.get_text()) == 1:
585
 
                                self.txtsearch.set_text('')
586
 
                elif id == 'clean':
587
 
                        self.txtsearch.set_text('')
588
 
                else:
589
 
                        self.model.clear()
590
 
                        self.load_screenlets()
591
 
 
592
 
        def show_about_dialog (self):
593
 
                """Create/Show about dialog for this app."""
594
 
                dlg = gtk.AboutDialog()
595
 
                gtk.about_dialog_set_url_hook(self.website_open, None)
596
 
                # add baisc info
597
 
                dlg.set_name(screenlets.APP_NAME)
598
 
                dlg.set_comments(_(screenlets.COMMENTS))
599
 
                dlg.set_version(screenlets.VERSION)
600
 
                dlg.set_copyright(screenlets.COPYRIGHT)
601
 
                dlg.set_authors(screenlets.AUTHORS)
602
 
                dlg.set_website(screenlets.WEBSITE)
603
 
                dlg.set_website_label(screenlets.WEBSITE)
604
 
                dlg.set_license(_('This application is released under the GNU General Public License v3 (or, at your option, any later version). You can find the full text of the license under http://www.gnu.org/licenses/gpl.txt. By using, editing and/or distributing this software you agree to the terms and conditions of this license. Thank you for using free software!'))
605
 
                dlg.set_wrap_license(True)
606
 
                dlg.set_documenters(screenlets.DOCUMENTERS)
607
 
                dlg.set_artists(screenlets.ARTISTS)
608
 
                dlg.set_translator_credits(screenlets.TRANSLATORS)
609
 
                # add logo
610
 
                icontheme = gtk.icon_theme_get_default()
611
 
                logo = icontheme.load_icon("screenlets", 128, 0)
612
 
                if logo:
613
 
                        dlg.set_logo(logo)
614
 
                # run/destroy
615
 
                dlg.run()
616
 
                dlg.destroy()
617
 
                
618
 
        def website_open(self, d, link, data):
619
 
                subprocess.Popen(["xdg-open", "http://www.screenlets.org"])
620
 
 
621
 
        # could be used to reload screenlets on every activation (but it's a bit too much)
622
 
        def on_active_changed(self, window, param):
623
 
                if window.is_active():
624
 
                        # this makes the right one started/used at least if not displayed
625
 
                        utils.refresh_available_screenlet_paths()
626
 
                        # this seems too much (but if saved the active selection in view, maybe it could work)
627
 
#                       self.model.clear()
628
 
#                       self.load_screenlets()
629
 
 
630
 
        def drag_data_received (self, widget, dc, x, y, sel_data, info, timestamp):
631
 
                        
632
 
                print "Data dropped ..."
633
 
                filename = ''
634
 
                # get text-elements in selection data
635
 
                try:
636
 
                        txt = unicode.encode(sel_data.get_text(), 'utf-8')
637
 
 
638
 
                except:
639
 
                        txt = sel_data.get_text()
640
 
                txt = urllib.unquote(txt)
641
 
                if txt:
642
 
                        if txt[-1] == '\n':
643
 
                                txt = txt[:-1]
644
 
                        txt.replace('\n', '\\n')
645
 
                        # if it is a filename, use it
646
 
                        if txt.startswith('file://'):
647
 
                                filename = txt[7:]
648
 
                        else:
649
 
                                screenlets.show_error(self, _('Invalid string: %s.') % txt)
650
 
                else:
651
 
                        # else get uri-part of selection
652
 
                        uris = sel_data.get_uris()
653
 
                        if uris and len(uris)>0:
654
 
                                #print "URIS: "+str(uris        )
655
 
                                filename = uris[0][7:]
656
 
                if filename != '':
657
 
                        #self.set_image(filename)
658
 
                        installer = install.ScreenletInstaller()
659
 
                        if not utils.containsAny(filename,'%'):
660
 
                                result = installer.install(filename)
661
 
                                if result:
662
 
                                # reload screenlets to add new screenlet to iconview and show result
663
 
                                        self.model.clear()
664
 
                                        self.load_screenlets()
665
 
                                        screenlets.show_message(None, installer.get_result_message())
666
 
                                else:
667
 
                                        screenlets.show_error(None, installer.get_result_message())
668
 
                        else:
669
 
                                self.show_install_dialog()
670
 
                                print 'Please install screenlets from folders without strange characters'
671
 
 
672
 
        def show_install_dialog (self):
673
 
                """Craete/Show the install-dialog."""
674
 
                # create filter
675
 
                flt = gtk.FileFilter()
676
 
                flt.add_pattern('*.tar.bz2')
677
 
                flt.add_pattern('*.skz')
678
 
                flt.add_pattern('*.tar.gz')
679
 
                flt.add_pattern('*.zip')
680
 
                # create dialog
681
 
                dlg = gtk.FileChooserDialog(buttons=(gtk.STOCK_CANCEL, 
682
 
                        gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
683
 
                dlg.set_current_folder(os.environ['HOME'])
684
 
                dlg.set_title(_('Install a Screenlet or SuperKaramba theme'))
685
 
                dlg.set_filter(flt)
686
 
                # run
687
 
                resp            = dlg.run()
688
 
                filename        = dlg.get_filename()
689
 
                dlg.destroy()
690
 
                if resp == gtk.RESPONSE_OK:
691
 
                        # create new installer
692
 
                        installer = install.ScreenletInstaller()
693
 
                        # TEST
694
 
                        #print installer.get_info_from_package_name (filename)
695
 
                        #return
696
 
                        # /TEST
697
 
                        # try installing and show result dialog
698
 
                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
699
 
                        result = installer.install(filename)
700
 
                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
701
 
                        if result:
702
 
                                # reload screenlets to add new screenlet to iconview and show result
703
 
                                self.model.clear()
704
 
                                self.load_screenlets()
705
 
                                screenlets.show_message(None, installer.get_result_message())
706
 
                        else:
707
 
                                screenlets.show_error(None, installer.get_result_message())
708
 
 
709
 
        def show_install_theme_dialog (self):
710
 
                """Craete/Show the install-dialog."""
711
 
                # create filter
712
 
                flt = gtk.FileFilter()
713
 
                flt.add_pattern('*.tar.bz2')
714
 
                flt.add_pattern('*.tar.gz')
715
 
                flt.add_pattern('*.zip')
716
 
                try: os.system('rm -rf /tmp/screenlets/install-temp')
717
 
                except:pass
718
 
                # create dialog
719
 
                dlg = gtk.FileChooserDialog(buttons=(gtk.STOCK_CANCEL, 
720
 
                        gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
721
 
                dlg.set_current_folder(os.environ['HOME'])
722
 
                dlg.set_title((_('Install a new theme for the selected Screenlet')))
723
 
                dlg.set_filter(flt)
724
 
                # run
725
 
                resp            = dlg.run()
726
 
                filename        = dlg.get_filename()
727
 
                dlg.destroy()
728
 
                if resp == gtk.RESPONSE_OK:
729
 
                        # create new installer
730
 
                        
731
 
                        # try installing and show result dialog
732
 
                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
733
 
                        print 'Installing %s' % filename
734
 
                        result = False
735
 
                        info = self.get_selection()
736
 
                        basename        = os.path.basename(filename)
737
 
                        ext     = str(filename)[len(str(filename)) -3:]
738
 
        
739
 
                        tar_opts = 'xfz'
740
 
                        if ext == 'bz2':
741
 
                                tar_opts = 'xfj'
742
 
                        x = 0
743
 
                        y = 0
744
 
                        
745
 
#                       if not info.system:
746
 
                        install_dir = DIR_USER + '/' 
747
 
                        themes_dir = DIR_USER + '/' + info.name + '/themes/'
748
 
                        install_prefix = ''
749
 
#                       else:
750
 
#                               if not screenlets.show_question(None, _("You are about to install a theme in root mode. Continue only if you have gksudo installed, do you wish to continue?")):
751
 
#                                       self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
752
 
#                                       result = False
753
 
#                               themes_dir = screenlets.INSTALL_PREFIX + '/share/screenlets' + '/'  + info.name + '/themes/'
754
 
#                               install_dir = screenlets.INSTALL_PREFIX + '/share/screenlets' + '/' 
755
 
#                               install_prefix = 'gksudo '
756
 
 
757
 
                        if not os.path.isdir('/tmp/screenlets/'):
758
 
                                os.system('mkdir ' + '/tmp/screenlets/')
759
 
                
760
 
                        tmpdir = '/tmp/screenlets' + '/install-temp/'
761
 
                        os.system('mkdir %s' % tmpdir)
762
 
                
763
 
                        os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), tmpdir))
764
 
                        try:
765
 
                                print os.listdir(tmpdir)[0]
766
 
                        except:                         
767
 
                                screenlets.show_message(None, _("Error Found"))                         
768
 
                                self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
769
 
                                result = False #is it a valid folder?
770
 
                                
771
 
                        if not os.path.exists(tmpdir + os.listdir(tmpdir)[0]):  
772
 
                                screenlets.show_message(None, _("Theme install error 1 found - Theme not installed , maybe a package error "))                          
773
 
                                self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
774
 
                                result = False #is it a valid folder?
775
 
 
776
 
                        if os.listdir(tmpdir)[0] == 'themes': 
777
 
                                install_dir = install_dir + info.name
778
 
                                print "list contains themes folder"
779
 
                        elif os.listdir(tmpdir)[0] == info.name:
780
 
                                print "list contains the screenlet name folder"
781
 
                                install_dir = install_dir
782
 
                                if os.path.exists(tmpdir + os.listdir(tmpdir)[0] + '/'+ info.name + 'Screenlet.py') and os.path.isfile(tmpdir + os.listdir(tmpdir)[0] + '/'+ info.name + 'Screenlet.py'):
783
 
                                        screenlets.show_message(None, _("This package seams to contain a full Screenlet and not just a theme, please use the screenlet install instead"))
784
 
                                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))                 
785
 
                                        return False
786
 
                        else:
787
 
                                z =0 
788
 
                                for f in os.listdir(tmpdir + os.listdir(tmpdir)[0]):
789
 
                                        f = str(f).lower()
790
 
                                        
791
 
                                        if f.endswith('png') or f.endswith('svg'):
792
 
                                                if not f.startswith('icon'):
793
 
                                                        z=z+1
794
 
                                if z == 0:
795
 
                                        screenlets.show_message(None, _("This package doesnt seem to contain a theme"))
796
 
                                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
797
 
                                        return False
798
 
                                install_dir = install_dir + info.name + '/themes/'
799
 
                                print "only contains the themes folders"
800
 
                                                
801
 
                        os.system('rm -rf %s/install-temp' % screenlets.DIR_TMP)
802
 
 
803
 
                        os.system('mkdir -p ' + themes_dir)
804
 
 
805
 
                        for f in os.listdir(themes_dir):
806
 
                                x= x +1
807
 
                        if install_prefix != '':
808
 
                                os.system(install_prefix +chr(34) +'tar '+tar_opts+' '+ chr(39)+ filename + chr(39)+ ' -C ' + chr(39) + install_dir + chr(39)+chr(34))
809
 
                        else:
810
 
                                os.system('tar '+tar_opts+' '+ chr(39)+ filename + chr(39)+ ' -C ' + chr(39) + install_dir + chr(39))
811
 
 
812
 
 #% (tar_opts, chr(39)+ filename + chr(39), chr(39) + screenlets.INSTALL_PREFIX + '/share/screenlets' + '/' + info.name + '/themes/'+ chr(39)))
813
 
                        for f in os.listdir(themes_dir):
814
 
                                y= y +1
815
 
 
816
 
                        if y > x:
817
 
                                
818
 
                                screenlets.show_message(None, _("Theme installed , please restart %s") % info.name )
819
 
                                self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
820
 
                                result = True
821
 
 
822
 
                        else:
823
 
                                screenlets.show_message(None, _("Theme install error 2 found - Theme not installed or already installed"))
824
 
                                self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
825
 
                                result = False
826
 
                else:
827
 
                        self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) 
828
 
                        result = False
829
 
        # event-callbacks
830
 
        
831
 
        def button_clicked (self, widget, id):
832
 
                """Called when one of the buttons is clicked."""
833
 
                if id == 'close':
834
 
                        self.delete_event(self.window, None)
835
 
                elif id == 'widgetsite':
836
 
                        a = self.combo1.get_active()
837
 
                        if a == 0:
838
 
                                os.system("xdg-open http://www.google.com/ig/directory?synd=open &")
839
 
                        elif a == 1:
840
 
                                os.system("xdg-open http://www.yourminis.com/minis &")
841
 
                        elif a == 2:
842
 
                                os.system("xdg-open http://www.springwidgets.com/widgets/ &")
843
 
                        elif a == 3:
844
 
                                os.system("xdg-open http://www.widgetbox.com/galleryhome/ &")
845
 
 
846
 
                elif id == 'about':
847
 
                        self.show_about_dialog()
848
 
                elif id == 'add':
849
 
                        info = self.get_selection()
850
 
                        if info:
851
 
                                screenlets.launch_screenlet(info.name, debug=screenlets.DEBUG_MODE)
852
 
                                
853
 
                elif id == 'install':
854
 
                        self.show_install_chose_ui()
855
 
                elif id == 'uninstall':
856
 
                        self.delete_selected_screenlet()
857
 
                elif id == 'reset':
858
 
                        self.reset_selected_screenlet()
859
 
                elif id == 'theme':
860
 
                        self.show_install_theme_dialog()
861
 
                elif id == 'prop':
862
 
                        self.show_options_ui()
863
 
                elif id == 'desktop_shortcut':
864
 
                        info = self.get_selection()
865
 
                        name = info.name
866
 
                        path = utils.find_first_screenlet_path(name)
867
 
                        desk = utils.get_desktop_dir()
868
 
                        if name.endswith('Screenlet'):
869
 
                                name = name[:-9]
870
 
                        starter = '%s/%sScreenlet.desktop' % (desk, name)
871
 
                        if path:
872
 
                                print "Create desktop shortcut for: %s/%sScreenlet.py" % (path, name)
873
 
                                code = ['[Desktop Entry]']
874
 
                                code.append('Name=%sScreenlet' % name)
875
 
                                code.append('Encoding=UTF-8')
876
 
                                code.append('Version=1.0')
877
 
                                if os.path.exists('%s/icon.svg' % path):
878
 
                                        code.append('Icon=%s/icon.svg' % path)
879
 
                                elif os.path.exists('%s/icon.png' % path):
880
 
                                        code.append('Icon=%s/icon.png' % path)
881
 
                                code.append('Type=Application')
882
 
                                code.append('Exec= python -u %s/%sScreenlet.py > /dev/null' % (path, name))
883
 
                                code.append('X-GNOME-Autostart-enabled=true')
884
 
                                #print code
885
 
                                f = open(starter, 'w')
886
 
                                if f:
887
 
                                        for l in code:
888
 
                                                f.write(l + '\n')
889
 
                                        f.close()
890
 
                                        
891
 
                                        return True
892
 
                                print 'Failed to create autostarter for %s.' % name
893
 
                                return False
894
 
                elif id == 'restartall':
895
 
                        utils.quit_all_screenlets()
896
 
                        for s in os.listdir(DIR_AUTOSTART):
897
 
                
898
 
                                if s.lower().endswith('screenlet.desktop'):
899
 
                                        #s = s[:-17]
900
 
                                        os.system('sh '+ DIR_AUTOSTART + s + ' &')      
901
 
                elif id == 'closeall':
902
 
                        utils.quit_all_screenlets()
903
 
 
904
 
                elif id == 'download':
905
 
                        if screenlets.UBUNTU:
906
 
                                if not utils.is_screenlets_ppa_enabled():
907
 
                                                if screenlets.show_question(None, _('The Screenlets PPA is not listed among Software Sources. Adding this enables installing individual screenlets from Package Manager (or Software Center) and by clicking on an AptURL on web pages like Gnome-look.org. Would you like to add the Screenlets PPA to your system?'), title=_("Do you want to enable the Screenlets PPA?")):
908
 
                                                        result = commands.getstatusoutput('gksudo add-apt-repository ppa:screenlets/ppa && sudo apt-get update')[0]
909
 
                                                        if result == 0:
910
 
                                                                screenlets.show_message(None, _('The Screenlets PPA added successfully.'), title=_("Success!"))
911
 
                                                        else:
912
 
                                                                screenlets.show_error(None, _('Adding the Screenlets PPA failed.'), title=_("Failed!"))
913
 
                        subprocess.Popen(["xdg-open", screenlets.THIRD_PARTY_DOWNLOAD])
914
 
 
915
 
        def show_install_chose_ui(self):
916
 
                install_combo = gtk.combo_box_new_text()
917
 
                install_combo.append_text(_('Install Screenlet'))
918
 
                install_combo.append_text(_('Install SuperKaramba Theme'))
919
 
                install_combo.append_text(_('Convert Web Widget'))
920
 
                install_combo.append_text(_('Install Web Application'))
921
 
                install_combo.set_active(0)
922
 
                dialog = gtk.Dialog(_("Install"),self.window,
923
 
                    gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
924
 
                    (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
925
 
                     gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
926
 
                install_combo.show()
927
 
                dialog.vbox.add(install_combo)
928
 
                resp = dialog.run()
929
 
                ret = None
930
 
                if resp == gtk.RESPONSE_ACCEPT:
931
 
                        if install_combo.get_active() == 0 or install_combo.get_active() == 1:
932
 
                                self.show_install_dialog()
933
 
                        elif install_combo.get_active() == 2:
934
 
                                self.show_widget_converter()
935
 
                        elif install_combo.get_active() == 3:
936
 
                                self.show_webapp()                                              
937
 
                dialog.destroy()
938
 
 
939
 
        def show_options_ui(self):
940
 
                label = gtk.Label(_('New screenlets atributes..'))
941
 
                cb1 = gtk.CheckButton(_('Lock'))
942
 
                cb2 = gtk.CheckButton(_('Sticky'))
943
 
                cb3 = gtk.CheckButton(_('Widget'))
944
 
                cb4 = gtk.CheckButton(_('Keep above'))
945
 
                cb4.set_active(True)
946
 
                cb5 = gtk.CheckButton(_('Keep below'))
947
 
                cb6 = gtk.CheckButton(_('Show buttons'))
948
 
                ini = utils.IniReader()
949
 
                if ini.load (DIR_USER + '/config.ini'):
950
 
                                
951
 
                        if ini.get_option('Lock', section='Options') == 'True':
952
 
                                cb1.set_active(True)
953
 
                        elif ini.get_option('Lock', section='Options') == 'False':
954
 
                                cb1.set_active(False)
955
 
                        if ini.get_option('Sticky', section='Options') == 'True':
956
 
                                cb2.set_active(True)
957
 
                        elif ini.get_option('Sticky', section='Options') == 'False':
958
 
                                cb2.set_active(False)
959
 
                        if ini.get_option('Widget', section='Options') == 'True':
960
 
                                cb3.set_active(True)
961
 
                        elif ini.get_option('Widget', section='Options') == 'False':
962
 
                                cb3.set_active(False)
963
 
                        if ini.get_option('Keep_above', section='Options') == 'True':
964
 
                                cb4.set_active(True)
965
 
                        elif ini.get_option('Keep_above', section='Options') == 'False':
966
 
                                cb4.set_active(False)
967
 
                        else:
968
 
                                cb4.set_active(True)
969
 
                        if ini.get_option('Keep_below', section='Options') == 'True':
970
 
                                cb5.set_active(True)
971
 
                        elif ini.get_option('Keep_below', section='Options') == 'False':
972
 
                                cb5.set_active(False)
973
 
                        if ini.get_option('draw_buttons', section='Options') == 'True':
974
 
                                cb6.set_active(True)
975
 
                        elif ini.get_option('draw_buttons', section='Options') == 'False':
976
 
                                cb6.set_active(False)
977
 
                        else:
978
 
                                cb6.set_active(True)                                    
979
 
                dialog = gtk.Dialog(_("New Screenlets atributes"),
980
 
                    self.window,
981
 
                    gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
982
 
                    (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
983
 
                     gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
984
 
                label.show()
985
 
                cb1.show()
986
 
                cb2.show()
987
 
                cb3.show()
988
 
                cb4.show()
989
 
                cb5.show()
990
 
                cb6.show()
991
 
                dialog.vbox.add(label)
992
 
                dialog.vbox.add(cb1)
993
 
                dialog.vbox.add(cb2)
994
 
                dialog.vbox.add(cb3)
995
 
                dialog.vbox.add(cb4)
996
 
                dialog.vbox.add(cb5)
997
 
                dialog.vbox.add(cb6)                            
998
 
                
999
 
                resp = dialog.run()
1000
 
                ret = None
1001
 
                if resp == gtk.RESPONSE_ACCEPT:
1002
 
                        
1003
 
                        ret = 'show_in_tray=' + str(self.cb_tray.get_active()) + '\n'
1004
 
                        ret = ret + 'Lock=' + str(cb1.get_active()) + '\n'
1005
 
                        ret = ret + 'Sticky=' + str(cb2.get_active()) + '\n'
1006
 
                        ret = ret + 'Widget=' + str(cb3.get_active()) + '\n'
1007
 
                        ret = ret + 'Keep_above=' + str(cb4.get_active()) + '\n'
1008
 
                        ret = ret + 'Keep_below=' + str(cb5.get_active()) + '\n'
1009
 
                        ret = ret + 'draw_buttons=' + str(cb6.get_active()) + '\n'      
1010
 
                        f = open(DIR_USER + '/config.ini', 'w')
1011
 
                        f.write("[Options]\n")
1012
 
                        f.write(ret)
1013
 
                        f.close()
1014
 
                dialog.destroy()
1015
 
 
1016
 
        def show_webapp(self):
1017
 
                label1 = gtk.Label(_('Web Application Url'))
1018
 
                label2 = gtk.Label(_('Web Application Name'))
1019
 
                code = gtk.Entry()
1020
 
                name = gtk.Entry()
1021
 
                h = gtk.HBox()
1022
 
                h1 = gtk.HBox() 
1023
 
                h.pack_start(label1,False,False)
1024
 
                h.pack_start(code,True,True)
1025
 
                h1.pack_start(label2,False,False)
1026
 
                h1.pack_start(name,True,True)
1027
 
                dialog = gtk.Dialog(_("Install Web Application"),self.window,
1028
 
                     gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
1029
 
                     (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
1030
 
                      gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
1031
 
                label1.show()
1032
 
                label2.show()
1033
 
                code.show()
1034
 
                name.show()
1035
 
                h.show()
1036
 
                h1.show()
1037
 
                dialog.vbox.pack_start(h,False,False,5)
1038
 
                dialog.vbox.pack_start(h1,False,False,5)
1039
 
                                
1040
 
                        
1041
 
                resp = dialog.run()
1042
 
                ret = None
1043
 
                if resp == gtk.RESPONSE_ACCEPT:
1044
 
                        if code.get_text() != '':
1045
 
                                if name.get_text() != '':
1046
 
                                        try:
1047
 
                                                a = name.get_text()
1048
 
                                                a = a.replace(' ','')
1049
 
                                                if os.path.isdir(DIR_USER + '/' + a):#found_path != None:
1050
 
                                                        if screenlets.show_question(None,(_("There is already a screenlet with that name installed\nDo you wish to continue?") )):
1051
 
                                                                pass
1052
 
                                                        else: 
1053
 
                                                                return False
1054
 
                                                os.system('mkdir ' +DIR_USER + '/' + a)
1055
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/themes')
1056
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/themes/default')
1057
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/mozilla')
1058
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/WebappScreenlet.py ' +DIR_USER + '/' + a + '/' + a + 'Screenlet.py')
1059
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/webapp.png ' +DIR_USER + '/' + a + '/icon.png')                                
1060
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/webapp.png ' +DIR_USER + '/' + a + '/themes/default')
1061
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/prefs.js ' +DIR_USER + '/' + a + '/mozilla')                   
1062
 
                
1063
 
                                                enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','r')
1064
 
                                                enginesave = enginecopy.read()
1065
 
                                                enginesave = enginesave.replace('WebappScreenlet',a + 'Screenlet')
1066
 
                                                enginesave = enginesave.replace("url = 'myurl'","url = " + chr(34) + code.get_text() + chr(34))
1067
 
                                                enginecopy.close()
1068
 
                                                enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','w')
1069
 
                                                enginecopy.write(enginesave)
1070
 
                                                enginecopy.close()
1071
 
                                                screenlets.show_message (None,_("Web Application was successfully installed"))
1072
 
                                                self.model.clear()
1073
 
                                                self.load_screenlets()                  
1074
 
                                        except: screenlets.show_error(None,_("Error installing!!!"))
1075
 
                                else:   screenlets.show_error(None,_("Please specify a name for the widget"))
1076
 
                        else:   screenlets.show_error(None,_("No HTML code found"))
1077
 
                dialog.destroy()
1078
 
 
1079
 
        def show_widget_converter(self):
1080
 
                label1 = gtk.Label(_('Convert any webpage widget into a Screenlet.'))
1081
 
                label2 = gtk.Label(_('Step 1 : Find the widget you want to convert'))
1082
 
                label3 = gtk.Label(_('Step 2 : Copy and Paste the HTML from the widget in the box below'))
1083
 
                label4 = gtk.Label(_('Step 3 : Give it a name in the box below and click on Ok to convert'))
1084
 
                label5 = gtk.Label(_('The name of the widget'))
1085
 
                code = gtk.Entry()
1086
 
                name = gtk.Entry()
1087
 
                h = gtk.HBox()
1088
 
                h1 = gtk.HBox()
1089
 
                self.combo1 = combo = gtk.combo_box_new_text()
1090
 
                combo.append_text('Google Gadgets')
1091
 
                combo.append_text('Yourminis Widgets')
1092
 
                combo.append_text('SpringWidgets')
1093
 
                combo.append_text('Widgetbox')
1094
 
                combo.set_active(0)
1095
 
                web = gtk.Button('Go to web page')
1096
 
                web.connect('clicked', self.button_clicked, 'widgetsite')
1097
 
                label1.show()
1098
 
                label2.show()
1099
 
                label3.show()
1100
 
                label4.show()
1101
 
                label5.show()
1102
 
                combo.show()
1103
 
                name.show()
1104
 
                web.show()
1105
 
                h.show()
1106
 
                h1.show()
1107
 
                code.show()
1108
 
                dialog = gtk.Dialog(_("Widget converter"),
1109
 
                    self.window,
1110
 
                    gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
1111
 
                    (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
1112
 
                     gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
1113
 
                #dialog.set_size_request(300, 500)
1114
 
                dialog.vbox.pack_start(label1,False,False,20)
1115
 
                dialog.vbox.pack_start(label2,True,False,5)
1116
 
                h.pack_start(combo,True,True,5)
1117
 
                h.pack_start(web,False,False,5)
1118
 
                dialog.vbox.pack_start(h,False,False,5)
1119
 
                dialog.vbox.pack_start(label3,False,False,10)
1120
 
                dialog.vbox.pack_start(code,False,False,5)
1121
 
                dialog.vbox.pack_start(label4,False,False,5)
1122
 
                h1.pack_start(label5,False,False,5)                     
1123
 
                h1.pack_start(name,True,True,5)
1124
 
                dialog.vbox.pack_start(h1,False,False,5)
1125
 
                resp = dialog.run()
1126
 
                ret = None
1127
 
                if resp == gtk.RESPONSE_ACCEPT:
1128
 
                        if code.get_text() != '':
1129
 
                                if name.get_text() != '':
1130
 
                                        try:
1131
 
                                                a = name.get_text()
1132
 
                                                a = a.replace(' ','')
1133
 
                                                if os.path.isdir(DIR_USER + '/' + a):#found_path != None:
1134
 
                                                        if screenlets.show_question(None,(_("There is already a screenlet with that name installed\nDo you wish to continue?") )):
1135
 
                                                                pass
1136
 
                                                        else: 
1137
 
                                                                return False
1138
 
                                                os.system('mkdir ' +DIR_USER + '/' + a)
1139
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/themes')
1140
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/themes/default')
1141
 
                                                os.system('mkdir ' +DIR_USER + '/' + a + '/mozilla')
1142
 
                                                f = open(DIR_USER + '/' + a  + '/' + 'index.html' , 'w')
1143
 
                                                f.write(code.get_text())
1144
 
                                                f.close()
1145
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/WidgetScreenlet.py ' +DIR_USER + '/' + a + '/' + a + 'Screenlet.py')
1146
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/widget.png ' +DIR_USER + '/' + a + '/icon.png')                                
1147
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/widget.png ' +DIR_USER + '/' + a + '/themes/default')
1148
 
                                                os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/prefs.js ' +DIR_USER + '/' + a + '/mozilla')                   
1149
 
                                                enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','r')
1150
 
                                                enginesave = enginecopy.read()
1151
 
                                                enginesave = enginesave.replace('WidgetScreenlet',a + 'Screenlet')
1152
 
                                                enginecopy.close()
1153
 
                                                enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','w')
1154
 
                                                enginecopy.write(enginesave)
1155
 
                                                enginecopy.close()
1156
 
                                                screenlets.show_message (None,_("Widget was successfully converted"))
1157
 
                                                self.model.clear()
1158
 
                                                self.load_screenlets()                  
1159
 
                                        except: screenlets.show_error(None,_("Error converting!!!"))
1160
 
                                else:   screenlets.show_error(None,_("Please specify a name for the widget"))           
1161
 
                        else:   screenlets.show_error(None,_("No HTML code found"))                     
1162
 
                dialog.destroy()
1163
 
 
1164
 
        def handle_screenlet_registered (self, name):
1165
 
                """Callback for dbus-signal, called when a new screenlet gets 
1166
 
                registered within the daemon."""
1167
 
                print "REGISTER screenlet: " + name
1168
 
                self.set_screenlet_active(name, True)
1169
 
                
1170
 
        def handle_screenlet_unregistered (self, name):
1171
 
                """Callback for dbus-signal, called when a screenlet gets 
1172
 
                unregistered within the daemon."""
1173
 
                print "UNREGISTER screenlet: " + name
1174
 
                self.set_screenlet_active(name, False)
1175
 
                
1176
 
        def selection_changed (self, iconview):
1177
 
                """Callback for handling selection changes in the IconView."""
1178
 
                self.slwindow.set_size_request(560, 300)
1179
 
                info = self.get_selection()
1180
 
                if info:
1181
 
                        
1182
 
                        self.set_info(info)
1183
 
                        self.label.set_line_wrap(1)
1184
 
                        a = info.name + ' ' + info.version+' by ' + info.author + '\n' + info.info
1185
 
                        a = a[:200]
1186
 
                        self.label.set_label(a + '...')
1187
 
 
1188
 
                        self.button_add.set_sensitive(True)
1189
 
                        self.button_reset.set_sensitive(True)
1190
 
                        self.button_theme.set_sensitive(True)
1191
 
#                       self.button_restartall.set_sensitive(True)
1192
 
#                       self.button_closeall.set_sensitive(True)
1193
 
                        if not info.system:
1194
 
                                self.button_delete.set_sensitive(True)
1195
 
                        else:
1196
 
                                self.button_delete.set_sensitive(False)
1197
 
                        self.button_shortcut.set_sensitive(True)
1198
 
                else:
1199
 
                        # nothing selected? 
1200
 
                        self.label.set_label('')
1201
 
                        self.cb_enable_disable.set_sensitive(False)
1202
 
                        self.cb_autostart.set_sensitive(False)
1203
 
                        self.button_add.set_sensitive(False)
1204
 
                        self.button_delete.set_sensitive(False)
1205
 
                        self.button_reset.set_sensitive(False)
1206
 
                        self.button_theme.set_sensitive(False)  
1207
 
                        self.button_shortcut.set_sensitive(False)
1208
 
#                       self.button_restartall.set_sensitive(False)
1209
 
#                       self.button_closeall.set_sensitive(False)
1210
 
                        self.label_info.set_text('')
1211
 
        
1212
 
        def item_activated (self, iconview, item):
1213
 
                """Callback for handling doubleclick/ENTER in the IconView."""
1214
 
                info = self.get_selection()
1215
 
                if info:
1216
 
                        # launch/add screenlet
1217
 
                        screenlets.launch_screenlet(info.name)
1218
 
                        
1219
 
        
1220
 
        def toggle_enabled (self, widget):
1221
 
                """Callback for handling changes to the Enable/Disable CheckButton."""
1222
 
                
1223
 
                info = self.get_selection()
1224
 
                if info:
1225
 
                        info.active = not info.active
1226
 
                        if info.active:
1227
 
                                # launch screenlet
1228
 
                                print "Launch %s" % info.name
1229
 
                                screenlets.launch_screenlet(info.name, debug=screenlets.DEBUG_MODE)
1230
 
                                
1231
 
                        else:
1232
 
                                # quit screenlet
1233
 
                                utils.quit_screenlet_by_name(info.name)
1234
 
                                print "Quit %s" % info.name
1235
 
                                self.model.clear()
1236
 
                                self.load_screenlets()
1237
 
 
1238
 
        def toggle_autostart (self, widget):
1239
 
                """Callback for handling changes to the Autostart-CheckButton."""
1240
 
                info = self.get_selection()
1241
 
                if info:
1242
 
                        info.autostart = not info.autostart
1243
 
                        if info.autostart:
1244
 
                                if not utils.create_autostarter(info.name):
1245
 
                                        widget.set_active(False)
1246
 
                                        widget.set_sensitive(False)
1247
 
                        else:
1248
 
                                utils.delete_autostarter(info.name)
1249
 
 
1250
 
        def toggle_tray (self, widget):
1251
 
                """Callback for handling changes to the tray-CheckButton."""
1252
 
                ini = utils.IniReader()
1253
 
                if ini.load (DIR_USER + '/config.ini'):
1254
 
                        r = ''
1255
 
                        if ini.get_option('Lock', section='Options') != None:
1256
 
                                r = r +  'Lock=' + str(ini.get_option('Lock', section='Options')) + '\n'
1257
 
                                
1258
 
                        if ini.get_option('Sticky', section='Options') != None:
1259
 
                                r = r +  'Sticky=' + str(ini.get_option('Sticky', section='Options')) + '\n'
1260
 
                                
1261
 
                        if ini.get_option('Widget', section='Options') != None:
1262
 
                                r = r +  'Sticky=' + str(ini.get_option('Sticky', section='Options')) + '\n'
1263
 
                                
1264
 
                        if ini.get_option('Keep_above', section='Options') != None:
1265
 
                                r = r +  'Keep_above=' + str(ini.get_option('Keep_above', section='Options')) + '\n'
1266
 
                
1267
 
                        if ini.get_option('Keep_below', section='Options') != None:
1268
 
                                r = r +  'Keep_below=' + str(ini.get_option('Keep_below', section='Options')) + '\n'
1269
 
 
1270
 
                        if ini.get_option('draw_buttons', section='Options') != None:
1271
 
                                r = r +  'draw_buttons=' + str(ini.get_option('draw_buttons', section='Options')) + '\n'
1272
 
 
1273
 
                f = open(DIR_USER + '/config.ini', 'w')
1274
 
                DIR_USER + '/config.ini'
1275
 
                f.write("[Options]\n")
1276
 
                f.write("show_in_tray="+str(widget.get_active())+"\n")
1277
 
                f.write(r)
1278
 
                f.close()
1279
 
                os.system('pkill -f screenlets-daemon.py') #restart the daemon
1280
 
                os.system(screenlets.INSTALL_PREFIX + \
1281
 
                                '/share/screenlets-manager/screenlets-daemon.py &')
1282
 
                screenlets.show_message(None, _('Screenlets-Manager must now be restarted'))
1283
 
                try:
1284
 
                        os.system('screenlets-manager &')       
1285
 
                except:
1286
 
                        pass
1287
 
                self.delete_event(self.window, None)            
1288
 
                                
1289
 
        def delete_event (self, widget, event):
1290
 
 
1291
 
                gtk.widget_pop_colormap()
1292
 
                gtk.main_quit()
1293
 
                print "Quit!"
1294
 
        
1295
 
        # start the app
1296
 
        
1297
 
        def start (self):
1298
 
                gtk.main()
1299
 
                
1300
 
import os
1301
 
proc = os.popen("""ps axo "%p,%a" | grep "python.*screenlets-manager.py" | grep -v grep|cut -d',' -f1""").read()
1302
 
procs = proc.split('\n')
1303
 
import sys
1304
 
import wnck
1305
 
try:
1306
 
        wnck.set_client_type(wnck.CLIENT_TYPE_PAGER)
1307
 
except AttributeError:
1308
 
        print "Error: Failed to set libwnck client type, window " \
1309
 
                                "activation may not work"
1310
 
if len(procs) > 2:
1311
 
        print "Manager already started"
1312
 
        screen = wnck.screen_get_default()
1313
 
        while gtk.events_pending():
1314
 
                gtk.main_iteration()
1315
 
        wins = screen.get_windows_stacked()
1316
 
        
1317
 
        for win in wins:
1318
 
                name = win.get_name()
1319
 
                if name == gettext.gettext('Screenlets Manager'):
1320
 
 
1321
 
                        if win and win.is_active():
1322
 
                                sys.exit(1)
1323
 
                        elif win and win.is_minimized():
1324
 
                                win.unminimize(1)
1325
 
                        elif win and win.is_active() == False:
1326
 
                                win.activate(1)
1327
 
 
1328
 
 
1329
 
        sys.exit(1)
1330
 
 
1331
 
 
1332
 
app = ScreenletsManager()
1333
 
app.start()