#!/usr/bin/env python

"""
Garp: Gtk Add/Remove Printer Utility

Version: v1.0
Release Date: Aug 1, 2006
Author: val314159@gmail.com

TODO:  
       No menus
       No input validation
       Uses ugly dialog boxes everywhere
"""

import pygtk;pygtk.require('2.0');import gtk
import gobject

import subprocess as sub

LpDriver = ''
Printer = ''


def macro_set_func_textX(tree_column, cell, model, iter, colnum):
    cell.set_property("text", model.get_value(iter, colnum))

def insert_text_column(tv, name, colnum):
        tv.insert_column_with_data_func(-1, name,
		gtk.CellRendererText(), macro_set_func_textX, colnum)


def add_row_data(store, data):
	iter = store.append()
	i = 0
	for a in data:
		store.set(iter, i, a)
		i = i+1



class AddPrinterTab:
    def add_printer(self, widget):
	global LpDriver

	cmd_arr = ['lpadmin', 
		'-p', self.entry1.get_text(),
		'-m', LpDriver,
		'-v', self.entry2.get_text(),
		'-E']

#	print(cmd_arr)

#	print "="*20
	p1 = sub.Popen(cmd_arr, stderr=sub.PIPE)
#	print "="*20

	err = p1.stderr.readlines()
	if err:  mk_dialog(''.join(err))
	else:    mk_dialog("Printer successfully added.")

	self.refresh_printer_list()

    def __init__(self):
        self.box1 = gtk.HBox(False, 0)
        self.box1.show()

	self.top = self.box1

        self.box2 = gtk.VBox(False, 0)
        self.box1.pack_start(self.box2, False, False, 0)
        self.box2.show()

        self.box3 = gtk.VBox(False, 0)
        self.box1.pack_start(self.box3, False, False, 0)
        self.box3.show()



        self.button1 = gtk.Button("Add Printer")
        self.button1.connect("clicked", self.add_printer)
        self.box3.pack_end(self.button1, False, False, 0)
        self.button1.show()


        self.label1 = gtk.Label()
        self.box3.pack_start(self.label1, False, False, 0)
        self.label1.set_text("Printer Name:")
        self.label1.show()

        self.entry1 = gtk.Entry()
        self.box3.pack_start(self.entry1, False, False, 0)
        self.entry1.show()


        sep = gtk.HSeparator()
        self.box3.pack_start(sep, False, False, 0)
        sep.show()


        self.label2 = gtk.Label()
        self.box3.pack_start(self.label2, False, False, 0)
        self.label2.set_text("URI:")
        self.label2.show()

        self.entry2 = gtk.Entry()
        self.box3.pack_start(self.entry2, False, False, 0)
        self.entry2.show()



        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.box3.pack_start(sw, True, True, 10)
	sw.show()


	self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
	self.poplist1()

	self.treeview = gtk.TreeView(self.store)
        sw.add(self.treeview)
	self.treeview.show()

	insert_text_column(self.treeview, "Type", 0)
	insert_text_column(self.treeview, "URI", 1)

        selection = self.treeview.get_selection()
        selection.set_mode(gtk.SELECTION_SINGLE)
        selection.connect("changed", self.on_selection_changed)



        sw2 = gtk.ScrolledWindow()
        sw2.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw2.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.box1.pack_start(sw2, False, False, 0)
	sw2.show()


	self.store2 = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
	self.poplist2()

	self.treeview2 = gtk.TreeView(self.store2)
        sw2.add(self.treeview2)
	self.treeview2.show()

#	insert_text_column("Name", 0)
	insert_text_column(self.treeview2, "Driver", 1)


        selection = self.treeview2.get_selection()
        selection.set_mode(gtk.SELECTION_SINGLE)
        selection.connect("changed", self.on_selection_changed2)


    def poplist1(self):
	self.store.clear()
	getlpvinfo()
	for s in Lpv:
		add_row_data(self.store, s[:-1].split(' ',1))

    def poplist2(self):
	self.store2.clear()
	for s in Lpm:
		add_row_data(self.store2, s[:-1].split(' ',1))


    def on_selection_changed(self, selection):
	global LpURI
        model, iter = selection.get_selected()
        if iter:
		info = model.get_value(iter, 1)
