00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 from Koo import Rpc
00031 from Koo.Common import Api
00032 from Koo.Common import Help
00033 from FieldPreferencesDialog import *
00034 
00035 from PyQt4.QtGui import *
00036 from PyQt4.QtCore import *
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 class AbstractFieldWidget(QWidget):
00048 
00049         
00050         
00051         
00052         
00053         def __init__(self, parent, view, attributes):
00054                 QWidget.__init__(self, parent)
00055 
00056                 self.attrs = attributes
00057                 self.view = view
00058 
00059                 self._isInitialized = False
00060                 self._isUpToDate = False
00061 
00062                 
00063                 
00064                 
00065                 
00066                 self._required = self.attrs.get('required', False) not in ('False', '0', False)
00067                 self._readOnly = self.attrs.get('readonly', False) not in ('False', '0', False)
00068                 
00069                 
00070                 self.setStyleSheet( eval(self.attrs.get('use', '{}')).get('stylesheet','') )
00071 
00072                 self.defaultReadOnly= self._readOnly
00073                 self.defaultMenuEntries = [
00074                         (_('Set to default value'), self.setToDefault, 1),
00075                 ]
00076 
00077                 
00078                 
00079                 if self.view:
00080                         self.defaultMenuEntries.append( (_('Set as default value'), self.setAsDefault, 1) )
00081 
00082                 
00083                 self.name = self.attrs.get('name', 'unnamed')
00084                 self.record = None
00085 
00086                 
00087                 self.colors = {
00088                         'invalid'  : '#FF6969',
00089                         'readonly' : '#e3e3e3', 
00090                         'required' : '#ddddff', 
00091                         'normal'   : 'white'
00092                 }
00093 
00094         def addShortcut(self, keys):
00095                 if not keys:
00096                         return
00097                 shortcut = QShortcut(QKeySequence(keys), self)
00098                 self.connect(shortcut, SIGNAL('activated()'), self.setFocus)
00099 
00100         def initialize(self):
00101                 self.addShortcut( eval(self.attrs.get('use', '{}')).get('shortcut','') )
00102 
00103         def showEvent(self, event):
00104                 if not self._isInitialized:
00105                         self._isInitialized = True
00106                         self.initGui()
00107                         self.initialize()
00108                 if not self._isUpToDate:
00109                         self._isUpToDate = True
00110                         if self.record:
00111                                 self.showValue()
00112                         self.updateColor()
00113                 return QWidget.showEvent(self, event)
00114 
00115         def showHelp(self):
00116                 QApplication.setOverrideCursor( Qt.WaitCursor )
00117                 helpWidget = Help.HelpWidget( self.sender() )
00118                 helpWidget.setLabel( self.attrs.get('string','') )
00119                 helpWidget.setHelp( self.attrs.get('help','') )
00120                 helpWidget.setType( helpWidget.FieldType )
00121                 if self.record:
00122                         
00123                         helpWidget.setFilter( (self.record.group.resource, self.name) )
00124                 helpWidget.show()
00125                 QApplication.restoreOverrideCursor()
00126 
00127         
00128         
00129         
00130         
00131         
00132         
00133         
00134         
00135         
00136         def initGui(self):
00137                 return
00138 
00139         
00140         
00141         
00142         def setToDefault(self):
00143                 try:
00144                         model = self.record.group.resource
00145                         res = Rpc.session.call('/object', 'execute', model, 'default_get', [self.attrs['name']])
00146                         self.record.setValue(self.name, res.get(self.name, False))
00147                         self.display()
00148                 except:
00149                         QMessageBox.warning(None, _('Operation not permited'), _('You can not set to the default value here !') )
00150                         return False
00151 
00152         
00153         def setAsDefault(self):
00154                 if not self.view:
00155                         return
00156                 deps = []
00157                 wid = self.view.widgets
00158                 for wname, wview in self.view.widgets.items():
00159                         if wview.attrs.get('change_default', False):
00160                                 value = wview.record.value(wview.name)
00161                                 deps.append((wname, wname, value, value))
00162                 value = self.record.default( self.name )
00163                 model = self.record.group.resource
00164                 dialog = FieldPreferencesDialog(self.attrs['name'], self.attrs.get('string', self.attrs['name']), model, value, deps)
00165                 dialog.exec_()
00166 
00167 
00168         def updateColor(self):
00169                 if self.record and not self.record.isFieldValid( self.name ):
00170                         self.setColor('invalid')
00171                 elif self._readOnly:
00172                         self.setColor('readonly')
00173                 elif self._required:
00174                         self.setColor('required')
00175                 else:
00176                         self.setColor('normal')
00177 
00178         
00179         
00180         
00181         
00182         def setReadOnly(self, ro):
00183                 self._readOnly = ro
00184                 self.updateColor()
00185 
00186         
00187         def isReadOnly(self):
00188                 return self._readOnly
00189 
00190         
00191         
00192         
00193         def refresh(self):
00194                 self.setReadOnly( self._readOnly )
00195 
00196         
00197         
00198         
00199         def colorWidget(self):
00200                 return self
00201 
00202         
00203         
00204         
00205         def menuEntries(self):
00206                 return []
00207 
00208         
00209         
00210         
00211         
00212         def setColor(self, name):
00213                 color = QColor( self.colors.get( name, 'white' ) )
00214                 palette = QPalette()
00215                 palette.setColor(QPalette.Active, QPalette.Base, color)
00216                 self.colorWidget().setPalette(palette);
00217 
00218         
00219         
00220         
00221         def installPopupMenu( self, widget ):
00222                 widget.installEventFilter( self )
00223 
00224         
00225         
00226         
00227         def eventFilter( self, target, event ):
00228                 if event.type() == QEvent.ContextMenu:
00229                         self.showPopupMenu( target, event.globalPos() )
00230                         return True
00231                 if event.type() == QEvent.FocusOut:
00232                         if self.record:
00233                                 self.store()
00234                 return False
00235 
00236         
00237         
00238         def showPopupMenu(self, parent, position):
00239                 entries = self.defaultMenuEntries[:]
00240                 new = self.menuEntries()
00241                 if len(new) > 0:
00242                         entries = entries + [(None, None, None)] + new
00243                 menu = QMenu( parent )
00244                 for title, slot, enabled in entries:
00245                         if title:
00246                                 item = QAction( title, menu )
00247                                 if slot:
00248                                         self.connect( item, SIGNAL("triggered()"), slot )
00249                                 item.setEnabled( enabled )
00250                                 menu.addAction( item )
00251                         else:
00252                                 menu.addSeparator()
00253                 menu.popup( position )
00254 
00255         
00256         
00257         
00258         
00259         def modified(self):
00260                 if not self.record:
00261                         return 
00262                 self.store()
00263 
00264         
00265         
00266         def showValue(self):
00267                 pass
00268 
00269         
00270         
00271         def clear(self):
00272                 pass
00273 
00274         
00275         
00276         
00277         
00278         def display(self):
00279                 if not self.record:
00280                         self._readOnly = True
00281                         self.clear()
00282                         self.refresh()
00283                         return
00284                 self._readOnly = self.record.isFieldReadOnly(self.name)
00285                 self._required = self.record.isFieldRequired(self.name)
00286                 self.refresh()
00287                 if self.isVisible():
00288                         if not self._isInitialized:
00289                                 self._isInitialized = True
00290                                 self.initGui()
00291                                 self.initialize()
00292                         self._isUpToDate = True
00293                         self.showValue()
00294                 else:
00295                         self._isUpToDate = False
00296         
00297         def reset(self):
00298                 self.refresh()
00299 
00300         
00301         def load(self, record ):
00302                 self.record = record
00303                 self.display()
00304 
00305         
00306         
00307         def storeValue(self):
00308                 pass
00309 
00310         
00311         
00312         
00313         
00314         def store(self):
00315                 if not self._isUpToDate:
00316                         return
00317                 self.storeValue()
00318 
00319         def saveState(self):
00320                 return QByteArray()
00321 
00322         def restoreState(self, state):
00323                 pass