"""
     CCP4Modules.py: CCP4 GUI Project
     Copyright (C) 2009-2010 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.
"""

"""
   Liz Potterton Jan 2010 - 
"""


from CCP4Config import GRAPHICAL  

def QTAPPLICATION(graphical=None):
  import sys
  import QApp
  # NB can not use QApplication.instance() as it returns the QApplication object
  # rather than CApplication. Spose could reimplement CApplication.instance() but
  # would just do the sae as this function
  if graphical is None: graphical = GRAPHICAL()
  if QApp.MYAPPLICATION is None:
    #print 'Starting Qt, graphical mode:',graphical
    if graphical:
      QApp.MYAPPLICATION = QApp.CGuiApplication(sys.argv)
    else:
      QApp.MYAPPLICATION = QApp.CApplication(sys.argv)
  return QApp.MYAPPLICATION


def PROJECTSMANAGER():
  import CCP4ProjectsManager
  if CCP4ProjectsManager.CProjectsManager.insts is None:
    #print 'CCP4Modules.PROJECTSMANAGER setting new'
    #import traceback
    #traceback.print_stack()
    CCP4ProjectsManager.CProjectsManager.insts= CCP4ProjectsManager.CProjectsManager()
  return CCP4ProjectsManager.CProjectsManager.insts

def PROCESSMANAGER():
  import CCP4ProcessManager
  if CCP4ProcessManager.CProcessManager.insts is None:
   t = CCP4ProcessManager.CProcessManager()
  return CCP4ProcessManager.CProcessManager.insts


def LAUNCHER():
  import CCP4Launcher
  if CCP4Launcher.CLauncher.insts is None:
    parent = QTAPPLICATION()
    t = CCP4Launcher.CLauncher(parent)
  return CCP4Launcher.CLauncher.insts


# Modules below here are graphical

def PIXMAPMANAGER():
  import CCP4Widgets
  if CCP4Widgets.CPixmapManager.insts is None:
    t = CCP4Widgets.CPixmapManager()
  return CCP4Widgets.CPixmapManager.insts



def WEBBROWSER(index = -1,new=False,mini=False):
  import CCP4WebBrowser
  if new or (len(CCP4WebBrowser.CBrowserWindow.Instances)==0 and index<0):
    t = CCP4WebBrowser.CBrowserWindow(welcome=False)
    if mini: t.setMini(True)
    t.show()
    t.raise_()
    return t
  index = min(index,0)
  if index<len(CCP4WebBrowser.CBrowserWindow.Instances):
    win = list(CCP4WebBrowser.CBrowserWindow.Instances)[index]
    print 'WEBBROWSER raise_'
    try:
      win.raise_()
    except:
      pass
    return win
  else:
    return None

def DUMMYMAINWINDOW():
  import CCP4WebBrowser
  if CCP4WebBrowser.CBrowserWindow.Dummy is None:
    CCP4WebBrowser.CBrowserWindow.Dummy = CCP4WebBrowser.CBrowserWindow()
    CCP4WebBrowser.CBrowserWindow.Dummy.hide()
    try:
      CCP4WebBrowser.CBrowserWindow.Instances.remove(CCP4WebBrowser.CBrowserWindow.Dummy)
    except:
      print 'Error in CCP4Modules.DUMMYMAINWINDOW'
  return CCP4WebBrowser.CBrowserWindow.Dummy


def JOBCONTROLLER():
  import CCP4JobController
  if not CCP4JobController.CJobController.insts: CCP4JobController.CJobController()
  return CCP4JobController.CJobController.insts


def MIMETYPESHANDLER():
  import CCP4CustomMimeTypes
  if not CCP4CustomMimeTypes.CCustomMimeTypes.insts:
    t = CCP4CustomMimeTypes.CCustomMimeTypes()
  return CCP4CustomMimeTypes.CCustomMimeTypes.insts

def TASKMANAGER():
  import CCP4TaskManager
  if CCP4TaskManager.CTaskManager.insts is None:
      CCP4TaskManager.CTaskManager.insts = CCP4TaskManager.CTaskManager()
  return CCP4TaskManager.CTaskManager.insts

def WORKFLOWMANAGER():
  import CCP4WorkflowManager
  if CCP4WorkflowManager.CWorkflowManager.insts is None:
      CCP4WorkflowManager.CWorkflowManager.insts = CCP4WorkflowManager.CWorkflowManager()
  return CCP4WorkflowManager.CWorkflowManager.insts

def COMFILEPATCHMANAGER():
  import CCP4ComFilePatchManager
  if CCP4ComFilePatchManager.CComFilePatchManager.insts is None:
      CCP4ComFilePatchManager.CComFilePatchManager.insts = CCP4ComFilePatchManager.CComFilePatchManager()
  return CCP4ComFilePatchManager.CComFilePatchManager.insts

def CUSTOMTASKMANAGER():
  import CCP4CustomTaskManager
  if CCP4CustomTaskManager.CCustomTaskManager.insts is None:
    CCP4CustomTaskManager.CCustomTaskManager.insts = CCP4CustomTaskManager.CCustomTaskManager()
  return CCP4CustomTaskManager.CCustomTaskManager.insts

def IMPORTEDJOBMANAGER():
  import CCP4ImportedJobManager
  if CCP4ImportedJobManager.CImportedJobManager.insts is None:
    CCP4ImportedJobManager.CImportedJobManager.insts = CCP4ImportedJobManager.CImportedJobManager()
  return CCP4ImportedJobManager.CImportedJobManager.insts

def PREFERENCES():
  import CCP4Preferences
  if CCP4Preferences.CPreferences.insts is None:
    p = CCP4Preferences.CPreferences()
  return CCP4Preferences.CPreferences.insts

  
def PRINTHANDLER():
  import CCP4PrintHandler
  if CCP4PrintHandler.CPrintHandler.insts is None:
    obj = CCP4PrintHandler.CPrintHandler()
  return CCP4PrintHandler.CPrintHandler.insts

def HTTPSERVER():
  import CCP4HTTPServerThread
  if CCP4HTTPServerThread.CHTTPServerThread.insts is None:
    obj = CCP4HTTPServerThread.CHTTPServerThread.insts
  return CCP4HTTPServerThread.CHTTPServerThread.insts

def DBSERVER():
  import CCP4DbThread
  if CCP4DbThread.CDbThread.insts is None:
    obj = CCP4DbThread.CDbThread()
    obj.start()
  return CCP4DbThread.CDbThread.insts

def FILEWATCHER():
  import CCP4AbstractViewer
  if CCP4AbstractViewer.CFileWatchTimer.insts is None:
    CCP4AbstractViewer.CFileWatchTimer.insts =  CCP4AbstractViewer.CFileWatchTimer()
  return CCP4AbstractViewer.CFileWatchTimer.insts


def DEMODATAMANAGER():
  import CCP4DemoData
  if CCP4DemoData.CDemoData.insts is None:
    CCP4DemoData.CDemoData.insts =  CCP4DemoData.CDemoData()
  return CCP4DemoData.CDemoData.insts

def JOBCONTROLLERGUI():
  import CCP4JobControlGui
  if CCP4JobControlGui.CServerParamsDialog.insts is None:
     CCP4JobControlGui.CServerParamsDialog.insts = CCP4JobControlGui.CServerParamsDialog()
  return  CCP4JobControlGui.CServerParamsDialog.insts

def SERVERSETUP():
  import CCP4JobController
  if CCP4JobController.CServerSetup.insts is None:
    p = CCP4JobController.CServerSetup()
  return CCP4JobController.CServerSetup.insts
