'''
Created on 2 Jul 2015

@author: Shirley Crompton, UK Science and Technology Facilities Council
'''
import logging
import os
from PyQt5 import QtGui, QtWidgets
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot

class Ncml_tab(QtWidgets.QWidget):
    '''
    tab contents to define child aggregation
    '''
    def __init__(self, tabName):
        '''
        Initialises the UI components
        '''
        super(Ncml_tab, self).__init__() 
        self.logger = logging.getLogger(__name__)
        self.var= tabName  # tabName is used to determine the set of netcdf variables to process
        #print self.var
        #self.value_dict = {} # to capture the user inputs
    
        # no params yet, may be allow user to predefine an input ncml for edit????    
        self.initUI()
        
        
    def initUI(self):  
        QtWidgets.QToolTip.setFont(QtGui.QFont('SansSerif', 11))
        self.varStackedWidget = QtWidgets.QStackedWidget()                   
        #variable chooser combobox
        combo_vars = []
        if(self.var == "Tracer"):
            combo_vars = ['temperature','salinity'] #votemper, vosaline
            self.votemper = ncml_variable('temperature','votemper')
            self.vosaline = ncml_variable('salinity','vosaline')
            self.varStackedWidget.addWidget(self._addStackWidget("votemper"))
            self.varStackedWidget.addWidget(self._addStackWidget("vosaline"))
            #debug
#            print 'Tracer has ' + str(self.varStackedWidget.count())
        elif(self.var == "Ice"):
            combo_vars = ['ice thickness','leads fraction','snow thickness'] #'iicethic,ileadfra,isnowthi
            self.iicethic = ncml_variable('ice_thickness','iicethic')
            self.ileadfra = ncml_variable('leads_fraction','ileadfra')
            self.isnowthi = ncml_variable('snow_thickness','isnowthi')
            self.varStackedWidget.addWidget(self._addStackWidget("iicethic"))
            self.varStackedWidget.addWidget(self._addStackWidget("ileadfra"))
            self.varStackedWidget.addWidget(self._addStackWidget("isnowthi"))
#            print 'Ice has ' + str(self.varStackedWidget.count())
        elif(self.var == "Dynamics"):
            combo_vars = ['zonal velocity', 'meridian velocity', 'sea surface height'] #vozocrtx, vomecrty, sossheig
            self.vozocrtx = ncml_variable('zonal_velocity','vozocrtx')
            self.vomecrty = ncml_variable('meridian_velocity','vomecrty')
            self.sossheig = ncml_variable('sea_surface_height','sossheig')
            self.varStackedWidget.addWidget(self._addStackWidget("vozocrtx"))
            self.varStackedWidget.addWidget(self._addStackWidget("vomecrty"))
            self.varStackedWidget.addWidget(self._addStackWidget("sossheig"))
#            print 'Dynamics has ' + str(self.varStackedWidget.count())
        elif(self.var == "Grid"):
            combo_vars = ['depth at T points', 
                          'depth at W points', 
                          'number of wet levels', 
                          'vertical scale factor at T points', 
                          'vertical scale factor at U points', 
                          'vertical scale factor at V points'] #gdept,gdepw,mbathy
            self.gdept = ncml_variable('depth_at_t_points','gdept')
            self.gdepw = ncml_variable('depth_at_w_points','gdepw')
            self.mbathy = ncml_variable('number_of_wet_levels','mbathy')
            self.e3t = ncml_variable('vertical_scale_factors_at_t_points','e3t')
            self.e3u = ncml_variable('vertical_scale_factors_at_u_points','e3u')
            self.e3v = ncml_variable('vertical_scale_factors_at_v_points','e3v')
            self.varStackedWidget.addWidget(self._addStackWidget("gdept"))
            self.varStackedWidget.addWidget(self._addStackWidget("gdepw"))
            self.varStackedWidget.addWidget(self._addStackWidget("mbathy"))
            self.varStackedWidget.addWidget(self._addStackWidget("e3t"))
            self.varStackedWidget.addWidget(self._addStackWidget("e3u"))
            self.varStackedWidget.addWidget(self._addStackWidget("e3v"))
