diff hgexpwidget.cpp @ 0:a9098eba2ee5

Initial commit.
author Jari Korhonen <jtkorhonen@gmail.com>
date Thu, 22 Apr 2010 03:15:35 +0300
parents
children 39bbb7b00934
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgexpwidget.cpp	Thu Apr 22 03:15:35 2010 +0300
@@ -0,0 +1,380 @@
+//** Copyright (C) Jari Korhonen, 2010 (under lgpl)
+
+#include <QtGui>
+
+#include "hgexpwidget.h"
+#include "common.h"
+
+#define REMOTE_REPO_STR  "Remote repository: "
+#define LOCAL_REPO_STR   "Local repository: "
+#define WORKFOLDER_STR   "Working folder: "
+
+
+const char hgStatViewOptions[NUM_STAT_FILE_TYPES] = {'m','a','r','d','u','c','i'};
+
+const char *statFilesStr[NUM_STAT_FILE_TYPES] =  {  "M: Modified",
+                                                    "A: To be added on next commit",
+                                                    "R: To be removed on next commit",
+                                                    "!: Tracked, locally deleted",
+                                                    "?: Unknown, not yet tracked",
+                                                    "C: Clean (not changed)",
+                                                    "I: Ignored (via .hgignore file)"};
+
+
+HgExpWidget::HgExpWidget(QWidget *parent, QString remoteRepo, QString workFolderPath, unsigned char viewFileTypesBits): QTabWidget(parent)
+{
+    //Work page
+    //Work page
+    //Work page
+
+    //Remote repo
+    grpRemoteRepo = new QGroupBox(tr(REMOTE_REPO_STR) + remoteRepo);
+    grpRemoteRepo -> setMinimumHeight(24);
+
+    //Local Repo
+    grpLocalRepo = new QGroupBox(tr(LOCAL_REPO_STR) + workFolderPath + getHgDirName());
+    parentsLabel = new QLabel(tr("Working folder parent(s):"));
+    localRepoHgParentsList = new QListWidget;
+    localRepoHgParentsList -> setSelectionMode(QAbstractItemView::NoSelection);
+    parentsLayout = new QVBoxLayout;
+    parentsLayout -> addWidget(parentsLabel);
+    parentsLayout -> addWidget(localRepoHgParentsList);
+    grpLocalRepo -> setLayout(parentsLayout);
+
+    //Workfolder
+    grpWorkFolder = new QGroupBox(tr(WORKFOLDER_STR) + workFolderPath);
+    workFolderLayout = new QHBoxLayout;
+    workFolderFileList = new QListWidget;
+    workFolderFileList -> setSelectionMode(QAbstractItemView::SingleSelection);
+    grpViewFileTypes = new QGroupBox;
+    fileTypesLayout = new QVBoxLayout;
+
+    for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
+    {
+        chkViewFileTypes[i] = new QCheckBox(statFilesStr[i]);
+        if ((1U << i) & viewFileTypesBits)
+        {
+            chkViewFileTypes[i]->setChecked(true);
+        }
+        else
+        {
+            chkViewFileTypes[i]->setChecked(false);
+        }
+        connect(chkViewFileTypes[i], SIGNAL(stateChanged(int)), this, SIGNAL(workFolderViewTypesChanged()));
+        fileTypesLayout -> addWidget(chkViewFileTypes[i]);
+    }
+
+    grpViewFileTypes -> setLayout(fileTypesLayout);
+    workFolderLayout->addWidget(workFolderFileList, 3);
+    workFolderLayout->addWidget(grpViewFileTypes, 1);
+    grpWorkFolder -> setLayout(workFolderLayout);
+
+    workPageWidget = new QWidget;
+    mainLayout = new QVBoxLayout(workPageWidget);
+    mainLayout -> addWidget(grpRemoteRepo, 1);
+    mainLayout -> addWidget(grpLocalRepo, 8);
+    mainLayout -> addWidget(grpWorkFolder, 12);
+    addTab(workPageWidget, tr("Work"));
+
+    //History page
+    //History page
+    //History page
+    historyPageWidget = new QWidget;
+    localRepoHgLogList = new QListWidget;
+    localRepoHgLogList->setFont(QFont("Courier New"));
+    localRepoHgLogList -> setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+    historyLayout = new QVBoxLayout(historyPageWidget);
+    historyLayout->addWidget(localRepoHgLogList);
+    addTab(historyPageWidget, tr("History (log)"));
+
+    //Heads page
+    //Heads page
+    //Heads page
+    headsPageWidget = new QWidget;
+    localRepoHeadsList = new QListWidget;
+    localRepoHeadsList -> setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+    headsLayout = new QVBoxLayout(headsPageWidget);
+    headsLayout->addWidget(localRepoHeadsList);
+    addTab(headsPageWidget, tr("Heads"));
+
+    //Initially, only work page is active
+    setTabEnabled(HEADSTAB, false);
+    setTabEnabled(HISTORYTAB, false);
+}
+
+
+QString HgExpWidget::getStatFlags()
+{
+    QString ret;
+
+    for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
+    {
+        if (Qt::Checked == chkViewFileTypes[i]->checkState())
+        {
+            ret += hgStatViewOptions[i];
+        }
+    }
+
+    return ret;
+}
+
+
+unsigned char HgExpWidget::getFileTypesBits()
+{
+    unsigned char ret;
+
+    ret = 0;
+
+    for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
+    {
+        if (Qt::Checked == chkViewFileTypes[i]->checkState())
+        {
+            ret |= (1U << i);
+        }
+    }
+
+    return ret;
+}
+
+
+void HgExpWidget::updateWorkFolderFileList(QString fileList)
+{
+    workFolderFileList-> clear();
+    workFolderFileList -> addItems(fileList.split("\n"));
+}
+
+void HgExpWidget::updateLocalRepoHeadsList(QString headList)
+{
+    localRepoHeadsList-> clear();
+    localRepoHeadsList -> addItems(splitChangeSets(headList));
+
+    //heads list is interesting only when we have 2 or more
+    if (localRepoHeadsList-> count() < 2)
+    {
+        setTabEnabled(HEADSTAB, false);
+    }
+    else
+    {
+        setTabEnabled(HEADSTAB, true);
+    }
+}
+
+
+void HgExpWidget::clearLists()
+{
+    localRepoHeadsList-> clear();
+    localRepoHgParentsList-> clear();
+    workFolderFileList-> clear();
+    localRepoHgLogList -> clear();
+}
+
+void HgExpWidget::updateLocalRepoParentsList(QString parentsList)
+{
+    localRepoHgParentsList-> clear();
+    localRepoHgParentsList -> addItems(splitChangeSets(parentsList));
+}
+
+void HgExpWidget::updateLocalRepoHgLogList(QString hgLogList)
+{
+    localRepoHgLogList -> clear();
+    localRepoHgLogList -> addItems(splitChangeSets(hgLogList));
+
+}
+
+
+int HgExpWidget::findLineStart(int nowIndex, QString str)
+{
+    if (nowIndex < 0)
+    {
+        return -1;
+    }
+
+    while(str.at(nowIndex) != '\n')
+    {
+        if (nowIndex == 0)
+        {
+            return nowIndex;
+        }
+        nowIndex--;
+    }
+    return nowIndex + 1;
+}
+
+
+QStringList HgExpWidget::splitChangeSets(QString chgSetsStr)
+{
+    int currChgSet;
+    int currChgSetLineStart;
+
+    int prevChgSet;
+    QStringList tmp;
+
+    currChgSet = chgSetsStr.indexOf(CHGSET);
+    currChgSetLineStart = findLineStart(currChgSet, chgSetsStr);
+    prevChgSet = -1;
+    while (currChgSet != -1)
+    {
+        if (prevChgSet != -1)
+        {
+            tmp.append(chgSetsStr.mid(prevChgSet, (currChgSetLineStart - prevChgSet - 1)));
+        }
+
+        prevChgSet = currChgSetLineStart;
+
+        currChgSet = chgSetsStr.indexOf(CHGSET, currChgSet + 1);
+        currChgSetLineStart = findLineStart(currChgSet, chgSetsStr);
+    }
+
+    if (prevChgSet != -1)
+    {
+        //Last changeset
+        tmp.append(chgSetsStr.mid(prevChgSet));
+    }
+    else
+    {
+        //Only changeset (if any)
+        if (!chgSetsStr.isEmpty())
+        {
+            tmp.append(chgSetsStr.mid(0));
+        }
+    }
+
+    return tmp;
+}
+
+QString HgExpWidget::getCurrentFileListLine()
+{
+    if (workFolderFileList -> currentItem() != NULL)
+    {
+        return workFolderFileList -> currentItem()->text();
+    }
+    return "";
+}
+
+void HgExpWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath)
+{
+    grpRemoteRepo -> setTitle(tr(REMOTE_REPO_STR) + remoteRepoPath);
+    grpLocalRepo -> setTitle(tr(LOCAL_REPO_STR) + workFolderPath + getHgDirName());
+    grpWorkFolder -> setTitle(tr(WORKFOLDER_STR) + workFolderPath);
+}
+
+#define MERC_SHA1_MARKER_LEN 12
+QString HgExpWidget::findRev(QString itemText, QString & smallRev)
+{
+    QString tmp(itemText);
+    int i;
+    int j;
+
+    smallRev ="0";
+
+    i = tmp.indexOf(CHGSET);
+    if (i != -1)
+    {
+        j = i + 10;
+        i = tmp.indexOf(":", j);  //xx:yyyyyy after changeset:
+
+        if (i != -1)
+        {
+            smallRev = tmp.mid(j, (i-j));
+            return tmp.mid(i+1, MERC_SHA1_MARKER_LEN);
+        }
+    }
+
+    return "";
+}
+
+void HgExpWidget::getHistoryDiffRevisions(QString& revA, QString& revB)
+{
+    QList <QListWidgetItem *> histList = localRepoHgLogList->selectedItems();
+    QList <QListWidgetItem *> headList = localRepoHeadsList->selectedItems();
+
+    QString revATmp;
+    QString revBTmp;
+    QString smallRevA;
+    QString smallRevB;
+    QString txtA;
+    QString txtB;
+
+    if (histList.count() == REQUIRED_CHGSET_DIFF_COUNT)
+    {
+        txtA = histList.last()->text();
+        txtB = histList.first()->text();
+
+    }
+    else if (headList.count() == REQUIRED_CHGSET_DIFF_COUNT)
+    {
+        txtA = headList.last()->text();
+        txtB = headList.first()->text();
+    }
+    else
+    {
+        revA = "";
+        revB = "";
+        return;
+    }
+
+    revATmp = findRev(txtA, smallRevA);
+    revBTmp = findRev(txtB, smallRevB);
+
+    //Switch order according to repo small revision number (user can select items from list in "wrong" order)
+    if (smallRevB.toULongLong() > smallRevA.toULongLong())
+    {
+        revA = revATmp;
+        revB = revBTmp;
+    }
+    else
+    {
+        revA = revBTmp;
+        revB = revATmp;
+    }
+}
+
+
+void HgExpWidget::getUpdateToRevRevision(QString& rev)
+{
+    QList <QListWidgetItem *> histList = localRepoHgLogList->selectedItems();
+    QString txt;
+    QString smallRev;
+
+
+    if (histList.count() == 1)
+    {
+        txt = histList.first()->text();
+        rev = findRev(txt, smallRev);
+    }
+    else
+    {
+        rev = "";
+    }
+}
+
+
+
+void HgExpWidget::enableDisableOtherTabs()
+{
+    //history list is only interesting when we have something in it ;-)
+    if (localRepoHgLogList -> count() < 2)
+    {
+        setTabEnabled(HISTORYTAB, false);
+    }
+    else
+    {
+        setTabEnabled(HISTORYTAB, true);
+    }
+
+    //history list is only interesting when we have something in it ;-)
+    if (localRepoHgLogList -> count() < 2)
+    {
+        setTabEnabled(HISTORYTAB, false);
+    }
+    else
+    {
+        setTabEnabled(HISTORYTAB, true);
+    }
+}
+
+
+
+