
import os,sys
import time

try:
  # Required for CCP4MG 2.8.0 onwards
  # Sets sys.path so that import of mg modules will work from here onwards.
  import ccp4mg
except:
  pass
    
def getCCP4I2Dir(up=1):
	target = os.path.join(os.path.realpath(sys.argv[0]),"..")
	abstarget = os.path.abspath(target)
        splittarget = abstarget.split()
        if splittarget.count('ccp4i2'):
          splittarget.reverse()
          up = splittarget.index('ccp4i2')
        while up>0:
          abstarget = os.path.dirname(abstarget)
          up = up -1
        return abstarget

if __name__ == '__main__':

        import sip
        sip.setdestroyonexit( False )

        top_path = getCCP4I2Dir()
	print 'Running CCP4i2 browser from: '+top_path
	print 'Python '+sys.version
        try:
          from PyQt4 import QtCore,QtGui
          print 'Qt version',QtCore.qVersion()
        except:
          print'Failed finding Qt verion'
	print ' '

        class BevelledSplashScreen(QtGui.QSplashScreen):
          def __init__(self,pixmap):
             QtGui.QSplashScreen.__init__(self,pixmap)

          def drawContents(self,painter):
             QtGui.QSplashScreen.drawContents(self,painter)
             path = QtGui.QPainterPath()
             border_width = 4
             path.moveTo(0,0)
             path.lineTo(border_width,border_width)
             path.lineTo(border_width,self.height()-(border_width))
             path.lineTo(0,self.height())
             path.lineTo(0,0)
             pen = QtGui.QPen(QtGui.QColor(0,0,0))
             painter.setPen(pen)
             #brush = QtGui.QBrush(endColour)
             startColour = QtGui.QColor(255,255,255)
             endColour = QtGui.QColor(96,96,96)
             linearGrad = QtGui.QLinearGradient(QtCore.QPointF(10, 0),QtCore.QPointF(0, 0))
             linearGrad.setColorAt(0,startColour)
             linearGrad.setColorAt(1,endColour)
             brush = QtGui.QBrush(linearGrad)
             painter.fillPath(path,brush)
             path = QtGui.QPainterPath()
             path.moveTo(self.width(),0)
             path.lineTo(self.width()-(border_width),border_width)
             path.lineTo(self.width()-(border_width),self.height()-(border_width))
             path.lineTo(self.width(),self.height())
             path.lineTo(self.width(),0)
             #brush = QtGui.QBrush(QtGui.QColor(128,128,128))
             startColour = QtGui.QColor(255,255,255)
             endColour = QtGui.QColor(96,96,96)
             linearGrad = QtGui.QLinearGradient(QtCore.QPointF(self.width()-(border_width), 0),QtCore.QPointF(self.width()-1, 0))
             linearGrad.setColorAt(0,startColour)
             linearGrad.setColorAt(1,endColour)
             brush = QtGui.QBrush(linearGrad)
             painter.fillPath(path,brush)
             path = QtGui.QPainterPath()
             path.moveTo(0,0)
             path.lineTo(border_width,border_width)
             path.lineTo(self.width()-(border_width+1),border_width)
             path.lineTo(self.width(),0)
             path.lineTo(0,0)
             #brush = QtGui.QBrush(QtGui.QColor(192,192,192))
             startColour = QtGui.QColor(255,255,255)
             endColour = QtGui.QColor(160,160,160)
             linearGrad = QtGui.QLinearGradient(QtCore.QPointF(0,border_width),QtCore.QPointF(0,0))
             linearGrad.setColorAt(0,startColour)
             linearGrad.setColorAt(1,endColour)
             brush = QtGui.QBrush(linearGrad)
             painter.fillPath(path,brush)
             path = QtGui.QPainterPath()
             path.moveTo(0,self.height())
             path.lineTo(border_width,self.height()-(border_width))
             path.lineTo(self.width()-(border_width),self.height()-(border_width))
             path.lineTo(self.width(),self.height())
             path.lineTo(0,self.height())
             #brush = QtGui.QBrush(QtGui.QColor(64,64,64))
             startColour = QtGui.QColor(255,255,255)
             endColour = QtGui.QColor(32,32,32)
             linearGrad = QtGui.QLinearGradient(QtCore.QPointF(0,self.height()-(border_width+1)),QtCore.QPointF(0,self.height()-1))
             linearGrad.setColorAt(0,startColour)
             linearGrad.setColorAt(1,endColour)
             brush = QtGui.QBrush(linearGrad)
             painter.fillPath(path,brush)

        #execfile(os.path.join(top_path,'utils','startup.py'))
        sys.path.append(os.path.join(top_path,'utils'))
        from startup import setupEnvironment,setupPythonpath,setupGuiPluginsPath,startBrowser
	setupEnvironment()
	
	setupPythonpath(top=top_path,mode='qtgui')
	setupGuiPluginsPath(top=top_path)
	from CCP4Modules import QTAPPLICATION
	app = QTAPPLICATION(graphical=True)

        splash = None
        # This splash screen is not used properly as it does not wait for any window.
        # However it does seem to set whatever is necessary to get the app to switch to the
        # correct menu bar on OS X.
        #if sys.platform == "darwin":

        """
        pixmap = QtGui.QPixmap(os.path.join(os.environ["CCP4I2"],"qticons/ccp4i2.png"))

        """
        import splash_screen_b64
        image = QtGui.QImage()
        image.loadFromData(QtCore.QByteArray.fromBase64(splash_screen_b64.splash_screen_data), "PNG");
        print image.width(), image.height()
        pixmap = QtGui.QPixmap.fromImage(image)

        pix2 = QtGui.QPixmap(pixmap)

        pix2.fill(QtCore.Qt.white)
        painter = QtGui.QPainter()
        painter.begin(pix2)
        painter.drawPixmap(0,0,pixmap)
        painter.end()
        splash = BevelledSplashScreen(pix2)
        #import version
        version_string = '1.0'#splash.tr("CCP4MG version ") + QtCore.QString(version.ccp4mg_version)
        splash.showMessage(splash.tr("Starting ")+version_string+"...   ",QtCore.Qt.AlignRight|QtCore.Qt.AlignBottom,QtCore.Qt.black)
        splash.show()
        time.sleep(0.05) # Fix for Linux splashscreen issue.
        splash.repaint()
        splash.raise_()
        splash.update()

	import os
	if not os.environ.has_key('CCP4'):
	  from PyQt4 import QtGui
	  box =  QtGui.QMessageBox()
	  box.setText('CCP4 not setup - programs will not run.\nPlease exit and setup CCP4 before restarting.')
	  box.setWindowTitle('No CCP4 setup')
	  box.addButton('Continue',QtGui.QMessageBox.YesRole)
	  box.addButton('Exit',QtGui.QMessageBox.NoRole)
	  box.show()
	  box.raise_()
	  reply = box.exec_()
	  if reply == 1: sys.exit()

        #print 'browser.py argv',sys.argv

        if "--profile" in sys.argv:
          import cProfile, pstats, StringIO, atexit
          pr = cProfile.Profile()
          pr.enable()

          while "--profile" in sys.argv:
            sys.argv.remove("--profile")

          print "Profiling"
	  startBrowser(sys.argv[1:],app=app,splash=splash)

          def printStats():
            pr.disable()
            s = StringIO.StringIO()
            sortby = 'cumulative'
            ps = pstats.Stats(pr, stream=s).sort_stats(sortby).reverse_order()
            ps.print_stats()
            print s.getvalue()

          atexit.register(printStats)

	  sys.exit(app.exec_())

        else:
	  startBrowser(sys.argv[1:],app=app,splash=splash)
	  sys.exit(app.exec_())
	
