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
00031
00032
00033 import time
00034 import os
00035 import gettext
00036 import base64
00037 import tempfile
00038 import subprocess
00039
00040 from Koo import Rpc
00041
00042 import WindowService
00043 from PreferencesDialog import *
00044 from FullTextSearchDialog import *
00045 from DatabaseCreationDialog import DatabaseCreationDialog
00046 from DatabaseDialog import *
00047 from TipOfTheDayDialog import *
00048
00049 from PyQt4.QtCore import *
00050 from PyQt4.QtGui import *
00051 from PyQt4.uic import *
00052
00053 from LoginDialog import *
00054 from AdministratorPasswordDialog import *
00055
00056 from Koo.Common.Settings import Settings
00057 from Koo.Common import Common
00058 from Koo.Common import Api
00059 from Koo.Common import ViewSettings
00060 from Koo.Common import Debug
00061 from Koo.Common import Icons
00062 from Koo.Common import RemoteHelp
00063
00064 from Koo.View.ViewFactory import *
00065
00066 from Koo.Plugins import *
00067
00068 class MainTabWidget(QTabWidget):
00069 def __init__(self, parent=None):
00070 QTabWidget.__init__(self, parent)
00071 self.pressedAt = -1
00072 if Common.isQtVersion45():
00073 self.setMovable( True )
00074
00075 def mousePressEvent(self, event):
00076 if event.button() == Qt.MidButton:
00077 self.pressedAt = self.tabBar().tabAt( event.pos() )
00078
00079 def mouseReleaseEvent(self, event):
00080 if event.button() == Qt.MidButton:
00081 tab = self.tabBar().tabAt( event.pos() )
00082 if tab != self.pressedAt:
00083 self.pressedAt = -1
00084 return
00085 self.emit(SIGNAL('middleClicked(int)'), tab)
00086
00087 def wheelEvent(self, event):
00088 if not self.tabBar().underMouse():
00089 return
00090 degrees = event.delta() / 8
00091 steps = degrees / 15
00092 self.setCurrentIndex( ( self.currentIndex() + steps ) % self.count() )
00093
00094 (KooMainWindowUi, KooMainWindowBase) = loadUiType( Common.uiPath('mainwindow.ui') )
00095
00096 class KooMainWindow(QMainWindow, KooMainWindowUi):
00097
00098 instance = None
00099
00100 def __init__(self):
00101 QMainWindow.__init__(self)
00102 KooMainWindowUi.__init__(self)
00103 self.setupUi( self )
00104
00105
00106 KooMainWindow.instance = self
00107
00108 self.fixedWindowTitle = self.windowTitle()
00109
00110 self.uiServerInformation.setText( _('Press Ctrl+O to login') )
00111
00112 self.tabWidget = MainTabWidget( self. centralWidget() )
00113 self.connect( self.tabWidget, SIGNAL("currentChanged(int)"), self.currentChanged )
00114 self.connect( self.tabWidget, SIGNAL("middleClicked(int)"), self.closeTab )
00115 self.connect( self.tabWidget, SIGNAL("tabCloseRequested(int)"), self.closeTab )
00116
00117 self.pushClose = QToolButton( self.tabWidget )
00118 self.pushClose.setIcon( QIcon( ':/images/close_tab.png' ) )
00119 self.pushClose.setAutoRaise( True )
00120 self.pushClose.setSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed )
00121 self.pushClose.setToolTip( _('Close tab') )
00122 self.connect(self.pushClose, SIGNAL('clicked()'), self.closeCurrentTab )
00123
00124 self.tabWidget.setCornerWidget( self.pushClose, Qt.TopRightCorner )
00125
00126 self.layout = self.centralWidget().layout()
00127 self.layout.setSpacing( 2 )
00128 self.layout.addWidget( self.tabWidget )
00129 self.layout.addWidget( self.frame )
00130
00131 self.actionFullTextSearch.setShortcuts( ['Ctrl+T', 'Ctrl+Alt+T'] )
00132
00133 self.connect( self.actionClose, SIGNAL("triggered()"), self.closeCurrentTab )
00134 self.connect( self.actionConnect ,SIGNAL("triggered()"), self.showLoginDialog )
00135 self.connect( self.actionDisconnect ,SIGNAL("triggered()"), self.logout )
00136 self.connect( self.actionSendRequest, SIGNAL("triggered()"), self.newRequest )
00137 self.connect( self.actionReadMyRequest, SIGNAL("triggered()"), self.pendingRequests )
00138 self.connect( self.actionWaitingRequests, SIGNAL("triggered()"), self.waitingRequests )
00139 self.connect( self.actionNewDatabase, SIGNAL("triggered()"), self.createDatabase )
00140 self.connect( self.actionExit, SIGNAL("triggered()"), self.close )
00141 self.connect( self.actionFullTextSearch, SIGNAL("triggered()"), self.fullTextSearch )
00142 self.connect( self.actionNextTab, SIGNAL("triggered()"), self.nextTab )
00143 self.connect( self.actionPreviousTab, SIGNAL("triggered()"), self.previousTab )
00144 self.connect( self.actionBackupDatabase, SIGNAL('triggered()'), self.backupDatabase )
00145 self.connect( self.actionRestoreDatabase, SIGNAL('triggered()'), self.restoreDatabase )
00146 self.connect( self.actionDropDatabase, SIGNAL('triggered()'), self.dropDatabase )
00147 self.connect( self.actionAdminPassword, SIGNAL('triggered()'), self.changeAdministratorPassword )
00148 self.connect( self.actionPreferences, SIGNAL('triggered()'), self.userPreferences )
00149 self.connect( self.actionOpenMenuTab, SIGNAL('triggered()'), self.openMenuTab )
00150 self.connect( self.actionOpenHomeTab, SIGNAL('triggered()'), self.openHomeTab )
00151 self.connect( self.actionClearCache, SIGNAL('triggered()'), self.clearCache )
00152
00153 self.connect( self.actionHtmlManual, SIGNAL('triggered()'), self.openHtmlManual )
00154 self.connect( self.actionPdfManual, SIGNAL('triggered()'), self.openPdfManual )
00155 self.connect( self.actionDocOpenErpCom, SIGNAL('triggered()'), self.openDocOpenErpCom )
00156 self.connect( self.actionTips, SIGNAL('triggered()'), self.showTipOfTheDay )
00157 self.connect( self.actionShortcuts, SIGNAL('triggered()'), self.showShortcuts )
00158 self.connect( self.actionLicense, SIGNAL('triggered()'), self.showLicense )
00159 self.connect( self.actionAbout, SIGNAL('triggered()'), self.showAboutDialog )
00160
00161 self.connect( self.actionFormDesigner, SIGNAL('triggered()'), self.formDesigner )
00162
00163
00164 self.connect( self.pushReadRequests, SIGNAL('clicked()'), self.pendingRequests )
00165 self.connect( self.pushSendRequest, SIGNAL('clicked()'), self.newRequest )
00166
00167 self.connect( self.pushHelp, SIGNAL('clicked()'), self.help )
00168
00169
00170
00171
00172
00173
00174 self.actions = [ 'New', 'Save', 'Delete', 'Find', 'Previous', 'Next',
00175 'Reload', 'Switch', 'Attach', 'Export', 'Import', 'GoToResourceId',
00176 'Duplicate', 'AccessLog', 'MassiveUpdate', 'StoreViewSettings' ]
00177 for x in self.actions:
00178 action = eval('self.action'+ x)
00179 self.connect( action, SIGNAL( 'triggered()' ), self.callChildView )
00180
00181
00182 self.pushSwitchView = self.uiToolBar.widgetForAction( self.actionSwitch )
00183 self.pushSwitchView.setPopupMode( QToolButton.MenuButtonPopup )
00184
00185 self.updateEnabledActions()
00186
00187 self.shortcutActions = []
00188 self.shortcutsGroup = None
00189
00190
00191
00192 self.menuId = False
00193
00194
00195
00196 self.requestsTimer = QTimer()
00197 self.connect( self.requestsTimer, SIGNAL('timeout()'), self.updateRequestsStatus )
00198 self.pendingRequests = -1
00199
00200
00201 self.subscriber = None
00202
00203
00204 self.actionOpenPartnersTab = QAction( self )
00205 self.actionOpenPartnersTab.setIcon( QIcon( ':/images/partner.png' ) )
00206 self.actionOpenPartnersTab.setText( _('Open partners tab') )
00207 self.connect( self.actionOpenPartnersTab, SIGNAL('triggered()'), self.openPartnersTab )
00208
00209 self.actionOpenProductsTab = QAction( self )
00210 self.actionOpenProductsTab.setIcon( QIcon( ':/images/product.png' ) )
00211 self.actionOpenProductsTab.setText( _('Open products tab') )
00212 self.connect( self.actionOpenProductsTab, SIGNAL('triggered()'), self.openProductsTab )
00213
00214 self.systemTrayMenu = QMenu()
00215 self.systemTrayMenu.addAction( self.actionFullTextSearch )
00216 self.systemTrayMenu.addAction( self.actionOpenPartnersTab )
00217 self.systemTrayMenu.addAction( self.actionOpenProductsTab )
00218 self.systemTrayMenu.addAction( self.actionOpenMenuTab )
00219 self.systemTrayMenu.addSeparator()
00220 self.systemTrayMenu.addAction( self.actionSendRequest )
00221 self.systemTrayMenu.addAction( self.actionReadMyRequest )
00222 self.systemTrayMenu.addAction( self.actionWaitingRequests )
00223 self.systemTrayMenu.addSeparator()
00224 self.systemTrayMenu.addAction( self.actionExit )
00225
00226 self.systemTrayIcon = QSystemTrayIcon( self )
00227 self.systemTrayIcon.setIcon( QIcon(":/images/koo-icon.png") )
00228 self.systemTrayIcon.setContextMenu( self.systemTrayMenu )
00229 self.connect( self.systemTrayIcon, SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), self.systemTrayIconActivated )
00230
00231 if RemoteHelp.isRemoteHelpAvailable():
00232
00233 self.actionRemoteHelp = QAction( self )
00234 self.actionRemoteHelp.setIcon( QIcon( ':/images/partner.png' ) )
00235 self.actionRemoteHelp.setText( _('Remote Help') )
00236 QObject.connect( self.actionRemoteHelp, SIGNAL('triggered()'), self.remoteHelp )
00237 self.menuHelp.addAction( self.actionRemoteHelp )
00238
00239
00240
00241 Plugins.list()
00242
00243 def remoteHelp(self):
00244 RemoteHelp.remoteHelp( self )
00245
00246 def systemTrayIconActivated(self, reason):
00247 if reason != QSystemTrayIcon.DoubleClick:
00248 return
00249 self.setVisible( not self.isVisible() )
00250 if self.isMinimized():
00251 self.showNormal()
00252
00253 def openPartnersTab(self):
00254 if not self.isVisible():
00255 self.showNormal()
00256 Api.instance.createWindow(None, 'res.partner', mode='tree')
00257
00258 def openProductsTab(self):
00259 if not self.isVisible():
00260 self.showNormal()
00261
00262 model = Rpc.session.execute('/object', 'execute', 'ir.model', 'search', [('model','=','product.product')], Rpc.session.context )
00263 if not model:
00264 QMessageBox.information(self, _('Products'), _('Products module is not installed.') )
00265 return
00266
00267 Api.instance.createWindow(None, 'product.product', mode='tree')
00268
00269
00270 def startRequestsTimer(self):
00271
00272
00273 frequency = Settings.value( 'koo.requests_refresh_interval', 5 * 60, int ) * 1000
00274 if frequency > 0:
00275 self.requestsTimer.start( frequency )
00276 else:
00277 self.requestsTimer.stop()
00278
00279
00280 self.checkNewRelease()
00281
00282
00283
00284 self.subscriber = Rpc.Subscriber(Rpc.session, self)
00285
00286 self.subscriber.subscribe( 'updated_model:res.request', self.updateRequestsStatus )
00287
00288 def stopRequestsTimer(self):
00289 self.requestsTimer.stop()
00290 if self.subscriber:
00291 self.subscriber.unsubscribe()
00292 self.subscriber = None
00293
00294 def formDesigner(self):
00295 dialog = FormDesigner(self)
00296 dialog.show()
00297
00298
00299
00300
00301
00302
00303
00304
00305 def closeTab(self, tab):
00306 widget = self.tabWidget.widget(tab)
00307 if widget:
00308
00309 if not widget.canClose():
00310 return False
00311 self.tabWidget.removeTab( tab )
00312 if widget:
00313 widget.setParent( None )
00314 del widget
00315 self.updateEnabledActions()
00316 return True
00317
00318
00319 def closeCurrentTab(self):
00320 return self.closeTab( self.tabWidget.currentIndex() )
00321
00322 def fullTextSearch(self):
00323
00324
00325
00326 if not self.isVisible():
00327 self.showNormal()
00328
00329 win = FullTextSearchDialog(self)
00330 win.exec_()
00331
00332 def nextTab(self):
00333 pn = self.tabWidget.currentIndex()
00334 if pn == self.tabWidget.count() - 1:
00335 pn = 0
00336 else:
00337 pn = pn + 1
00338 self.tabWidget.setCurrentIndex( pn )
00339
00340 def previousTab(self):
00341 pn = self.tabWidget.currentIndex()
00342 if pn == 0:
00343 pn = self.tabWidget.count() - 1
00344 else:
00345 pn = pn - 1
00346 self.tabWidget.setCurrentIndex( pn )
00347
00348 def userPreferences(self):
00349 win = PreferencesDialog(self)
00350 win.exec_()
00351
00352 def newRequest(self):
00353 if not self.isVisible():
00354 self.showNormal()
00355 Api.instance.createWindow(None, 'res.request', False,
00356 [('act_from','=',Rpc.session.uid)], 'form', mode='form,tree')
00357
00358
00359 def pendingRequests(self):
00360 if not self.isVisible():
00361 self.showNormal()
00362 Api.instance.createWindow(False, 'res.request', False,
00363 [('act_to','=',Rpc.session.uid)], 'form', mode='tree,form')
00364
00365
00366 def waitingRequests(self):
00367 if not self.isVisible():
00368 self.showNormal()
00369 Api.instance.createWindow(False, 'res.request', False,
00370 [('act_from','=',Rpc.session.uid), ('state','=','waiting')], 'form', mode='tree,form')
00371
00372
00373
00374
00375
00376
00377 def updateRequestsStatus(self):
00378
00379
00380 uid = Rpc.session.uid
00381 try:
00382 ids,ids2 = Rpc.session.call('/object', 'execute', 'res.request', 'request_get')
00383 except Rpc.RpcException, e:
00384 return ([], [])
00385
00386 if len(ids):
00387 message = _('%s request(s)') % len(ids)
00388 else:
00389 message = _('No request')
00390 if len(ids2):
00391 message += _(' - %s pending request(s)') % len(ids2)
00392 self.uiRequests.setText( message )
00393 message = "%s - [%s]" % (message, Rpc.session.databaseName)
00394 self.systemTrayIcon.setToolTip( message )
00395 if self.pendingRequests != -1 and self.pendingRequests < len(ids):
00396 QApplication.alert( self )
00397 if self.systemTrayIcon.isVisible() and not self.isVisible():
00398 self.systemTrayIcon.showMessage( _("New Request"), _("You've received a new request") )
00399 self.pendingRequests = len(ids)
00400 return (ids, ids2)
00401
00402 def help(self):
00403 widget = self.tabWidget.currentWidget()
00404 if widget:
00405 widget.help( self.pushHelp )
00406
00407 def checkNewRelease(self):
00408 from Koo.Common import Version
00409
00410 Rpc.session.callAsync(self.newReleaseInformation, '/object', 'execute', 'nan.koo.release', 'needs_update', Version.Version, os.name, True, Rpc.session.context)
00411
00412 def newReleaseInformation(self, value, exception):
00413 if exception:
00414 return
00415
00416 if not value:
00417 return
00418
00419 directory = tempfile.mkdtemp()
00420 installer = os.path.join( directory, value['filename'] )
00421 f = open( installer, 'wb' )
00422 f.write( base64.decodestring( value['installer'] ) )
00423 f.close()
00424 command_line = value['command_line'].split(' ')
00425 command_line = [x.replace('$path', directory) for x in command_line]
00426 subprocess.Popen(command_line, cwd=directory)
00427
00428 def showLoginDialog(self):
00429 dialog = LoginDialog( self )
00430 while dialog.exec_() == QDialog.Accepted:
00431 self.login( dialog.url, dialog.databaseName )
00432 if Rpc.session.open:
00433 return
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 def login(self, url, databaseName):
00445
00446
00447
00448
00449 if not self.logout():
00450 return
00451 try:
00452 loginResponse = Rpc.session.login(url, databaseName)
00453 url = QUrl( url )
00454 if loginResponse == Rpc.session.LoggedIn:
00455 Settings.loadFromServer()
00456 if Settings.value('koo.use_cache'):
00457 Rpc.session.cache = Rpc.Cache.ActionViewCache()
00458 else:
00459 Rpc.session.cache = None
00460
00461 iconVisible = Settings.value('koo.show_system_tray_icon', True )
00462 self.systemTrayIcon.setVisible( iconVisible )
00463
00464
00465
00466 self.startRequestsTimer()
00467
00468 self.openMenuTab()
00469 self.openHomeTab()
00470
00471 if Common.isQtVersion45():
00472 self.tabWidget.setTabsClosable( Settings.value('koo.tabs_closable') )
00473
00474 self.updateRequestsStatus()
00475 self.updateUserShortcuts()
00476
00477 elif loginResponse == Rpc.session.Exception:
00478 QMessageBox.warning(self, _('Connection error !'), _('Unable to connect to the server !'))
00479 elif loginResponse == Rpc.session.InvalidCredentials:
00480 QMessageBox.warning(self, _('Connection error !'), _('Bad username or password !'))
00481
00482 except Rpc.RpcException, e:
00483 if len(e.args) == 2:
00484 (e1,e2) = e.args
00485 Common.error(_('Connection Error !'), e.args[0], e.args[1])
00486 else:
00487 Common.error(_('Connection Error !'), _('Error logging into database.'), e)
00488 Rpc.session.logout()
00489
00490
00491
00492 def closeAllTabs(self):
00493 while self.tabWidget.count() > 0:
00494 if not self.closeCurrentTab():
00495 return False
00496 return True
00497
00498 def logout(self):
00499 if not self.closeAllTabs():
00500 return False
00501 self.uiRequests.clear()
00502 self.stopRequestsTimer()
00503 self.uiUserName.setText( _('Not logged !') )
00504 self.uiServerInformation.setText( _('Press Ctrl+O to login') )
00505 self.setWindowTitle( self.fixedWindowTitle )
00506 Rpc.session.logout()
00507 self.updateEnabledActions()
00508 self.updateUserShortcuts()
00509 return True
00510
00511 def openPdfManual(self):
00512 try:
00513 pdf = Rpc.session.call('/object', 'execute', 'ir.documentation.paragraph', 'export_to_pdf', Rpc.session.context)
00514 except:
00515 return False
00516 if not pdf:
00517 return False
00518
00519 pdf = base64.decodestring(pdf)
00520 fd, fileName = tempfile.mkstemp( '.pdf' )
00521 os.write( fd, pdf )
00522 os.close( fd )
00523 Common.openFile( fileName )
00524 return True
00525
00526 def openHtmlManual(self):
00527 Api.instance.createWebWindow( 'openerp://ir.documentation.file/get/index.html', _('Manual') )
00528
00529 def openDocOpenErpCom(self):
00530 Api.instance.createWebWindow( 'http://doc.openerp.com', 'doc.openerp.com' )
00531
00532 def showTipOfTheDay(self):
00533 dialog = TipOfTheDayDialog(self)
00534 dialog.exec_()
00535
00536 def showLicense(self):
00537 dialog = QDialog( self )
00538 loadUi( Common.uiPath('license.ui'), dialog )
00539 dialog.exec_()
00540
00541 def showAboutDialog(self):
00542 dialog = QDialog( self )
00543 loadUi( Common.uiPath('about.ui'), dialog )
00544 from Koo.Common import Version
00545 dialog.uiOpenErp.setHtml( unicode(dialog.uiOpenErp.toHtml()) % Version.Version )
00546 dialog.exec_()
00547
00548 def showShortcuts(self):
00549 dialog = QDialog( self )
00550 loadUi( Common.uiPath('shortcuts.ui'), dialog )
00551 dialog.exec_()
00552
00553 def shortcutsChanged(self, model):
00554 if model == 'ir.ui.menu':
00555 self.updateUserShortcuts()
00556
00557 def updateUserShortcuts(self):
00558
00559 for action in self.shortcutActions:
00560 self.menuWindow.removeAction( action )
00561 self.shortcutActions = []
00562
00563 if not Rpc.session.logged():
00564 return
00565 fields = Rpc.session.execute('/object', 'execute', 'ir.ui.view_sc', 'fields_get', ['res_id', 'name'])
00566 self.shortcutsGroup = RecordGroup( 'ir.ui.view_sc', fields )
00567 self.shortcutsGroup.setDomain( [('user_id','=',Rpc.session.uid), ('resource','=','ir.ui.menu')] )
00568 self.shortcutActions.append( self.menuWindow.addSeparator() )
00569 for record in self.shortcutsGroup:
00570 action = QAction( self )
00571 action.setObjectName( str( record.id ) )
00572 action.setText( record.value('name') )
00573 action.setIcon( QIcon( ':/images/relate.png' ) )
00574 self.connect( action, SIGNAL('triggered()'), self.executeShortcut )
00575 self.menuWindow.addAction( action )
00576 self.shortcutActions.append( action )
00577
00578 def executeShortcut(self):
00579 action = self.sender()
00580 id = int( action.objectName() )
00581
00582
00583
00584 m = self.shortcutsGroup[ id ]
00585 id = self.shortcutsGroup.fieldObjects[ 'res_id' ].get( m )
00586 Api.instance.executeKeyword('tree_but_open', {'model':'ir.ui.menu', 'id':id, 'ids': [id]})
00587
00588
00589
00590
00591
00592 def openMenuTab(self):
00593
00594
00595 if not self.isVisible():
00596 self.showNormal()
00597
00598
00599 for p in range(self.tabWidget.count()):
00600 if self.tabWidget.widget(p).model=='ir.ui.menu':
00601 self.tabWidget.setCurrentIndex(p)
00602 return
00603
00604
00605 data = Rpc.session.execute('/object', 'execute', 'res.users', 'read', [Rpc.session.uid], ['menu_id','name','company_id'], Rpc.session.context)
00606 record = data[0]
00607 user = record['name'] or ''
00608 company = record['company_id'][1]
00609 self.uiUserName.setText( '%s (%s)' % (user, company) )
00610 self.uiServerInformation.setText( "%s [%s]" % (Rpc.session.url, Rpc.session.databaseName) )
00611 self.setWindowTitle( "[%s] - %s" % (Rpc.session.databaseName, self.fixedWindowTitle) )
00612
00613
00614 if not record['menu_id']:
00615 QMessageBox.warning(self, _('Access denied'), _('You can not log into the system !\nAsk the administrator to verify\nyou have an action defined for your user.') )
00616 Rpc.session.logout()
00617 self.menuId = False
00618 return
00619
00620
00621
00622 self.menuId = record['menu_id'][0]
00623
00624 Api.instance.execute(self.menuId, {'window':self })
00625
00626
00627
00628
00629
00630
00631 def openHomeTab(self):
00632 id = Rpc.session.execute('/object', 'execute', 'res.users', 'read', [Rpc.session.uid], [ 'action_id','name'], Rpc.session.context)
00633
00634 if not id[0]['action_id']:
00635 return
00636 id = id[0]['action_id'][0]
00637 if not id:
00638 return
00639
00640
00641 if id == self.menuId:
00642 return
00643 Api.instance.execute(id, {'window':self })
00644
00645 def clearCache(self):
00646 ViewSettings.ViewSettings.clear()
00647 if Rpc.session.cache:
00648 Rpc.session.cache.clear()
00649
00650 def closeEvent(self, event):
00651 if QMessageBox.question(self, _("Quit"), _("Do you really want to quit ?"), _("Yes"), _("No")) == 1:
00652 event.ignore()
00653 return
00654 wid = self.tabWidget.currentWidget()
00655 if wid:
00656
00657 if not wid.canClose():
00658 event.ignore()
00659 return
00660 Rpc.session.logout()
00661 self.systemTrayIcon.setVisible( False )
00662
00663 def closeTabForced(self):
00664 idx = self.tabWidget.indexOf( self.sender() )
00665 self.tabWidget.removeTab( idx )
00666 self.updateEnabledActions()
00667
00668
00669 def addWindow(self, win, target):
00670 if target in ('current', 'background'):
00671 self.connect( win, SIGNAL('closed()'), self.closeTabForced )
00672 self.connect( win, SIGNAL('shortcutsChanged'), self.shortcutsChanged )
00673 self.tabWidget.addTab( win, win.name )
00674
00675 if target != 'background':
00676 self.tabWidget.setCurrentIndex( self.tabWidget.count()-1 )
00677 else:
00678
00679
00680
00681 parent = QApplication.activeModalWidget()
00682 if not parent:
00683 parent = self
00684 dialog = QDialog( parent )
00685 dialog.setWindowTitle( _('Wizard') )
00686 dialog.setModal( True )
00687 layout = QHBoxLayout(dialog)
00688 layout.setContentsMargins( 0, 0, 0, 0 )
00689 layout.addWidget( win )
00690 win.setParent( dialog )
00691 self.connect( win, SIGNAL('closed()'), dialog.accept )
00692 win.show()
00693 dialog.exec_()
00694
00695 def updateEnabledActions(self):
00696 view = self.tabWidget.currentWidget()
00697 for x in self.actions:
00698 action = eval( 'self.action' + x )
00699 if view and x in view.handlers:
00700 action.setEnabled( True )
00701 else:
00702 action.setEnabled( False )
00703
00704 if Rpc.session.open:
00705 self.actionFullTextSearch.setEnabled( True )
00706 else:
00707 self.actionFullTextSearch.setEnabled( False )
00708
00709 if Settings.value('koo.allow_massive_updates', True):
00710 self.actionMassiveUpdate.setVisible( True )
00711 else:
00712 self.actionMassiveUpdate.setVisible( False )
00713
00714
00715 self.menuReports.clear()
00716 self.menuBrowse.clear()
00717 self.menuActions.clear()
00718 self.menuPlugins.clear()
00719 reports = False
00720 browse = False
00721 actions = False
00722 plugins = False
00723 if view:
00724 self.pushSwitchView.setMenu( view.switchViewMenu() )
00725 for x in view.actions():
00726 if x.type() == 'print':
00727 self.menuReports.addAction( x )
00728 reports = True
00729 elif x.type() == 'relate':
00730 self.menuBrowse.addAction( x )
00731 browse = True
00732 elif x.type() == 'action':
00733 self.menuActions.addAction( x )
00734 actions = True
00735 else:
00736 self.menuPlugins.addAction( x )
00737 plugins = True
00738
00739 self.menuReports.setEnabled( reports )
00740 self.menuBrowse.setEnabled( browse )
00741 self.menuActions.setEnabled( actions )
00742 self.menuPlugins.setEnabled( plugins )
00743
00744 value = Rpc.session.logged()
00745 self.actionOpenMenuTab.setEnabled( value )
00746 self.actionOpenHomeTab.setEnabled( value )
00747 self.actionPreferences.setEnabled( value )
00748 self.actionClearCache.setEnabled( value )
00749 self.actionSendRequest.setEnabled( value )
00750 self.actionReadMyRequest.setEnabled( value )
00751 self.actionWaitingRequests.setEnabled( value )
00752 self.actionDisconnect.setEnabled( value )
00753
00754 if self.tabWidget.count() > 0:
00755 value = True
00756 else:
00757 value = False
00758 self.actionClose.setEnabled( value )
00759 self.actionNextTab.setEnabled( value )
00760 self.actionPreviousTab.setEnabled( value )
00761
00762 def callChildView( self ):
00763 o = self.sender()
00764 action = str( o.objectName() ).replace('action','')
00765 wid = self.tabWidget.currentWidget()
00766 if wid:
00767 res = True
00768 if action in wid.handlers:
00769 res = wid.handlers[action]()
00770
00771 def currentChanged( self, page ):
00772 self.updateEnabledActions()
00773
00774 def createDatabase(self):
00775 dialog = DatabaseCreationDialog(self)
00776 if dialog.exec_() == QDialog.Accepted:
00777 self.login( dialog.url, dialog.databaseName )
00778
00779 def dropDatabase(self):
00780 dropDatabase( self )
00781
00782 def restoreDatabase(self):
00783 restoreDatabase( self )
00784
00785 def backupDatabase(self):
00786 backupDatabase( self )
00787
00788 def changeAdministratorPassword(self):
00789 dialog = AdministratorPasswordDialog( self )
00790 dialog.exec_()
00791