"""
     qtgui/MGSimpleDialog.py: CCP4MG Molecular Graphics Program
     Copyright (C) 2001-2008 University of York, CCLRC
     Copyright (C) 2009-2011 University of York

     This library is free software: you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public License
     version 3, modified in accordance with the provisions of the 
     license to address the requirements of UK law.
 
     You should have received a copy of the modified GNU Lesser General 
     Public License along with this library.  If not, copies may be 
     downloaded from http://www.ccp4.ac.uk/ccp4license.php
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU Lesser General Public License for more details.
"""
from PyQt4 import QtCore, QtGui
import sys
from global_definitions import *

class MGAbstractGUI(QtCore.QObject):
    """
    Class for generating GUIs somewhat more complex than 
    a single dialog box.
    """
    def CreateMenuEntry(self,force=0):
        self.menu_defn["text"] = self.title+'..'
        self.menu_defn["tip"] = self.title
        self.window_item = MAINWINDOW().addMenuDefinition(self.title,self.menu_defn,self.menu,force)

    def handleTrigger(self):
	    pass

    def __init__(self,parent=None):
        self.menu = "Tools"
        self.title = "Simple Action"
        self.menu_defn = dict (
        text = 'Simple Action',
        shortcut = '',
        #icon = 'info',
        tip = 'Simple Action',
        signal = 'triggered()',
        slot = self.handleTrigger,
        checkable = 1,
        initialise = ''
        )
        QtCore.QObject.__init__(self,parent)
	self.window_item = None

class MGSimpleDialog(QtGui.QDialog):

    def CreateMenuEntry(self,force=0):
        mainwin =  MAINWINDOW()
        if not mainwin: return
        win_menu =  MAINWINDOW().menuBar().findChild(QtGui.QMenu,self.menu)
	if self.window_item and win_menu:
          win_menu.removeAction(self.window_item)

        self.menu_defn["text"] = self.windowTitle()+'..'
        self.menu_defn["tip"] = self.windowTitle()
        self.window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,self.menu,force,submenu=self.submenu)
        self.connect(self.window_item,QtCore.SIGNAL('triggered()'),self.raise_)

    def UnClose(self):
        if MAINWINDOW():
          win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,"Windows")
	  if win_menu:
                window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,"Windows")
		if window_item: self.connect(window_item,QtCore.SIGNAL('triggered()'),self.raise_)
        self.show()
        self.raise_()

    def Close(self):
        if MAINWINDOW():
          win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,"Windows")
	  if win_menu:
                MAINWINDOW().removeMenuDefinition(self.windowTitle(),self.menu_defn,"Windows")
		win_menu.removeAction(self.window_item)
        self.hide()

    def minimumSizeHint(self):
        return QtCore.QSize(50, 50)

    #def sizeHint(self):
    #    return QtCore.QSize(300, 100)

    def __init__(self,parent=None,menu='Tools',submenu=None):
        self.menu = menu
        self.submenu = submenu
        self.menu_defn = dict (
        text = 'Simple Dialog',
        shortcut = '',
        #icon = 'info',
        tip = 'Simple Dialog',
        signal = 'triggered()',
        slot = self.UnClose,
        checkable = 0,
        initialise = ''
        )
        QtGui.QDialog.__init__(self,parent)
        self.setWindowFlags(QtCore.Qt.Dialog)
        self.setModal(0)
        self.setSizeGripEnabled(0)
	self.window_item = None
        self.connect(self, QtCore.SIGNAL('finished(int)'), self.Close)
	self.setWindowFlags(QtCore.Qt.Window)
	self.connect(QtGui.QApplication.instance(),QtCore.SIGNAL("aboutToQuit()"),self.close)

#-------------------------------------------------------------------
    def getParams(self,params={}):
#-------------------------------------------------------------------
      import mgWidgets
      keyList = params.keys()
      for key in keyList:
        widget = self.findChild(QtGui.QWidget,key)
        value = ''
        if widget:
            if isinstance(widget,QtGui.QComboBox):
              value = str(widget.itemData(widget.currentIndex()).toString())
              if not value: value = str(widget.currentText())
            elif isinstance(widget,QtGui.QLabel):
              value = str(widget.text())
            elif isinstance(widget,QtGui.QLineEdit):
              value = str(widget.text())
            elif isinstance(widget,QtGui.QAbstractButton):
              value = int(widget.isChecked())
            elif isinstance(widget,mgWidgets.mgSelectionCombo):
              value = str(widget.text())
            elif isinstance(widget,mgWidgets.mgColourCombo):
              value = str(widget.get_colour())
            elif isinstance(widget,mgWidgets.mgAtomPicker):
              value = str(widget.selection())
            elif isinstance(widget,QtGui.QDoubleSpinBox):
              value = float(widget.value())
            elif isinstance(widget,QtGui.QSpinBox):
              value = int(widget.value())

        params[key] = value

      #print "MGSimpleDialog.getParams",params
      return params

#----------------------------------------------------------------
    def setParams(self,params):
