| Server IP : 182.53.201.61 / Your IP : 216.73.217.175 Web Server : Apache/2.2.15 (Fedora) System : Linux km10.dyndns.org 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 User : apache ( 48) PHP Version : 5.3.3 Disable Function : NONE MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/share/system-config-printer/ |
Upload File : |
## system-config-printer
## Copyright (C) 2006, 2007, 2008, 2009 Red Hat, Inc.
## Copyright (C) 2006 Florian Festi <ffesti@redhat.com>
## Copyright (C) 2007, 2008, 2009 Tim Waugh <twaugh@redhat.com>
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
import gtk.glade, cups
from gettext import gettext as _
import ppdippstr
def OptionWidget(option, ppd, gui, tab_label=None):
"""Factory function"""
ui = option.ui
if (ui == cups.PPD_UI_BOOLEAN and
len (option.choices) != 2):
# This option is advertised as a Boolean but in fact has more
# than two choices.
print "Treating Boolean option %s as PickOne" % option.keyword
ui = cups.PPD_UI_PICKONE
if ui == cups.PPD_UI_BOOLEAN:
return OptionBool(option, ppd, gui, tab_label=tab_label)
elif ui == cups.PPD_UI_PICKONE:
return OptionPickOne(option, ppd, gui, tab_label=tab_label)
elif ui == cups.PPD_UI_PICKMANY:
return OptionPickMany(option, ppd, gui, tab_label=tab_label)
# ---------------------------------------------------------------------------
class Option:
def __init__(self, option, ppd, gui, tab_label=None):
self.option = option
self.ppd = ppd
self.gui = gui
self.enabled = True
self.tab_label = tab_label
vbox = gtk.VBox()
self.btnConflict = gtk.Button()
icon = gtk.image_new_from_stock(gtk.STOCK_DIALOG_WARNING,
gtk.ICON_SIZE_SMALL_TOOLBAR)
self.btnConflict.add(icon)
self.btnConflict.set_no_show_all(True) #avoid the button taking
# over control again
vbox.add(self.btnConflict) # vbox reserves space while button
#vbox.set_size_request(32, 28) # is hidden
self.conflictIcon = vbox
self.btnConflict.connect("clicked", self.on_btnConflict_clicked)
icon.show()
self.constraints = [c for c in ppd.constraints
if (c.option1 == option.keyword or
c.option2 == option.keyword)]
#for c in self.constraints:
# if not c.choice1 or not c.choice2:
# print c.option1, repr(c.choice1), c.option2, repr(c.choice2)
self.conflicts = set()
self.conflict_message = ""
def enable(self, enabled=True):
self.selector.set_sensitive (enabled)
self.enabled = enabled
def disable(self):
self.enable (False)
def is_enabled(self):
return self.enabled
def get_current_value(self):
raise NotImplemented
def is_changed(self):
return self.get_current_value()!= self.option.defchoice
def writeback(self):
#print repr(self.option.keyword), repr(self.get_current_value())
if self.enabled:
self.ppd.markOption(self.option.keyword, self.get_current_value())
def checkConflicts(self, update_others=True):
value = self.get_current_value()
for constraint in self.constraints:
if constraint.option1 == self.option.keyword:
option2 = self.gui.options.get(constraint.option2, None)
choice1 = constraint.choice1
choice2 = constraint.choice2
else:
option2 = self.gui.options.get(constraint.option1, None)
choice1 = constraint.choice2
choice2 = constraint.choice1
if option2 is None: continue
if (choice1==value and
option2.get_current_value() == choice2):
# conflict
self.conflicts.add(constraint)
if update_others:
option2.checkConflicts(update_others=False)
elif constraint in self.conflicts:
# remove conflict
self.conflicts.remove(constraint)
option2.checkConflicts(update_others=False)
tooltip = [_("Conflicts with:")]
for c in self.conflicts:
if c.option1 == self.option.keyword:
option = self.gui.options.get(c.option2)
else:
option = self.gui.options.get(c.option1)
tooltip.append(option.option.text)
tooltip = "\n".join(tooltip)
self.conflict_message = tooltip # XXX more verbose
if self.conflicts:
self.btnConflict.set_tooltip_text (tooltip)
self.btnConflict.show()
else:
self.btnConflict.hide()
self.gui.option_changed(self)
return self.conflicts
def on_change(self, widget):
self.checkConflicts()
def on_btnConflict_clicked(self, button):
parent = self.btnConflict
while parent != None and not isinstance (parent, gtk.Window):
parent = parent.get_parent ()
dialog = gtk.MessageDialog (parent,
gtk.DIALOG_DESTROY_WITH_PARENT |
gtk.DIALOG_MODAL,
gtk.MESSAGE_WARNING,
gtk.BUTTONS_CLOSE,
self.conflict_message)
dialog.run()
dialog.destroy()
# ---------------------------------------------------------------------------
class OptionBool(Option):
def __init__(self, option, ppd, gui, tab_label=None):
self.selector = gtk.CheckButton(ppdippstr.ppd.get (option.text))
self.label = None
self.false = u"False" # hack to allow "None" instead of "False"
self.true = u"True"
for c in option.choices:
if c["choice"] in ("None", "False", "Off"):
self.false = c["choice"]
if c["choice"] in ("True", "On"):
self.true = c["choice"]
self.selector.set_active(option.defchoice == self.true)
self.selector.set_alignment(0.0, 0.5)
self.selector.connect("toggled", self.on_change)
Option.__init__(self, option, ppd, gui, tab_label=tab_label)
def get_current_value(self):
return (self.false, self.true)[self.selector.get_active()]
# ---------------------------------------------------------------------------
class OptionPickOne(Option):
widget_name = "OptionPickOne"
def __init__(self, option, ppd, gui, tab_label=None):
self.selector = gtk.combo_box_new_text()
#self.selector.set_alignment(0.0, 0.5)
label = ppdippstr.ppd.get (option.text)
if not label.endswith (':'):
label += ':'
self.label = gtk.Label(label)
self.label.set_alignment(0.0, 0.5)
selected = None
for nr, choice in enumerate(option.choices):
self.selector.append_text(ppdippstr.ppd.get (choice['text']))
if option.defchoice == choice['choice']:
selected = nr
if selected is not None:
self.selector.set_active(selected)
else:
print option.text, "unknown value:", option.defchoice
self.selector.connect("changed", self.on_change)
Option.__init__(self, option, ppd, gui, tab_label=tab_label)
def get_current_value(self):
return self.option.choices[self.selector.get_active()]['choice']
# ---------------------------------------------------------------------------
class OptionPickMany(OptionPickOne):
widget_name = "OptionPickMany"
def __init__(self, option, ppd, gui, tab_label=None):
raise NotImplemented
Option.__init__(self, option, ppd, gui, tab_label=tab_label)