compareFiles.pyw
# ------------------------------------------------------------------------------#

from PySide2.QtWidgets import QApplication,QMainWindow,QFileDialog;

# ------------------------------------------------------------------------------#

from pyfiles import ui_compareFiles as uicompF;
from pyfiles import compare_files_by_content as compfiles;

# ------------------------------------------------------------------------------#

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__();

        self.ui=uicompF.Ui_MainWindow();
        self.ui.setupUi(self);

        # ----------------------------------------------------------------------#

        self.ui.openFileName1Button.clicked.connect(self.setOpenFile1Name)
        self.ui.openFileName2Button.clicked.connect(self.setOpenFile2Name)

        self.ui.compareFilesButton.clicked.connect(self.doCompare)
        self.ui.helpButton.clicked.connect(self.doHelp)

    # end def __init__:

    # --------------------------------------------------------------------------#
    # --------------------------------------------------------------------------#

    def setOpenFile1Name(self):
        (fileName,_)=QFileDialog.getOpenFileName(self,
                                                 "Open File",
                                                 self.ui.FileName1LineEdit.text(),
                                                 "All Files (*);;Text Files (*.txt)");
        if fileName:
            self.ui.FileName1LineEdit.setText(fileName);

    # end def setOpenFile1Name

    def setOpenFile2Name(self):
        (fileName,_)=QFileDialog.getOpenFileName(self,
                                                 "Open File",
                                                 self.ui.FileName2LineEdit.text(),
                                                 "All Files (*);;Text Files (*.txt)");
        if fileName:
            self.ui.FileName2LineEdit.setText(fileName);

    # end def setOpenFile1Name

    def doHelp(self):
        TB=self.ui.showResultTextBrowser;

        doOutput(TB,'\n# Purpose:');
        doOutput(TB,'#     The script compares 2 text files byte by byte ignoring');
        doOutput(TB,'#     differences in white space thefollowing way:');
        doOutput(TB,'#     For comparison sequences of white space characters are');
        doOutput(TB,'#     condensed to just one empty space character.');
        doOutput(TB,"#     If the option 'No White Space' is set, all white space");
        doOutput(TB,"#     will be eliminated.");
        doOutput(TB,'#');
        doOutput(TB,'#  Usage:');
        doOutput(TB,'#     Choose two text files');
        doOutput(TB,'#');
        doOutput(TB,'#  Note:');
        doOutput(TB,'#      Names containing empty spaces must be enclosed by');
        doOutput(TB,'#      quotation marks.');
        doOutput(TB,'#');
        doOutput(TB,'#  For different files:');
        doOutput(TB,"#     The first different non white character is marked with");
        doOutput(TB,"#     a '^'. Its position in the files is named 'At' in");
        doOutput(TB,"#     output.");
        doOutput(TB,"#     'L1-L2' is the difference of lengths of files.");
        doOutput(TB,'#     Note! These numbers are numbers for internal files');
        doOutput(TB,"#     with all substrings '[ \\t\\n\\r\\f\\v]+' replaced");
        doOutput(TB,'#     by just one (or none) empty space character.\n');

    # end doHelp()

    def doCompare(self):
        TB=self.ui.showResultTextBrowser;

        FileName1=self.ui.FileName1LineEdit.text();
        FileName2=self.ui.FileName2LineEdit.text();

        if (FileName1!="") and (FileName2!=""):

            if (FileName1!=FileName2):

                MatchCase=self.ui.matchCaseCheckBox.isChecked();
                NoSpaceAtAll=self.ui.noSpaceRadioButton.isChecked();

                try:
                    Result=compfiles.compareFiles(FileName1,FileName2,MatchCase,NoSpaceAtAll);

                    doOutput(TB,'\n# Comparing apart from white space ...');
                    doOutput(TB,'# Match case: '+str(MatchCase));
                    doOutput(TB,'\n> F1: '+FileName1);
                    doOutput(TB,'> F2: '+FileName2);

                    if (Result[0]):
                        doOutput(TB,'\n+ The files are equal by content - apart from white space.');
                        doOutput(TB,'');

                    else:
                        # Different files

                        doOutput(TB,'\n- The files are different by content - apart from white space:');
                        doOutput(TB,'');

                        FirstDifferentCharNb=Result[2];

                        if FirstDifferentCharNb<10:
                            Blanks='                 ';
                            for I in range(FirstDifferentCharNb):
                                Blanks+=' ';
                        else:
                            Blanks='                          ';  # Max 26 blanks
                        # end if

                        doOutput(TB,'             F1: "'+str(Result[3]));
                        doOutput(TB,'             F2: "'+Result[4]);
                        doOutput(TB,Blanks+'^');
                        doOutput(TB,'             At:  '+str(Result[2]));
                        doOutput(TB,'          L1-L2:  '+str(Result[1]));
                        doOutput(TB,'');
                    # end if

                    doOutput(TB,'# Compared.');
                except:
                    doOutput(TB,'\n# Comparing apart from white space ...');
                    doOutput(TB,'> F1: '+FileName1);
                    doOutput(TB,'> F2: '+FileName2);
                    doOutput(TB,'\n! File ERROR - An exception occured when reading a file.');
                    doOutput(TB,'             - The files must be text files.');
                # end try

            else:
                doOutput(TB,'\n! Input ERROR - The names of the files are identical!');
            # end if
        # end if
    # end def doCompare()
    # end class

def doOutput(TextBrowser,Text):
    TextBrowser.append(Text);

# end def doOutput

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#

def main():
    import sys;

    app=QApplication(sys.argv);
    window=MainWindow();
    window.show();

    window.ui.FileName1LineEdit.setText("")
    window.ui.FileName2LineEdit.setText("")

    sys.exit(app.exec_());

# end def main

# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#
if __name__=='__main__':
    print('\n# Beginning compareFiles.pyw ...\n');
    # --------------------------------------------------------------------------#
    # --------------------------------------------------------------------------#
    main();
    # --------------------------------------------------------------------------#
    # --------------------------------------------------------------------------#
    print('\n# Finished compareFiles.pyw.\n');
# end if main