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 from PyQt4.QtCore import *
00030 from PyQt4.QtGui import *
00031 from PyQt4.uic import *
00032 
00033 from Koo.Common import Common
00034 from Koo.Common import Api
00035 from Koo.Common import Shortcuts
00036 from Koo.Dialogs.SearchDialog import SearchDialog
00037 
00038 from Koo.Fields.AbstractFieldWidget import *
00039 from Koo.Screen.ScreenDialog import ScreenDialog
00040 
00041 from Koo import Rpc
00042 from Koo.Rpc import RpcProxy
00043 
00044 (ReferenceFieldWidgetUi, ReferenceFieldWidgetBase ) = loadUiType( Common.uiPath('reference.ui') ) 
00045 
00046 
00047 
00048 
00049 class ReferenceFieldWidget(AbstractFieldWidget, ReferenceFieldWidgetUi):
00050         def __init__(self, parent, model, attrs={}):
00051                 AbstractFieldWidget.__init__(self, parent, model, attrs)
00052                 ReferenceFieldWidgetUi.__init__(self)
00053                 self.setupUi(self)
00054 
00055                 self.connect( self.pushNew, SIGNAL('clicked()'), self.new )
00056                 self.connect( self.pushOpen, SIGNAL('clicked()'), self.open )
00057                 self.connect( self.pushClear, SIGNAL('clicked()'), self.clear )
00058                 self.setPopdown( attrs.get('selection',[]) )
00059                 self.connect( self.uiModel, SIGNAL('currentIndexChanged(int)'), self.recordChanged )
00060                 self.connect( self.uiText, SIGNAL( "editingFinished()" ), self.match )
00061                 self.scNew = QShortcut( self.uiText )
00062                 self.scNew.setContext( Qt.WidgetShortcut )
00063                 self.scNew.setKey( Shortcuts.CreateInField )
00064                 self.connect( self.scNew, SIGNAL('activated()'), self.new )
00065 
00066                 self.scSearch  = QShortcut( self.uiText )
00067                 self.scSearch.setContext( Qt.WidgetShortcut )
00068                 self.scSearch.setKey( Shortcuts.SearchInField )
00069                 self.connect( self.scSearch, SIGNAL('activated()'), self.open )
00070 
00071                 self.uiModel.setEditable( False )
00072                 self.installPopupMenu( self.uiText )
00073 
00074         def recordChanged(self, idx):
00075                 if idx < 0:
00076                         self.uiText.clear()
00077                 self.updateStates()
00078 
00079         def clear(self):
00080                 
00081                 
00082                 
00083                 self.view.store()
00084 
00085                 
00086                 
00087                 if self.record:
00088                         self.record.setValue(self.name, False)
00089 
00090         def setPopdown(self, selection):
00091                 self.invertedModels = {}
00092 
00093                 for (i,j) in selection:
00094                         self.uiModel.addItem( j, QVariant(i) )
00095                         self.invertedModels[i] = j
00096 
00097         def setReadOnly(self, value):
00098                 AbstractFieldWidget.setReadOnly(self, value)
00099                 self.updateStates()
00100 
00101         def updateStates(self):
00102                 readOnly = self.isReadOnly()
00103                 if self.uiModel.currentIndex() < 0:
00104                         validIndex = False
00105                 else:
00106                         validIndex = True
00107 
00108                 self.uiModel.setEnabled( not readOnly )
00109                 self.uiText.setReadOnly( not validIndex or readOnly )
00110                 self.pushNew.setEnabled( validIndex and not readOnly )
00111                 self.pushClear.setEnabled( validIndex and not readOnly )
00112                 if self.record and self.record.value(self.name):
00113                         self.pushOpen.setEnabled( True )
00114                 elif validIndex:
00115                         self.pushOpen.setEnabled( True )
00116                 else:
00117                         self.pushOpen.setEnabled( False )
00118 
00119 
00120         def colorWidget(self):
00121                 return self.uiText
00122 
00123         def storeValue(self):
00124                 
00125                 pass
00126 
00127         def search(self):
00128                 domain = self.record.domain(self.name)
00129                 context = self.record.fieldContext(self.name)
00130                 resource = str(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00131                 ids = Rpc.session.execute('/object', 'execute', resource, 'name_search', unicode(self.uiText.text()), domain, 'ilike', context, False)
00132                 
00133                 if len(ids)==1:
00134                         id, name = ids[0]
00135                         self.record.setValue(self.name, (resource, (id, name)) ) 
00136                         self.display()
00137                         return
00138 
00139                 dialog = SearchDialog(resource, sel_multi=False, ids=[x[0] for x in ids], context=context, domain=domain)
00140                 if dialog.exec_() == QDialog.Accepted and dialog.result:
00141                         id = dialog.result[0]
00142                         id, name = Rpc.session.execute('/object', 'execute', resource, 'name_get', [id], Rpc.session.context)[0]
00143                         self.record.setValue(self.name, (resource, (id, name)) )
00144                         self.display()
00145 
00146         def match(self):
00147                 name = unicode(self.uiText.text())
00148                 if name.strip() == '':
00149                         self.record.setValue(self.name, False)
00150                         return
00151 
00152                 value = self.record.value(self.name)
00153                 if value and value[1][1] == name:
00154                         return
00155                 self.search()
00156 
00157         def new(self):
00158                 resource = unicode(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00159                 dialog = ScreenDialog( self )
00160                 dialog.setup( resource )
00161                 dialog.setAttributes( self.attrs )
00162                 if dialog.exec_() == QDialog.Accepted:
00163                         resource = unicode(self.uiModel.itemData(self.uiModel.currentIndex()).toString())
00164                         self.record.setValue(self.name, (resource, dialog.record) )
00165 
00166         def open(self):
00167                 
00168                 
00169                 
00170                 self.view.store()
00171 
00172                 value = self.record.value(self.name)
00173                 if value:
00174                         model, (id, name) = value
00175                         
00176                         
00177                         
00178                         if QApplication.keyboardModifiers() & Qt.ControlModifier:
00179                                 if QApplication.keyboardModifiers() & Qt.ShiftModifier:
00180                                         target = 'background'
00181                                 else:
00182                                         target = 'current'
00183                                 Api.instance.createWindow(False, model, id, [('id','=',id)], 'form', mode='form,tree', target=target)
00184                         else:   
00185                                 dialog = ScreenDialog( self )
00186                                 dialog.setup( model, id )
00187                                 dialog.setAttributes( self.attrs )
00188                                 dialog.exec_()
00189                 else:
00190                         self.search()
00191 
00192         def clear(self):
00193                 self.uiModel.setCurrentIndex(-1)
00194                 if self.record:
00195                         self.record.setValue( self.name, False )
00196                         self.display()
00197                 
00198         def showValue(self):
00199                 value = self.record.value(self.name) 
00200                 if value:
00201                         model, (id, name) = value
00202                         self.uiModel.setCurrentIndex( self.uiModel.findText(self.invertedModels[model]) )
00203                         if not name:
00204                                 id, name = RpcProxy(model).name_get([int(id)], Rpc.session.context)[0]
00205                         self.setText(name)
00206                         self.pushOpen.setIcon( QIcon(":/images/folder.png") )
00207                         self.pushOpen.setToolTip( _("Open") )
00208                 else:
00209                         self.uiText.clear()
00210                         self.uiText.setToolTip('')
00211                         self.uiModel.setCurrentIndex(-1)
00212                         self.pushOpen.setIcon( QIcon(":/images/find.png") )
00213                         self.pushOpen.setToolTip( _("Search") )
00214 
00215         def setText(self, text):
00216                 self.uiText.setText(text)
00217                 self.uiText.setCursorPosition( 0 )
00218                 self.uiText.setToolTip(text)
00219