#		print info
		self.entry2.set_text(info)
        else:
#		print "No selected item"
		self.entry2.set_text('')

    def on_selection_changed2(self, selection):
	global LpDriver
        model, iter = selection.get_selected()
        if iter:
		info = model.get_value(iter, 0)
		LpDriver = info
#		print "2", info
        else:
		LpDriver = ''
#		print "2 No selected item"


def mk_dialog(msg):
	dialog = gtk.Dialog()
	label = gtk.Label(msg)
	dialog.vbox.pack_start(label, True, True, 0)
	label.show()
	dialog.show()


class DelPrinterTab:

    def refresh(self, widget):
	self.poplist3()

    def del_printer(self, widget, data):
	global Printer
#        print "lpadmin -x %s" % Printer
#	print(['lpadmin', '-x', Printer])
#	print "="*20
	p1 = sub.Popen(['lpadmin', '-x', Printer], stderr=sub.PIPE)
#	print "="*20

	err = p1.stderr.readlines()
	if err:  mk_dialog(''.join(err))
	else:    mk_dialog("Printer successfully deleted.")

	self.poplist3()



    def __init__(self):
        self.box10 = gtk.HBox(False, 0)
        self.box10.show()

	self.top = self.box10

        self.box20 = gtk.VBox(False, 0)
        self.box10.pack_start(self.box20, False, False, 0)
        self.box20.show()

        self.button21 = gtk.Button("Refresh Printer List")
        self.button21.connect("clicked", self.refresh)
        self.box20.pack_end(self.button21, False, False, 0)
	self.button21.show()


        self.button20 = gtk.Button("Remove Printer")
        self.button20.connect("clicked", self.del_printer, "button 2")
        self.box20.pack_end(self.button20, False, False, 0)
	self.button20.show()


        sw2 = gtk.ScrolledWindow()
        sw2.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw2.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        self.box10.pack_start(sw2, False, False, 0)
	sw2.show()

	self.store3 = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
	self.poplist3()

	self.treeview3 = gtk.TreeView(self.store3)
        sw2.add(self.treeview3)
	self.treeview3.show()

#	insert_text_column("Name", 0)
	insert_text_column(self.treeview3, "Printer", 1)

	selection = self.treeview3.get_selection()
	selection.set_mode(gtk.SELECTION_SINGLE)
	selection.connect("changed", self.on_selection_changed3)

    def poplist3(self):
	self.store3.clear()
	getlppinfo()
	for s in LpP:
		data = s.split(' ',2)[:-1]
		if data  and  data[0] == 'printer':
			add_row_data(self.store3, data)

    def on_selection_changed3(self, selection):
	global Printer
        model, iter = selection.get_selected()
        if iter:
		info = model.get_value(iter, 1)
		Printer = info
		print "DEL", info
#		self.entry2.set_text(info)
        else:
		print "DEL No selected item"
		Printer = ''
#		self.entry2.set_text('')




class RootWindow:
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("Add/Remove Printer(s)")
        self.window.connect("delete_event", self.delete_event)
        self.window.set_border_width(10)
        self.populate_window()
        self.window.show()

    def populate_window(self):
	self.notebook = gtk.Notebook()
	self.notebook.show()
        self.window.add(self.notebook)

	self.add_tab = self.addtab( AddPrinterTab(), "Add Printer" )
	self.del_tab = self.addtab( DelPrinterTab(), "Remove Printer" )

	self.add_tab.refresh_printer_list = self.del_tab.poplist3

    def addtab(self, tab, text):
	self.notebook.append_page(tab.top, gtk.Label(text))
	return tab


def getlpvinfo():
    global Lpv
    p1 = sub.Popen(['lpinfo', '-v'], stdout=sub.PIPE)
    Lpv = p1.stdout.readlines()

def getlpminfo():
    global Lpm
    p2 = sub.Popen(['lpinfo', '-m'], stdout=sub.PIPE)
    Lpm = p2.stdout.readlines()

def getlppinfo():
    global LpP
    p2 = sub.Popen(['lpstat', '-p'], stdout=sub.PIPE)
    LpP = p2.stdout.readlines()

def main():
    getlpminfo()
    getlpvinfo()
    hello = RootWindow()
    gtk.main()

if __name__ == "__main__": main()