#!/usr/bin/env python
# USP Websites Plugin Version 1.0
##Description:Firefox/Mozilla Bookmarks
try:
import pygtk
pygtk.require( "2.0" )
except:
pass
import gtk
import gtk.glade
import sys
import os
import gobject
import gconf
import pango
from easyfiles import *
from easybuttons import *
from execute import *
from easygconf import *
class TreeViewTooltips:
def __init__(self):
# create the window
self.window = window = gtk.Window(gtk.WINDOW_POPUP)
window.set_name('gtk-tooltips')
window.set_resizable(False)
window.set_border_width(4)
window.set_app_paintable(True)
window.connect("expose-event", self.__on_expose_event)
# create the label
self.label = label = gtk.Label()
label.set_line_wrap(True)
label.set_alignment(0.5, 0.5)
label.set_use_markup(False)
label.show()
window.add(label)
# by default, the tooltip is enabled
self.__enabled = True
# saves the current cell
self.__save = None
# the timer id for the next tooltip to be shown
self.__next = None
# flag on whether the tooltip window is shown
self.__shown = False
def enable(self):
self.__enabled = True
def disable(self):
self.__enabled = False
def __show(self, tooltip, x, y):
window = self.window
# set label
self.label.set_label(tooltip)
# resize window
w, h = window.size_request()
# move the window
window.move(*self.location(x,y,w,h))
# show it
window.show()
self.__shown = True
def __hide(self):
'hide the tooltip'
self.__queue_next()
self.window.hide()
self.__shown = False
def __leave_handler(self, view, event):
'when the pointer leaves the view, hide the tooltip'
self.__hide()
def __motion_handler(self, view, event):
'As the pointer moves across the view, show a tooltip.'
path = view.get_path_at_pos(int(event.x), int(event.y))
if self.__enabled and path:
path, col, x, y = path
tooltip = self.get_tooltip(view, col, path)
if tooltip is not None:
tooltip = str(tooltip).strip()
if tooltip:
self.__queue_next((path, col), tooltip,
int(event.x_root),
int(event.y_root))
return
self.__hide()
def __queue_next(self, *args):
'queue next request to show a tooltip'
# if args is non-empty it means a request was made to show a
# tooltip. if empty, no request is being made, but any
# pending requests should be cancelled anyway.
cell = None
# if called with args, break them out
if args:
cell, tooltip, x, y = args
# if it's the same cell as previously shown, just return
if self.__save == cell:
return
# if we have something queued up, cancel it
if self.__next:
gobject.source_remove(self.__next)
self.__next = None
if cell:
# if the tooltip is already shown, show the new one
# immediately
if self.__shown:
self.__show(tooltip, x, y)
# else queue it up in 1/10 second
else:
self.__next = gobject.timeout_add(100, self.__show,
tooltip, x, y)
# save this cell
self.__save = cell
def __on_expose_event(self, window, event):
w, h = window.size_request()
window.style.paint_flat_box(window.window, gtk.STATE_NORMAL,gtk.SHADOW_OUT, None, window,'tooltip', 0, 0, w, h)
def location(self, x, y, w, h):
return x - w/2, y + 4
def add_view(self, view):
assert isinstance(view, gtk.TreeView), \
('This handler should only be connected to '
'instances of gtk.TreeView')
view.connect("motion-notify-event", self.__motion_handler)
view.connect("leave-notify-event", self.__leave_handler)
class WebTips(TreeViewTooltips):
def __init__(self, column):
self.col = column
TreeViewTooltips.__init__(self)
def get_tooltip(self, view, column, path):
if column is self.col:
model = view.get_model()
tiptoshow = model[path][1]
return '%s' % tiptoshow
class pluginclass:
TARGET_TYPE_TEXT = 80
toButton = [ ( "text/uri-list", 0, TARGET_TYPE_TEXT ) ]
"""This is the main class for the plugin"""
"""It MUST be named pluginclass"""
def __init__(self, USPWin):
self.USPWin = USPWin
#The Glade file for the plugin
self.gladefile = os.path.join(os.path.dirname(__file__), "internet.glade")
#Read GLADE file
self.wTree = gtk.glade.XML(self.gladefile,"window1")
#These properties are NECESSARY to maintain consistency
#throughout USP
#Set 'window' property for the plugin (Must be the root widget)
self.window = self.wTree.get_widget("window1")
#Set 'heading' property for plugin
self.heading = "Internet"
#This should be the first item added to the window in glade
self.content_holder = self.wTree.get_widget("eventbox1")
# Items in the Glade file to get custom colors, store in an array
self.itemstocolor = [self.wTree.get_widget('vbox1'),self.wTree.get_widget('scrolledwindow1'),self.wTree.get_widget('viewport1'),self.wTree.get_widget('BookmarksList')]
#Specify plugin width
self.width = 250
#Plugin icon
self.icon = 'mozilla-firefox.png'
# GConf stuff notify_add will call RegenPlugin if one of the listed gconf entries is changed.
self.gconf_dir = '/apps/usp/plugins/internet'
self.client = gconf.client_get_default()
self.client.add_dir('/apps/usp/plugins/internet', gconf.CLIENT_PRELOAD_NONE)
self.client.notify_add('/apps/usp/plugins/internet/sticky',self.RegenPlugin)
self.client.notify_add('/apps/usp/plugins/internet/icon',self.RegenPlugin)
self.client.notify_add('/apps/usp/plugins/internet/bookmark_file',self.RegenPlugin)
self.client.notify_add('/apps/usp/plugins/internet/height',self.RegenPlugin)
self.client.notify_add('/apps/usp/plugins/internet/width',self.RegenPlugin)
self.client.notify_add('/apps/usp/plugins/internet/internet_font_size',self.RegenPlugin)
#self.client.notify_add('/apps/usp/plugins/internet/back_color',self.RegenPlugin)
#self.client.notify_add('/apps/usp/plugins/internet/font_color',self.RegenPlugin)
#self.client.notify_add('/apps/usp/custom_color',self.RegenPlugin)
self.FileList=[]
self.RegenPlugin()
self.wTree.get_widget("window1").set_size_request(self.height,self.width)
#Connect event handlers
dic = { "on_window1_destroy" : gtk.main_quit,
"on_BookmarksList_row_activated" : self.callback}
self.wTree.signal_autoconnect(dic)
def RegenPlugin(self, *args, **kargs):
self.GetGconfEntries()
self.DoWeb()
self.tips = WebTips(self.column)
self.tips.add_view(self.wTree.get_widget("BookmarksList"))
self.width=self.webw
def GetGconfEntries(self):
# Get USP required GConf entries------------------#
self.client = gconf.client_get_default()
self.height = SetGconf(self.client,'int','/apps/usp/plugins/internet/height',200)
self.width = SetGconf(self.client,'int','/apps/usp/plugins/internet/width',250)
# Allow plugin to be minimized to the left plugin pane
self.minimized = SetGconf( self.client, "bool", "/apps/usp/plugins/internet/minimized", False )
self.sticky = SetGconf( self.client, "bool", "/apps/usp/plugins/internet/sticky", False )
# Icon for the plugin
self.icon = SetGconf( self.client, "string", '/apps/usp/plugins/internet/icon', "mozilla-firefox.png" )
# End of USP required GConf entries---------------#
self.bookfile = SetGconf(self.client,'string','/apps/usp/plugins/internet/bookmark_file',"")
self.webh = self.height-10
self.webw = self.width-10
self.webfontsize = SetGconf(self.client,'int','/apps/usp/plugins/internet/internet_font_size', 9)
#self.backcolor = SetGconf(self.client,'string','/apps/usp/plugins/internet/back_color',"#d4d4d4")
#self.fontcolor = SetGconf(self.client,'string','/apps/usp/plugins/internet/font_color',"#000000")
#self.customcolor = SetGconf(self.client,'string','/apps/usp/custom_color',"#d4d4d4")
def SetHidden( self, state ):
if state == True:
WriteGconf( self.client, "bool", "/apps/usp/plugins/internet/minimized", True )
else:
WriteGconf( self.client, "bool", "/apps/usp/plugins/internet/minimized", False )
def DoWeb(self, *args, **kargs):
self.renderer = gtk.CellRendererText()
#self.renderer.set_property("cell-background",self.backcolor)
self.renderer.set_property("size",self.webfontsize*1000)
#self.renderer.set_property("foreground",self.fontcolor)
self.column = gtk.TreeViewColumn("Bookmarks")
self.treestore = gtk.TreeStore(str,str,str)
#Need to remove old column before new one if this is regenerated or we get multiple columns.
if len(self.wTree.get_widget("BookmarksList").get_columns()) > 0:
self.wTree.get_widget("BookmarksList").remove_column(self.wTree.get_widget("BookmarksList").get_column(0))
self.wTree.get_widget("BookmarksList").append_column(self.column)
self.column.pack_start(self.renderer, True)
self.column.add_attribute(self.renderer, 'text', 0)
n=len(self.wTree.get_widget("BookmarksList").get_children())-1
while n >= 0:
self.wTree.get_widget("BookmarksList").remove(self.wTree.get_widget("BookmarksList").get_children()[n])
n-=1
os.chdir(os.path.expanduser("~"))
self.FileList=self.GetWeb()
if self.USPWin.VERBOSE == True:
print "\nFileList\n-------------------"
for item in self.FileList:
print item[0]
self.wTree.get_widget("viewport1").set_size_request(self.webw,self.webh)
self.wTree.get_widget("BookmarksList").set_size_request(-1,-1)
#items=["eventbox1","vbox1","scrolledwindow1","viewport1","BookmarksList"]
#i=0
#while i < len(items):
# self.wTree.get_widget(items[i]).modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.customcolor))
# i+=1
self.wTree.get_widget("BookmarksList").set_model(self.treestore)
self.wTree.get_widget("BookmarksList").show()
return True
def callback(self, widget, *args,**kargs):
ItemInfo = self.treestore.get(widget.get_selection().get_selected()[1],0,1,2)
if ItemInfo[2]=='URL':
self.USPWin.wTree.get_widget("window1").hide()
os.system("gnome-open \""+ItemInfo[1]+"\" &")
print "Opening URL \""+ItemInfo[1]+"\""
self.wTree.get_widget("BookmarksList").collapse_all()
widget.get_selection().unselect_all()
def GetWeb(self, *args, **kargs):
os.chdir(os.path.expanduser("~"))
Error_Message=""
TempArray=[]
pathwordlen=len("Path=")
foldername=""
self.myiter=self.treestore.get_iter_root()
if self.bookfile == "":
try:
in_file = open(".mozilla/firefox/profiles.ini","r")
pathwordlen=len("Path=")
foldername=""
done=False
while not done:
FileLine=in_file.readline()
if FileLine == -1:
done=True
else:
if FileLine.find("Path=")!= -1:
foldername=FileLine[pathwordlen:-1]
done=True
in_file.close()
if foldername != "":
try:
in_file = open(".mozilla/firefox/"+foldername+"/bookmarks.html","r")
self.client.set_string("/apps/usp/plugins/internet/bookmark_file",os.path.expanduser("~")+"/.mozilla/firefox/"+foldername+"/bookmarks.html")
except:
Error_Message="bookmarks.html error"
pass
except:
Error_Message="profiles.ini error"
pass
else:
try:
in_file = open(self.bookfile,"r")
except:
Error_Message=self.bookfile+" error"
pass
if Error_Message == "":
ItemCount=0
done=False
TextLen = len('')
if IsSubMenu != -1:
Found=False
while Found == False:
FileLine=in_file.readline()
if FileLine == "":
done=True
break
StartPoint=FileLine.find("",StartPoint+1)
EndPoint=FileLine.find("
")
Paired=[FileLine[StartPoint+1:EndPoint],"["+FileLine[StartPoint+1:EndPoint]+"]",SubMenuName+"/"+FileLine[StartPoint+1:EndPoint],'FOLDER']
SubMenuName=SubMenuName+"/"+FileLine[StartPoint+1:EndPoint]
self.myiter = self.treestore.append(self.myiter, [Paired[1],Paired[0],Paired[2]])
ItemCount+=1
TempArray.append(Paired)
StartPoint=FileLine.find('',EndPoint)
DescEnd=FileLine.find('',DescStart)
Paired=[FileLine[StartPoint+TextLen:EndPoint],FileLine[DescStart+1:DescEnd],"URL",SubMenuName]
self.treestore.append(self.myiter, [Paired[1], Paired[0], Paired[2]])
#self.RecentTips.set_tip( self.myiter, Paired[1], tip_private=None )
ItemCount+=1
TempArray.append(Paired)
EndSubMenu=FileLine.find('')
if EndSubMenu != -1:
point = SubMenuName[:-1].rfind("/")
SubMenuName=SubMenuName[:point]
if self.myiter != None:
self.myiter=self.treestore.iter_parent(self.myiter)
in_file.close()
else:
print Error_Message
self.myiter=self.treestore.get_iter_root()
self.treestore.append(self.myiter,[Error_Message,Error_Message,Error_Message])
TempArray=[]
return TempArray
#---------------------------------------------------------------------------------------#
# USPconfig Section Below
#---------------------------------------------------------------------------------------#
# This is the Config Class it must be called "cfgpluginclass'
class cfgpluginclass:
def __init__(self):
# The Gladefile for the plugins USPconfig Tab
self.gladefile = os.path.join(os.path.dirname(__file__), "internet.glade")
# Read GLADE file
self.wTree = gtk.glade.XML(self.gladefile,"config")
# Set 'window' property for the plugin (Must be the root widget)
self.window = self.wTree.get_widget("config")
# Content Place Holder must be eventbox2
self.content_holder = self.wTree.get_widget("eventbox2")
# Set Heading, this will be used for the tab label in USPconfig
self.heading = "Internet"
# GConf Stuff - This just makes sure a gconf path is there.
self.gconf_dir = '/apps/usp/plugins/internet'
self.client = gconf.client_get_default()
self.client.add_dir('/apps/usp/plugins/internet', gconf.CLIENT_PRELOAD_NONE)
# Setup the Functions of the Glade files spin controls or entry boxes for Value Changes
# Tip: For spinbutton controls use the "_value_changed" event not the "_changed" event.
dic = { "on_window2_destroy" : gtk.main_quit,
"on_StickyChkBtn_toggled" : self.sticky,
"on_WebIconEntry_changed" : self.icon_changed,
"on_WebEntry_changed" : self.webentry,
"on_WebFontSpin_changed" : self.webfontspin,
"on_WebHSpin_changed" : self.webhspin,
"on_WebWSpin_changed" : self.webwspin}
self.wTree.signal_autoconnect(dic)
# Read Values from GConf for USPconfig Tab and Set Default Values in GConf if they don't exist.
self.wTree.get_widget("StickyChkBtn").set_active(SetGconf(self.client,'bool','/apps/usp/plugins/internet/sticky',False))
self.wTree.get_widget("WebIconEntry").set_text(SetGconf( self.client, "string", '/apps/usp/plugins/internet/icon', "computer.png"))
self.wTree.get_widget("WebEntry").set_text(SetGconf(self.client,'string','/apps/usp/plugins/internet/bookmark_file',''))
self.wTree.get_widget("WebFontSpin").set_value(SetGconf(self.client,'int','/apps/usp/plugins/internet/internet_font_size',9))
self.wTree.get_widget("WebWSpin").set_value(SetGconf(self.client,'int','/apps/usp/plugins/internet/width',200))
self.wTree.get_widget("WebHSpin").set_value(SetGconf(self.client,'int','/apps/usp/plugins/internet/height',200))
# Functions for Changing Values when items checked or altered.
def sticky(self, *args, **kargs):
if self.wTree.get_widget("StickyChkBtn").get_active() == True:
self.client.set_bool('/apps/usp/plugins/internet/sticky',True)
else:
self.client.set_bool('/apps/usp/plugins/internet/sticky',False)
def icon_changed(self, *args, **kargs):
self.client.set_string('/apps/usp/plugins/internet/icon',self.wTree.get_widget("WebIconEntry").get_text())
def webentry(self, widget, **kargs):
self.client.set_string('/apps/usp/plugins/internet/bookmark_file',self.wTree.get_widget("WebEntry").get_text())
def webfontspin(self, widget, **kargs):
self.client.set_int('/apps/usp/plugins/internet/internet_font_size',int(self.wTree.get_widget("WebFontSpin").get_value()))
def webhspin(self, widget, **kargs):
self.client.set_int('/apps/usp/plugins/internet/height',int(self.wTree.get_widget("WebHSpin").get_value()))
def webwspin(self, widget, **kargs):
self.client.set_int('/apps/usp/plugins/internet/width',int(self.wTree.get_widget("WebWSpin").get_value()))