#            print 'Grid has ' + str(self.varStackedWidget.count())
        elif(self.var == "Ecosysem"):
            vars = ['nitrate','silicate'] #nitrate, silicate
        self.varStackedWidget.setCurrentIndex(0)  #we rely on the stacked tab index to be the same as the combo box 
        #combo box     
        self.var_combo = QtWidgets.QComboBox()
        self.var_combo.addItems(combo_vars)
        self.var_combo.setEditable(False)
        self.var_combo.setCurrentIndex(0)
        #the value if not saved is cached during the session, we can wait until the add button is pressed
        self.var_combo.currentIndexChanged.connect(lambda var_name = self.var : self.src_combo_changed(var_name))
        self.var_combo.currentIndexChanged.connect(self.setWidgetStack)
        #label
        var_label = QtWidgets.QLabel('Variable')
        #set layout
        stacked_hBox = QtWidgets.QHBoxLayout()
        stacked_hBox.setContentsMargins(5, 5, 5, 5)
        stacked_hBox.setSpacing(50) # spacing between items
        stacked_hBox.setAlignment(QtCore.Qt.AlignLeft)
        stacked_hBox.addWidget(var_label)
        stacked_hBox.addWidget(self.var_combo)
        #
        vBoxLayout = QtWidgets.QVBoxLayout()        
        vBoxLayout.addLayout(stacked_hBox)
        vBoxLayout.addWidget(self.varStackedWidget)
        #
        grp_box = QtWidgets.QGroupBox(None)
        grp_box.setLayout(vBoxLayout)
                        
        '''
        :TODO Need to add the override time gui widgets
        '''
        
        
        '''
        button bar
        '''
        # reset button
        reset_btn = QtWidgets.QPushButton('Reset')
        reset_btn.setToolTip('Reset fields to previously saved values')
        add_btn = QtWidgets.QPushButton('Add') 
        add_btn.setDefault(True)
        add_btn.setToolTip('Add the current definition to the NcML')
        #connect up with events
        reset_btn.clicked.connect(self.reset_tab)
        add_btn.clicked.connect(self.add_tab)
       
        btn_hBox = QtWidgets.QHBoxLayout(None)
        btn_hBox.setContentsMargins(5, 5, 5, 5)
        btn_hBox.setSpacing(10)
        btn_hBox.setAlignment(QtCore.Qt.AlignCenter)
        btn_hBox.addWidget(reset_btn)
        btn_hBox.addWidget(add_btn)
        
        #build the contents         
        vbox = QtWidgets.QVBoxLayout(self)
        vbox.setSpacing(10)
        vbox.setContentsMargins(10, 10, 5, 5)
        vbox.addWidget(grp_box)
        vbox.addLayout(btn_hBox)
    '''
    create the stacked widget for each nemo variable
    '''    
    def _addStackWidget(self, old_name=""):
        self.varWidget = QtWidgets.QWidget()
        #self.varWidget.setObjectName(objName)
        varLayout = QtWidgets.QGridLayout()
        varLayout.setSpacing(20)
               
        #labels
        src_label = QtWidgets.QLabel('Source directory*')  
        cbox_label = QtWidgets.QLabel('Includes subdirs')
        regex_label = QtWidgets.QLabel('Regular expression')
        old_name_label = QtWidgets.QLabel('Existing variable name*')        
        #input textboxs
        self.varWidget.src_tedit = QtWidgets.QLineEdit()       # input widgets need to be attached to the stacked widget itself 
        self.varWidget.src_tedit.setToolTip('either remote OPeNDAP server or local file absolute path')
        self.varWidget.src_tedit.returnPressed.connect(self.src_tedit_edited)
        
        
        self.varWidget.cbox = QtWidgets.QCheckBox()
        self.varWidget.cbox.setCheckable(True)
        self.varWidget.cbox.setChecked(False)
        self.varWidget.cbox.setToolTip('includes subdirectories')
        self.varWidget.regex_tedit = QtWidgets.QLineEdit()
        self.varWidget.regex_tedit.setToolTip('see http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/ncml/AnnotatedSchema4.html#regexp')
        self.varWidget.old_name_tedit = QtWidgets.QLineEdit()
        self.varWidget.old_name_tedit.setToolTip('variable name in data file')
        self.varWidget.old_name_tedit.setText(old_name)
        
        varLayout.addWidget(src_label, 1, 0, 1, 1)
        varLayout.addWidget(self.varWidget.src_tedit, 1, 1, 1, 3)
        varLayout.addWidget(cbox_label, 2, 0, 1, 1)
        varLayout.addWidget(self.varWidget.cbox, 2, 1, 1, 1)        
        varLayout.addWidget(regex_label, 2, 2, 1, 1)
        varLayout.addWidget(self.varWidget.regex_tedit, 2, 3, 1, 1)
        varLayout.addWidget(old_name_label, 3, 0, 1, 1)
        varLayout.addWidget(self.varWidget.old_name_tedit, 3, 1, 1, 3)
        
        self.varWidget.setLayout(varLayout)
        return self.varWidget
    '''
    synchronise stack widget display with combo box value changed callback
    '''
    @pyqtSlot()
    def setWidgetStack(self):
        self.varStackedWidget.setCurrentIndex(self.var_combo.currentIndex())
    '''
    variable combo box value changed callback
    '''
    @pyqtSlot()
    def src_combo_changed(self, var_name):  
        #not sure why the current text is prefixed by the index : eg 0temperature      
