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 import os
00030 import tempfile
00031 
00032 from Koo.Fields.AbstractFieldWidget import *
00033 from PyQt4.QtCore import *
00034 from PyQt4.QtGui import *
00035 from PyQt4.uic import *
00036 
00037 from Koo.Common import Common
00038 from Koo.Common import Semantic
00039 from Koo.Common import Numeric
00040 
00041 try:
00042         from NanScan.ScanDialog import ScanDialog, AbstractImageSaverFactory, AbstractImageSaver
00043         isNanScanAvailable = True
00044 except:
00045         isNanScanAvailable = False
00046 
00047 if isNanScanAvailable:
00048         class BinaryImageSaverFactory(AbstractImageSaverFactory):
00049                 def __init__(self, record, field):
00050                         self.record = record
00051                         self.field = field
00052 
00053                 def create(self, parent):
00054                         saver = BinaryImageSaver( parent )
00055                         saver.record = self.record
00056                         saver.field = self.field
00057                         return saver
00058 
00059         class BinaryImageSaver(AbstractImageSaver):
00060                 def run(self):
00061                         self.error = True
00062                         image = QBuffer()
00063                         if self.item.image.save( image, 'PNG' ):
00064                                 self.error = False
00065                                 self.record.setValue( self.field, str( image.buffer() ) )
00066 
00067 (BinaryFieldWidgetUi, BinaryFieldWidgetBase) = loadUiType( Common.uiPath('binary.ui') ) 
00068 
00069 class BinaryFieldWidget(AbstractFieldWidget, BinaryFieldWidgetUi):
00070         def __init__(self, parent, model, attrs={}):
00071                 AbstractFieldWidget.__init__(self, parent, model, attrs)
00072                 BinaryFieldWidgetUi.__init__(self)
00073                 self.setupUi(self)
00074 
00075                 self.filters = attrs.get('filters', '*')
00076                 if isinstance( self.filters, basestring ):
00077                         self.filters = self.filters.split(',')
00078                 self.filters = _('Files (%s)') % ' '.join( self.filters )
00079 
00080                 self.fileNameField = attrs.get('filename')
00081                 self.baseDirectory = unicode( QDir.homePath() )
00082 
00083                 self.connect( self.pushRemove, SIGNAL('clicked()'),self.remove )
00084 
00085                 self.actionNew = QAction(self)
00086                 self.actionNew.setText( _('&New') )
00087                 self.actionNew.setIcon( QIcon( ':/images/new.png' ) )
00088 
00089                 self.actionScan = QAction(self)
00090                 self.actionScan.setText( _('&Scan') )
00091                 self.actionScan.setIcon( QIcon( ':/images/scanner.png' ) )
00092 
00093                 self.newMenu = QMenu( self )
00094                 self.newMenu.addAction( self.actionNew )
00095                 if isNanScanAvailable:
00096                         self.newMenu.addAction( self.actionScan )
00097                 self.pushNew.setMenu( self.newMenu )
00098                 self.pushNew.setDefaultAction( self.actionNew )
00099 
00100                 self.actionSave = QAction(self)
00101                 self.actionSave.setText( _('&Save') )
00102                 self.actionSave.setIcon( QIcon( ':/images/save.png' ) )
00103                 self.actionOpen = QAction(self)
00104                 self.actionOpen.setText( _('&Open') )
00105                 self.actionOpen.setIcon( QIcon( ':/images/open.png' ) )
00106                 self.actionShowImage = QAction(self)
00107                 self.actionShowImage.setText( _('Show &image'), )
00108                 self.actionShowImage.setIcon( QIcon( ':/images/convert.png' ) )
00109 
00110                 self.saveMenu = QMenu( self )
00111                 self.saveMenu.addAction( self.actionSave )
00112                 self.saveMenu.addAction( self.actionOpen )
00113                 self.saveMenu.addAction( self.actionShowImage )
00114                 self.pushSave.setMenu( self.saveMenu )
00115                 self.pushSave.setDefaultAction( self.actionSave )
00116 
00117                 self.connect( self.actionNew, SIGNAL('triggered()'), self.new )
00118                 self.connect( self.actionScan, SIGNAL('triggered()'), self.scan )
00119                 self.connect( self.actionSave, SIGNAL('triggered()'), self.save )
00120                 self.connect( self.actionOpen, SIGNAL('triggered()'), self.open )
00121                 self.connect( self.actionShowImage, SIGNAL('triggered()'), self.showImage )
00122                 self.connect( self.saveMenu, SIGNAL('aboutToShow()'), self.updateShowImageAction )
00123 
00124                 self.uiBinary.setAcceptDrops( True )
00125                 self.installPopupMenu( self.uiBinary )
00126 
00127                 self.sizeName = '%s.size' % self.name 
00128                 
00129         def eventFilter(self, target, event):
00130                 if not event.type() in (QEvent.Drop, QEvent.DragEnter, QEvent.DragMove):
00131                         return AbstractFieldWidget.eventFilter(self, target, event)
00132                 if not event.mimeData().hasText():
00133                         return AbstractFieldWidget.eventFilter(self, target, event)
00134                 if event.type() in (QEvent.DragMove, QEvent.DragEnter):
00135                         event.accept()
00136                         return True
00137                 path = unicode( event.mimeData().text() ).replace( 'file://', '' )
00138                 self.setBinaryFile( path )
00139                 return True
00140 
00141         def setReadOnly(self, value):
00142                 AbstractFieldWidget.setReadOnly(self, value)
00143                 self.uiBinary.setEnabled( not value )
00144                 self.pushNew.setEnabled( not value )
00145                 self.pushRemove.setEnabled( not value )
00146                 self.updateActions()
00147 
00148         def updateShowImageAction(self):
00149                 pix = QPixmap()
00150                 if self.record and pix.loadFromData( self.record.value(self.name) ):
00151                         self.actionShowImage.setEnabled( True )
00152                 else:
00153                         self.actionShowImage.setEnabled( False )
00154                 
00155         def updateActions(self):
00156                 if self.record and self.record.value(self.sizeName):
00157                         enable = True
00158                 else:
00159                         enable = False
00160                 self.actionSave.setEnabled( enable )
00161                 self.actionOpen.setEnabled( enable )
00162                 self.actionShowImage.setEnabled( enable )
00163 
00164         def menuEntries(self):
00165                 enableApplication = False
00166                 enableImage = False
00167                 if self.record.value(self.name):
00168                         enableApplication = True
00169                         pix = QPixmap()
00170                         if pix.loadFromData( self.record.value(self.name) ):
00171                                 enableImage = True
00172 
00173                 return [ (_('Open...'), self.open, enableApplication), 
00174                          (_('Show &image...'), self.showImage, enableImage) ]
00175 
00176         def scan(self):
00177                 from NanScan.ScanDialog import ScanDialog
00178                 
00179                 saver = BinaryImageSaverFactory( self.record, self.name )
00180 
00181                 dialog = ScanDialog( self )
00182                 dialog.setImageSaverFactory( saver )
00183                 dialog.show()
00184 
00185         def open(self):
00186                 if not self.record.value(self.name):
00187                         return
00188 
00189                 
00190                 
00191                 
00192                 
00193                 
00194                 extension = ''
00195                 if self.fileName() and '.' in self.fileName():
00196                         extension = '.%s' % self.fileName().rpartition('.')[2]
00197                 else:
00198                         extension = ''
00199 
00200                 fileName = tempfile.mktemp( extension )
00201                 fp = file(fileName,'wb+')
00202                 fp.write( self.record.value(self.name) )
00203                 fp.close()
00204                 Common.openFile( fileName )
00205 
00206         def showImage(self):
00207                 if not self.record.value(self.name): 
00208                         return
00209                 dialog = QDialog( self )
00210                 dialog.setWindowTitle( _('Image') )
00211                 label = QLabel( dialog )
00212                 pix = QPixmap()
00213                 pix.loadFromData( self.record.value(self.name) )
00214                 label.setPixmap( pix )
00215                 layout = QHBoxLayout( dialog )
00216                 layout.addWidget( label )
00217                 dialog.exec_()
00218 
00219         def new(self):
00220                 filename = QFileDialog.getOpenFileName(self, _('Select the file to attach'), self.baseDirectory, self.filters)
00221                 if filename.isNull():
00222                         return
00223                 filename = unicode(filename)
00224                 self.baseDirectory = os.path.dirname(filename)
00225                 self.setBinaryFile( filename )
00226 
00227         def setBinaryFile(self, filename):
00228                 try:
00229                         value = file(filename, 'rb').read()
00230                 except Exception, e:
00231                         QMessageBox.information(self, _('Error'), _('Error reading the file:\n%s') % unicode(e.args) )
00232                         return
00233 
00234                 self.record.setValue( self.name, value )
00235 
00236                 
00237                 
00238                 if self.fileNameField:
00239                         self.record.setValue( self.fileNameField, os.path.basename(filename) )
00240                         if self.view:
00241                                 self.view.widgets[self.fileNameField].load(self.record)
00242                 self.showValue()
00243 
00244         def fileName(self):
00245                 if self.fileNameField:
00246                         if self.record.fieldExists( self.fileNameField ):
00247                                 return self.record.value( self.fileNameField )
00248                 if self.record.fieldExists( 'name' ):
00249                         return self.record.value( 'name' ) or self.name
00250                 return self.name
00251 
00252         def save(self):
00253                 directory = '%s/%s' % (self.baseDirectory, unicode(self.fileName()) )
00254                 filename = QFileDialog.getSaveFileName( self, _('Save as...'), directory, self.filters )
00255                 if filename.isNull():
00256                         return
00257                 filename = unicode(filename)
00258                 self.baseDirectory = os.path.dirname(filename)
00259 
00260                 try:
00261                         fp = file(filename,'wb+')
00262                         fp.write( self.record.value(self.name) )
00263                         fp.close()
00264                 except Exception, e:
00265                         QMessageBox.information(self, _('Error'), _('Error writing the file:\n%s') % unicode(e.args) )
00266                         return
00267                 Semantic.addInformationToFile( filename, self.record.group.resource, self.record.id, self.name )
00268 
00269         def remove(self):
00270                 self.record.setValue( self.name, False )
00271                 self.clear()
00272                 self.modified()
00273                 if 'filename' in self.attrs:
00274                         w = self.attrs['filename']
00275                         self.record.setValue( w, False )
00276                         if self.view:
00277                                 self.view.widgets[w].load(self.record)
00278 
00279         def showValue(self):
00280                 if self.record.value( self.sizeName ):
00281                         self.setText( self.record.value( self.sizeName ) )
00282                 else:
00283                         self.clear()
00284                 self.updateActions()
00285 
00286         def clear(self):
00287                 self.uiBinary.clear()
00288                 self.updateActions()
00289 
00290         def setText(self, text):
00291                 if text:
00292                         self.uiBinary.setText( text )
00293                 else:
00294                         self.uiBinary.clear()
00295                 self.uiBinary.setCursorPosition( 0 )
00296 
00297         
00298         
00299         
00300         def storeValue(self):
00301                 pass
00302 
00303         def colorWidget(self):
00304                 return self.uiBinary
00305 
00306         def saveState(self):
00307                 return QByteArray( self.baseDirectory.encode('utf-8') )
00308 
00309         def restoreState(self, value):
00310                 if not value:
00311                         return
00312                 self.baseDirectory = unicode( str( value ), 'utf-8' )