#----------------------------------------------------------------
      import mgWidgets
      # Beware - do not assume that all items in params are
      # in our widget
      keyList = params.keys()

      #print "MGSimpleDialog.setParams",params,keyList

      for key in keyList:
        widget = self.findChild(QtGui.QWidget,key)
        #print "MGSimpleDialog.setParams",key,widget,params[key]
        if widget:
          if isinstance(widget,QtGui.QComboBox):
            ic = widget.findText(QtCore.QString(params[key]))
            if ic < 0:
              ic = widget.findData(QtCore.QVariant(params[key]))
            if ic>=0: widget.setCurrentIndex(ic)
          elif isinstance(widget,QtGui.QLineEdit):
            widget.setText(str(params[key]))
          elif isinstance(widget,QtGui.QLabel):
            widget.setText(str(params[key]))
          elif isinstance(widget,QtGui.QAbstractButton):
            widget.setChecked(params[key])
          elif isinstance(widget,mgWidgets.mgSelectionCombo):
            widget.setText(params[key])
          elif isinstance(widget,mgWidgets.mgColourCombo):
            widget.set_colour(params[key])
          elif isinstance(widget,mgWidgets.mgAtomPicker):
            widget.setSelection(atomName=value)
          elif isinstance(widget,QtGui.QDoubleSpinBox):
            widget.setValue(float(params[key]))
          elif isinstance(widget,QtGui.QSpinBox):
            widget.setValue(int(params[key]))


class MultiDialog(MGSimpleDialog):
    """
    For dialogs we expect to have possible multiple copies of simultaneously.
    """

    def setWindowTitle(self,title):
        win_menu = MAINWINDOW().menuBar().findChild(QtGui.QMenu,self.menu)
        max_dup_idx = 0
        duplicate = 0
        for action in win_menu.actions():
          if action.text()[:len(title)] == title:
             duplicate = 1
             if hasattr(self,'window_item') and self.window_item is not action:
               if str(action.text()).rfind('(') > -1 and str(action.text()).rfind(')') > 1:
                 try:
                   idx = int(action.text()[str(action.text()).rfind('(')+1:str(action.text()).rfind(')')])
                   if idx > max_dup_idx:
                      max_dup_idx = idx
                 except:
                   pass
        if duplicate:
           if max_dup_idx == 0:
              title = title + ' (2)'
           else:
              title = title + ' ('+str(max_dup_idx+1)+')'
        if hasattr(self,'window_item') and hasattr(self.window_item,'setText'):
          self.window_item.setText(title)
        QtGui.QDialog.setWindowTitle(self,title)

    def CreateMenuEntry(self,force=0):
        #self.window_item = QtGui.QAction(self)
        #self.window_item.setText(self.windowTitle())
        self.menu_defn["text"] = self.windowTitle()+'..'
        self.menu_defn["tip"] = self.windowTitle()
        self.window_item = MAINWINDOW().addMenuDefinition(self.windowTitle(),self.menu_defn,self.menu,force)
        self.connect(self.window_item,QtCore.SIGNAL('triggered()'),self.raise_)
        
    def __init__(self,parent=None,menu='Tools'):
        MGSimpleDialog.__init__(self,parent,menu=menu)
        self.setSizeGripEnabled(0)

class MGSimpleDockDialog(MGSimpleDialog):
    def keyPressEvent(self,e):
        pass

    def tabify(self,area):
	mainwin = MAINWINDOW()
        others = mainwin.findChildren(QtGui.QDockWidget)
        for other in others:
            if (not other is self.dockWidget) and mainwin.dockWidgetArea(other) == area:
		self.dockWidget.blockSignals(True)
                mainwin.tabifyDockWidget(other,self.dockWidget)	
		self.dockWidget.blockSignals(False)

    def setWindowTitle(self,title):
        MGSimpleDialog.setWindowTitle(self,title)
        #print self, self.dockWidget
        self.dockWidget.setWindowTitle(title)

    def __init__(self,parent=None,menu='Tools',submenu=None,defaultDockArea=QtCore.Qt.BottomDockWidgetArea,tabify=True,dockable=True):
        MGSimpleDialog.__init__(self,parent,menu,submenu)
        self.dockWidget = QtGui.QDockWidget(parent)
        self.dockWidget.setWidget(self)

        if defaultDockArea!=QtCore.Qt.NoDockWidgetArea:
          MAINWINDOW().addDockWidget(defaultDockArea,self.dockWidget)

        self.dockWidget.hide()
	if tabify:
	   self.tabify(defaultDockArea)
	self.connect(self.dockWidget.toggleViewAction(),QtCore.SIGNAL("triggered(bool)"),self.dockWidget.raise_)
	self.connect(self.dockWidget,QtCore.SIGNAL("visibilityChanged(bool)"),self.visChanged)

        if defaultDockArea==QtCore.Qt.NoDockWidgetArea:
          self.dockWidget.setFloating(True) 

    def visChanged(self,truth):
        if not truth:
          if hasattr(self.dockWidget.widget(),"scrollarea") and hasattr(self.dockWidget.widget().scrollarea,"widget"):
            if self.dockWidget.widget().scrollarea.widget() is DISPLAYTABLE():
              return
          if not MAINWINDOW().wMGDisplayTable.dockWidget.isFloating() and MAINWINDOW().dockWidgetArea(self.dockWidget) == MAINWINDOW().dockWidgetArea(MAINWINDOW().wMGDisplayTable.dockWidget):
            MAINWINDOW().wMGDisplayTable.UnCloseNoUpdate()

    def UnClose(self):
        if hasattr(self,"dockWidget"):
           self.dockWidget.show()
           self.dockWidget.raise_()
	   #print "raise",self
	   sys.stdout.flush()
           return
        self.show()

    def Close(self):
        self.dockWidget.hide()