#        print 'src_combo_value_changed to : ' + str(var_name) +  unicode(str(self.var_combo.currentText())).encode('utf_8')
        pass
        
        
    @pyqtSlot()
    def src_tedit_edited(self):
        src_tedit_input = self.varStackedWidget.currentWidget().src_tedit.text()
#        print 'src_edit text edited : ', src_tedit_input
        #validate the input now
        if not str(src_tedit_input).startswith('http'): 
            if not os.path.isabs(src_tedit_input): #assumes local file
                QtWidgets.QMessageBox.critical(self, 'Something is wrong', 'source directory must be an absolute path!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                self.varStackedWidget.currentWidget().src_tedit.clear()
            if not os.path.exists(src_tedit_input) :
                QtWidgets.QMessageBox.critical(self, 'Something is wrong', 'source directory does not exist!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                self.varStackedWidget.currentWidget().src_tedit.clear()   
    '''
    reset button pushed callback.  The widgets are reset to default values
    '''
    @pyqtSlot()  
    def reset_tab(self):        
        #current screen value is not saved until the add button is pressed
        #reset only reset the screen values, not the cached values        
        if self.var_combo.currentText() == "temperature":
#            print 'reset button is pushed, temperature ....'
            self.resetValues(self.votemper)
        elif self.var_combo.currentText() == "salinity":
            self.resetValues(self.vosaline)
        elif self.var_combo.currentText() == "ice thickness":
            self.resetValues(self.iicethic)
        elif self.var_combo.currentText() == "leads fraction":
            self.resetValues(self.ileadfra)
        elif self.var_combo.currentText() == "snow thickness":
            self.resetValues(self.isnowthi)
        elif self.var_combo.currentText() == "zonal velocity":
            self.resetValues(self.vozocrtx) 
        elif self.var_combo.currentText() == "meridian velocity":
            self.resetValues(self.vomecrty)
        elif self.var_combo.currentText() == "sea surface height":
            self.resetValues(self.sossheig)  
        elif self.var_combo.currentText() == "depth at T points":
            self.resetValues(self.gdept)   
        elif self.var_combo.currentText() == "depth at W points":
            self.resetValues(self.gdepw)   
        elif self.var_combo.currentText() == "number of wet levels":
            self.resetValues(self.mbathy)   
        elif self.var_combo.currentText() == "vertical scale factor at T points":
            self.resetValues(self.e3t)   
        elif self.var_combo.currentText() == "vertical scale factor at U points":
            self.resetValues(self.e3u)   
        elif self.var_combo.currentText() == "vertical scale factor at V points":
            self.resetValues(self.e3v)   
            
    '''
    reset the stacked widget values
    '''    
    def resetValues(self, currentValues = None):
        # 'in resetValues ....'
        if currentValues is None:
            #self.var_combo.setCurrentIndex(0)    #we don't reset this, as this is the key
            self.varStackedWidget.currentWidget().src_tedit.clear()
            self.varStackedWidget.currentWidget().regex_tedit.clear()
            self.varStackedWidget.currentWidget().old_name_tedit.clear()
            self.varStackedWidget.currentWidget().cbox.setChecked(False)
        else:
            #print 'name : ' + currentValues.name + ', src: ' + currentValues.src + ', regex: ' +  currentValues.regex + ', old_name: ' + currentValues.old_name
            #self.var_combo.setCurrentIndex(0)
            self.varStackedWidget.currentWidget().src_tedit.setText(currentValues.src)
            self.varStackedWidget.currentWidget().regex_tedit.setText(currentValues.regex)
            self.varStackedWidget.currentWidget().old_name_tedit.setText(currentValues.old_name)
            self.varStackedWidget.currentWidget().cbox.setChecked(currentValues.subdirs)
        
    '''
    add button pushed call back
    '''
    @pyqtSlot()  
    def add_tab(self): 
        #first validate the src tab is not null
        if(self.varStackedWidget.currentWidget().src_tedit.text() is None or self.varStackedWidget.currentWidget().src_tedit.text() == '' or               
           self.varStackedWidget.currentWidget().old_name_tedit.text() is None or self.varStackedWidget.currentWidget().old_name_tedit.text() == ''):
                QtWidgets.QMessageBox.critical(self, 'Something is wrong', 'source directory and existing variable name cannot be blank!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
        else:
            '''        
            if not str(target).startsWith(unicode('http').encode('utf-8')):
                if os.path.exists(os.path.normpath(target)) == False:
                    QMessageBox.critical(self, unicode('Something is wrong').encode('utf-8'), unicode('source directory does not exist!').encode('utf-8'), QMessageBox.Ok, QMessageBox.Ok)
                    return #breakout now 
            '''
            #print type(self.var) = str   
            # effort to speed string entry up: on the first entry of the src directory - go populate other variables as they're most likely to 
            # be in the same directory.


            if(self.var == "Tracer"):                
                if (self.var_combo.currentText() == "temperature"):            
                    if(self._sameValues(self.votemper)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:   
                        self.votemper.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.votemper.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        self.votemper.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.votemper.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.votemper.regex = ''    #blank it over    
                else: # can only be salinity
                    if(self._sameValues(self.vosaline)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.vosaline.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.vosaline.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        self.vosaline.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.vosaline.regex = self.varStackedWidget.currentWidget().regex_tedit.text()                            
                        else:
                            self.vosaline.regex = ''
                if self.votemper.src == '':
                    self.votemper.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(0).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.vosaline.src == '':
                    self.vosaline.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(1).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
            elif(self.var == 'Ice'): #iicethic,ileadfra,isnowthi
                if (self.var_combo.currentText() == "ice thickness"):            
                    if(self._sameValues(self.iicethic)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.iicethic.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.iicethic.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.iicethic.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.iicethic.regex = self.varStackedWidget.currentWidget().regex_tedit.text() 
                        else:
                            self.iicethic.regex = ''                       
                elif(self.var_combo.currentText() == "leads fraction"): 
                    if(self._sameValues(self.ileadfra)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.ileadfra.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.ileadfra.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.ileadfra.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.ileadfra.regex = self.varStackedWidget.currentWidget().regex_tedit.text()                            
                        else:
                            self.ileadfra.regex = ''
                else:
                    if(self._sameValues(self.isnowthi)): #snow thickness
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.isnowthi.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.isnowthi.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.isnowthi.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.isnowthi.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.isnowthi.regex = ''
                if self.iicethic.src == '':
                    self.iicethic.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(0).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.ileadfra.src == '':
                    self.ileadfra.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(1).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.isnowthi.src == '':
                    self.isnowthi.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(2).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
            elif(self.var == "Dynamics"):
                if (self.var_combo.currentText() == "zonal velocity"):            
                    if(self._sameValues(self.vozocrtx)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.vozocrtx.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.vozocrtx.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.vozocrtx.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.vozocrtx.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.vozocrtx.regex = ''
                elif(self.var_combo.currentText() == 'meridian velocity'): 
                    if(self._sameValues(self.vomecrty)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else: 
                        self.vomecrty.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.vomecrty.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.vomecrty.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.vomecrty.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.vomecrty.regex = ''
                elif(self.var_combo.currentText() == 'sea surface height'):      
                    if(self._sameValues(self.sossheig)): #sea surface height
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.sossheig.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.sossheig.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.sossheig.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.sossheig.regex = self.varStackedWidget.currentWidget().regex_tedit.text()  
                        else:
                            self.sossheig.regex = ''
                if self.vozocrtx.src == '':
                    self.vozocrtx.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(0).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.vomecrty.src == '':
                    self.vomecrty.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(1).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.sossheig.src == '':
                    self.sossheig.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(2).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
            elif(self.var == "Grid"):
                if (self.var_combo.currentText() == "depth at T points"):            
                    if(self._sameValues(self.gdept)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.gdept.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.gdept.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.gdept.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.gdept.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.gdept.regex = ''
                elif(self.var_combo.currentText() == 'depth at W points'): 
                    if(self._sameValues(self.gdepw)):
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else: 
                        self.gdepw.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.gdepw.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.gdepw.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.gdepw.regex = self.varStackedWidget.currentWidget().regex_tedit.text()
                        else:
                            self.gdepw.regex = ''
                elif(self.var_combo.currentText() == 'number of wet levels'):      
                    if(self._sameValues(self.mbathy)): #sea surface height
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.mbathy.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.mbathy.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.mbathy.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.mbathy.regex = self.varStackedWidget.currentWidget().regex_tedit.text()  
                        else:
                            self.mbathy.regex = ''
                elif(self.var_combo.currentText() == 'vertical scale factor at T points'):      
                    if(self._sameValues(self.e3t)): #sea surface height
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.e3t.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.e3t.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.e3t.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.e3t.regex = self.varStackedWidget.currentWidget().regex_tedit.text()  
                        else:
                            self.e3t.regex = ''
                elif(self.var_combo.currentText() == 'vertical scale factor at U points'):      
                    if(self._sameValues(self.e3u)): #sea surface height
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.e3u.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.e3u.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.e3u.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.e3u.regex = self.varStackedWidget.currentWidget().regex_tedit.text()  
                        else:
                            self.e3u.regex = ''
                elif(self.var_combo.currentText() == 'vertical scale factor at V points'):      
                    if(self._sameValues(self.e3v)): #sea surface height
                        QtWidgets.QMessageBox.information(self, 'For information', 'No changes have been made!', QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
                    else:
                        self.e3v.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                        self.e3v.subdirs = self.varStackedWidget.currentWidget().cbox.isChecked()
                        self.e3v.old_name = self.varStackedWidget.currentWidget().old_name_tedit.text()
                        if(self.varStackedWidget.currentWidget().regex_tedit.text() is not None or self.varStackedWidget.currentWidget().regex_tedit.text() != ''):
                            self.e3v.regex = self.varStackedWidget.currentWidget().regex_tedit.text()  
                        else:
                            self.e3v.regex = ''
                if self.gdept.src == '':
                    self.gdept.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(0).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.gdepw.src == '':
                    self.gdepw.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(1).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.mbathy.src == '':
                    self.mbathy.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(2).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.e3t.src == '':
                    self.e3t.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(3).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.e3u.src == '':
                    self.e3u.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(4).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
                if self.e3v.src == '':
                    self.e3v.src = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
                    self.varStackedWidget.widget(5).src_tedit.setText(self.varStackedWidget.currentWidget().src_tedit.text())
        
    '''
    convert the target folder into NcMl required format
    '''
    def _convertSrc(self, thepath):
        #print 'thepath before trimming ', thepath
        fpath = str(thepath.trimmed()) #24Aug15 trimmed whitespaces at both end of QString and then cast to string
        #print 'thepath after trimming and casting ', fpath
        #make sure thatit is an absolute path and prefixed with file:/ and uses / file separator
        if fpath.startswith('http:/'):
            target = fpath # do nothing 
        elif fpath.startswith('file:/'):
            temp = os.path.normpath(fpath[6:])
#            print 'normal path : ', temp
            target =  str('file:/' + str(os.path.abspath(temp)).replace("\\", "/")).encode('utf-8') 
        else: #should be local file but not prefixed by file:/  we still check for absolute path
#            print 'normal path : ', os.path.normpath(fpath)
            target = str('file:/' + str(os.path.abspath(fpath)).replace("\\", "/")).encode('utf-8')
        
 #       if not str(target).endswith('/'):
 #           target = target + '/'
            
        return target    
    
    '''   
    compare the gui cached values with the stored values
    '''   
    def _sameValues(self, ncml_var):
#        print 'before state - variable: ' + ncml_var.name + ', src: ' + ncml_var.src + ', regex: ' +  ncml_var.regex + ', old_name: ' + ncml_var.old_name
        target = self._convertSrc(self.varStackedWidget.currentWidget().src_tedit.text())
        
        if(target == ncml_var.src and \
           self.varStackedWidget.currentWidget().old_name_tedit.text() is not None and self.varStackedWidget.currentWidget().old_name_tedit.text() == ncml_var.old_name and \
           self.varStackedWidget.currentWidget().regex_tedit.text() is not None and self.varStackedWidget.currentWidget().regex_tedit.text() == ncml_var.regex and \
           self.varStackedWidget.currentWidget().cbox.isChecked() == ncml_var.subdirs):
            return True
        else:
            return False
'''
convenient class to hold the user input for each variable
'''   
class ncml_variable(object):
    '''
    convenient class to hold the values for a ncml variable
    '''
    def __init__(self, varName, old_name=''):
        #print 'created ncml_variable object : ' + varName
        self.name = varName
        self.src = ''
        self.regex = ''
        self.old_name = old_name
        self.subdirs = False