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.Fields.AbstractFieldWidget import *
00034 from Koo.Fields.AbstractFieldDelegate import *
00035 from Koo.Common import Api
00036 from Koo.Common import Common
00037 from Koo.Common import Shortcuts
00038 from Koo.Screen.Screen import Screen
00039 from Koo.Model.Group import RecordGroup
00040 
00041 (OneToManyDialogUi, OneToManyDialogBase) = loadUiType( Common.uiPath('one2many_dialog.ui') ) 
00042 
00043 class OneToManyDialog( QDialog, OneToManyDialogUi ):
00044         def __init__(self, modelGroup, parent, record=None, attrs=None, creationContext=None):
00045                 QDialog.__init__( self, parent )
00046                 OneToManyDialogUi.__init__( self )
00047                 self.setupUi( self )
00048 
00049                 if attrs is None:
00050                         attrs = {}
00051                 if creationContext is None:
00052                         creationContext = {}
00053 
00054                 self.creationContext = creationContext
00055 
00056                 self.setModal(True)
00057                 if ('string' in attrs) and attrs['string']:
00058                         self.setWindowTitle( self.windowTitle() + " - " + attrs['string'])
00059 
00060                 self.screen.setRecordGroup( modelGroup )
00061                 self.screen.setEmbedded( True )
00062                 
00063                 
00064                 if ('views' in attrs) and ('form' in attrs['views']):
00065                         arch = attrs['views']['form']['arch']
00066                         fields = attrs['views']['form']['fields']
00067                         self.screen.addView(arch, fields, display=True)
00068                 else:
00069                         self.screen.addViewByType('form', display=True)
00070 
00071                 if not record:
00072                         self._recordAdded = True
00073                         record = self.screen.new(context=self.creationContext)
00074                 else:
00075                         self._recordAdded = False
00076                 self.screen.setCurrentRecord( record )
00077 
00078                 self.screen.display()
00079 
00080                 self.connect( self.pushOk, SIGNAL("clicked()"), self.accepted )
00081                 self.connect( self.pushCancel, SIGNAL("clicked()"), self.rejected )
00082                 self.connect( self, SIGNAL('reject()'), self.cleanup )
00083                 self.connect( self.pushPrevious, SIGNAL('clicked()'), self.previous )
00084                 self.connect( self.pushNext, SIGNAL('clicked()'), self.next )
00085 
00086                 if not self._recordAdded:
00087                         
00088                         
00089                         self.pushCancel.hide()
00090                 
00091                 
00092                 
00093                 
00094                 size = self.screen.sizeHint()
00095                 available = QDesktopWidget().availableGeometry().size()
00096                 available -= QSize( 180, 180 )
00097                 self.screen.setMinimumSize( size.boundedTo( available ) )
00098 
00099                 self.updatePosition()
00100                 self.show()
00101 
00102         def setReadOnly(self, value):
00103                 self.screen.setReadOnly( value )
00104 
00105         def cleanup(self):
00106                 if self._recordAdded:
00107                         self.screen.remove()
00108                 
00109                 
00110                 self.screen.setCurrentRecord( None )
00111 
00112         def rejected( self ):
00113                 self.cleanup()
00114                 self.reject()
00115 
00116         def accepted( self ):
00117                 if self._recordAdded:
00118                         self.screen.currentView().store()
00119                         self.screen.new(context=self.creationContext)
00120                         self.updatePosition()
00121                 else:
00122                         self.screen.currentView().store()
00123                         
00124                         
00125                         self.screen.setCurrentRecord( None )
00126                         self.accept()
00127 
00128         def updatePosition( self ):
00129                 position = self.screen.group.indexOfRecord( self.screen.currentRecord() ) + 1
00130                 total = self.screen.group.count()
00131                 self.uiPosition.setText( '(%s/%s)' % (position, total) )
00132 
00133         def previous( self ):
00134                 self.screen.currentView().store()
00135                 self.screen.displayPrevious()
00136                 self.updatePosition()
00137 
00138         def next( self ):
00139                 self.screen.currentView().store()
00140                 self.screen.displayNext()
00141                 self.updatePosition()
00142 
00143 (OneToManyFieldWidgetUi, OneToManyFieldWidgetBase ) = loadUiType( Common.uiPath('one2many.ui') ) 
00144 
00145 class OneToManyFieldWidget(AbstractFieldWidget, OneToManyFieldWidgetUi):
00146         def __init__(self, parent, model, attrs={}):
00147                 AbstractFieldWidget.__init__(self, parent, model, attrs)
00148                 OneToManyFieldWidgetUi.__init__(self)
00149                 self.setupUi(self)
00150 
00151                 self.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Expanding )
00152 
00153                 
00154 
00155                 self.connect( self.pushNew, SIGNAL( "clicked()"),self.new )
00156                 self.connect( self.pushEdit,SIGNAL( "clicked()"),self.edit )
00157                 self.connect( self.pushRemove, SIGNAL( "clicked()"),self.remove )
00158                 self.connect( self.pushBack, SIGNAL( "clicked()"),self.previous )
00159                 self.connect( self.pushForward, SIGNAL( "clicked()"),self.next )
00160                 self.connect( self.pushSwitchView, SIGNAL( "clicked()"),self.switchView )
00161 
00162                 self.connect(self.screen, SIGNAL('recordMessage(int,int,int)'), self.setLabel)
00163                 self.connect(self.screen, SIGNAL('activated()'), self.edit)
00164 
00165                 
00166                 self.scNew = QShortcut( self )
00167                 self.scNew.setKey( Shortcuts.NewInOneToMany )
00168                 self.scNew.setContext( Qt.WidgetWithChildrenShortcut )
00169                 self.connect( self.scNew, SIGNAL('activated()'), self.new )
00170 
00171                 self.scEdit = QShortcut( self )
00172                 self.scEdit.setKey( Shortcuts.EditInOneToMany )
00173                 self.scEdit.setContext( Qt.WidgetWithChildrenShortcut )
00174                 self.connect( self.scEdit, SIGNAL('activated()'), self.edit )
00175 
00176                 self.scDelete = QShortcut( self )
00177                 self.scDelete.setKey( Shortcuts.DeleteInOneToMany )
00178                 self.scDelete.setContext( Qt.WidgetWithChildrenShortcut )
00179                 self.connect( self.scDelete, SIGNAL('activated()'), self.remove )
00180 
00181                 self.scSwitchView = QShortcut( self )
00182                 self.scSwitchView.setKey( Shortcuts.SwitchViewInOneToMany )
00183                 self.scSwitchView.setContext( Qt.WidgetWithChildrenShortcut )
00184                 self.connect( self.scSwitchView, SIGNAL('activated()'), self.switchView )
00185 
00186                 
00187                 
00188                 
00189 
00190         def initGui(self):
00191                 if self.record:
00192                         group = self.record.value(self.name)
00193                 else:
00194                         group = None
00195                 if not group:
00196                         group = RecordGroup( self.attrs['relation'] )
00197                         group.setDomainForEmptyGroup()
00198 
00199                 self.screen.setRecordGroup( group )
00200                 self.screen.setPreloadedViews( self.attrs.get('views', {}) )
00201                 self.screen.setEmbedded( True )
00202                 self.screen.setViewTypes( self.attrs.get('mode', 'tree,form').split(',') )
00203                 self.uiTitle.setText( self.screen.currentView().title )
00204 
00205         def switchView(self):
00206                 
00207                 
00208                 
00209                 if QApplication.keyboardModifiers() & Qt.ControlModifier:
00210                         if not self.screen.currentRecord():
00211                                 return
00212                         id = self.screen.currentRecord().id 
00213                         if not id:
00214                                 return
00215 
00216                         if QApplication.keyboardModifiers() & Qt.ShiftModifier:
00217                                 target = 'background'
00218                         else:
00219                                 target = 'current'
00220 
00221                         Api.instance.createWindow( False, self.attrs['relation'], id, [('id','=',id)], 'form', 
00222                                 mode='form,tree', target=target )       
00223                 else:
00224                         self.screen.switchView()
00225 
00226         def setReadOnly(self, value):
00227                 AbstractFieldWidget.setReadOnly(self, value)
00228                 self.uiTitle.setEnabled( not value )
00229                 self.pushNew.setEnabled( not value )
00230                 self.pushRemove.setEnabled( not value )
00231                 self.updateButtons()
00232 
00233         def updateButtons(self):
00234                 if not self.screen.group:
00235                         value = False
00236                 else:
00237                         value = True
00238                 self.pushEdit.setEnabled( value )
00239                 self.pushBack.setEnabled( value )
00240                 self.pushForward.setEnabled( value )
00241                 self.pushSwitchView.setEnabled( value )
00242 
00243         def colorWidget(self):
00244                 return self.screen
00245 
00246         def new(self):
00247                 
00248                 
00249                 
00250                 self.view.store()
00251                 
00252                 ctx = self.record.evaluateExpression(self.attrs.get('default_get', {}))
00253                 ctx.update(self.record.evaluateExpression( 'dict(%s)' % self.attrs.get('context', '')))
00254 
00255                 if ( not self.screen.currentView().showsMultipleRecords() ) or not self.screen.currentView().isReadOnly():
00256                         self.screen.new(context=ctx)
00257                 else:
00258                         dialog = OneToManyDialog(self.screen.group, parent=self, attrs=self.attrs, creationContext=ctx)
00259                         dialog.exec_()
00260                         self.screen.display()
00261 
00262         def edit(self):
00263                 if not self.screen.currentRecord():
00264                         QMessageBox.information(self, _('Information'), _('No record selected'))
00265                         return
00266                 dialog = OneToManyDialog( self.screen.group, parent=self, record=self.screen.currentRecord(), attrs=self.attrs)
00267                 dialog.setReadOnly( self.isReadOnly() )
00268                 dialog.exec_()
00269                 self.screen.display()
00270 
00271         def next(self ): 
00272                 self.screen.displayNext()
00273 
00274         def previous(self): 
00275                 self.screen.displayPrevious()
00276 
00277         def remove(self): 
00278                 
00279                 
00280                 
00281                 self.view.store()
00282                 self.screen.remove()
00283 
00284         def setLabel(self, position, count, value):
00285                 name = '_'
00286                 if position >= 0:
00287                         name = str(position + 1)
00288                 line = '(%s/%s)' % (name, count)
00289                 self.uiLabel.setText( line )
00290 
00291         def clear(self):
00292                 self.screen.setRecordGroup( None )
00293                 self.screen.display()
00294                 
00295         def showValue(self):
00296                 group = self.record.value(self.name)
00297                 
00298                 group.setContext( self.record.fieldContext( self.name ) )
00299                 if self.screen.group != group:
00300                         self.screen.setRecordGroup(group)
00301                         
00302                         
00303                         
00304                         self.screen.display()
00305                 self.updateButtons()
00306 
00307         def storeValue(self):
00308                 self.screen.currentView().store()
00309 
00310         def saveState(self):
00311                 self.screen.storeViewSettings()
00312                 return AbstractFieldWidget.saveState(self)
00313 
00314 
00315 
00316 
00317 
00318 class OneToManyFieldDelegate( AbstractFieldDelegate ):
00319         def setEditorData(self, editor, index):
00320                 pass
00321         def setModelData(self, editor, model, index):
00322                 pass
00323