]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blobdiff - src/dialogs/FilterListsDialog.cpp
Finish block list implementation.
[PrivacyBrowserPC.git] / src / dialogs / FilterListsDialog.cpp
index 0ab6753780d1abe958ee75cd9830b8b5f46aebbe..2d019d87e22b6814c5077723a3963545cebbfda9 100644 (file)
 #include "FilterListsDialog.h"
 #include "GlobalVariables.h"
 #include "ui_FilterListsDialog.h"
-#include "delegates/ViewAndCopyDelegate.h"
+#include "dialogs/FilterEntryDialog.h"
 
 // Qt toolkit headers.
+#include <QDebug>
 #include <QFile>
 #include <QTextStream>
 
@@ -49,11 +50,11 @@ FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(par
     sublistTableWidgetPointer = filterListsDialogUi.sublistTableWidget;
     QDialogButtonBox *dialogButtonBoxPointer = filterListsDialogUi.dialogButtonBox;
 
-    // Create a view and copy delegate.
-    ViewAndCopyDelegate *viewAndCopyDelegate = new ViewAndCopyDelegate(this);
+    // Select an entire row at a time.
+    sublistTableWidgetPointer->setSelectionBehavior(QAbstractItemView::SelectRows);
 
-    // Set the sublist table widget allow copying but not editing.
-    sublistTableWidgetPointer->setItemDelegate(viewAndCopyDelegate);
+    // Open the filter entry dialog when a cell is clicked.
+    connect(sublistTableWidgetPointer, SIGNAL(cellClicked(int, int)), this, SLOT(showFilterEntryDialog(int)));
 
     // Connect the combo boxes.
     connect(filterListComboBoxPointer, SIGNAL(currentIndexChanged(int)), this, SLOT(populateFilterListTextEdit(int)));
@@ -63,47 +64,54 @@ FilterListsDialog::FilterListsDialog(QWidget *parentWidgetPointer) : QDialog(par
     connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(close()));
 
     // Populate the filter list combo box.
-    populateFilterListComboBox(globalFilterListHelperPointer->ultraListStructPointer);
     populateFilterListComboBox(globalFilterListHelperPointer->ultraPrivacyStructPointer);
-    populateFilterListComboBox(globalFilterListHelperPointer->easyListStructPointer);
+    populateFilterListComboBox(globalFilterListHelperPointer->ultraListStructPointer);
     populateFilterListComboBox(globalFilterListHelperPointer->easyPrivacyStructPointer);
+    populateFilterListComboBox(globalFilterListHelperPointer->easyListStructPointer);
     populateFilterListComboBox(globalFilterListHelperPointer->fanboyAnnoyanceStructPointer);
 }
 
-void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
+std::forward_list<EntryStruct *>* FilterListsDialog::getFilterListForwardList(FilterListStruct *filterListStructPointer) const
 {
-    // Populate the filter list combo box.
-    filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
+    // Return the filter list forward list.
+    switch (sublistComboBoxPointer->currentIndex())
+    {
+        case FilterListHelper::MAIN_ALLOWLIST: return filterListStructPointer->mainAllowListPointer;  // The main allow list.
+        case FilterListHelper::MAIN_BLOCKLIST: return filterListStructPointer->mainBlockListPointer;  // The main block list.
+        case FilterListHelper::INITIAL_DOMAIN_BLOCKLIST: return filterListStructPointer->initialDomainBlockListPointer;  // The initial domain block list.
+        case FilterListHelper::REGULAR_EXPRESSION_BLOCKLIST: return filterListStructPointer->regularExpressionBlockListPointer;  // The regular expression block list.
+    }
+
+    // This return statement should never be reached.
+    return new std::forward_list<EntryStruct *>;
 }
 
-void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) const
+FilterListStruct *FilterListsDialog::getFilterListStruct(int filterListComboBoxIndex) const
 {
-    // Create the filter list struct pointer.
-    FilterListStruct *filterListStructPointer;
-
-    // Get the indicated filter list map.
-    switch (filterListComboBoxInt)
+    // Return the filer list struct.
+    switch (filterListComboBoxIndex)
     {
-        case 0:  // UltraList.
-            filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
-            break;
-
-        case 1:  // UltraPrivacy.
-            filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
-            break;
+        case 0: return globalFilterListHelperPointer->ultraPrivacyStructPointer;  // UltraPrivacy.
+        case 1: return globalFilterListHelperPointer->ultraListStructPointer;  // UltraList.
+        case 2: return globalFilterListHelperPointer->easyPrivacyStructPointer;  // EasyPrivacy.
+        case 3: return globalFilterListHelperPointer->easyListStructPointer;  // EasyList.
+        case 4: return globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;  // Fanboy's Annoyance List.
+    }
 
-        case 2:  // EasyList.
-            filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
-            break;
+    // This return statement should never be reached.
+    return new FilterListStruct;
+}
 
-        case 3:  // EasyPrivacy.
-            filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
-            break;
+void FilterListsDialog::populateFilterListComboBox(const FilterListStruct *filterListStructPointer) const
+{
+    // Populate the filter list combo box.
+    filterListComboBoxPointer->addItem(i18nc("Filter list combo box items", "%1 - %2", filterListStructPointer->title, filterListStructPointer->version));
+}
 
-        case 4:  // Fanboy's Annoyance List.
-            filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
-            break;
-    }
+void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxIndex) const
+{
+    // Get the filter list struct.
+    FilterListStruct *filterListStructPointer = getFilterListStruct(filterListComboBoxIndex);
 
     // Get the filter list file.
     QFile filterListFile(filterListStructPointer->filePath);
@@ -121,168 +129,194 @@ void FilterListsDialog::populateFilterListTextEdit(int filterListComboBoxInt) co
     sublistComboBoxPointer->clear();
 
     // Calculate the size of the filter lists.
-    int mainAllowListSize = distance(filterListStructPointer->mainAllowList.begin(), filterListStructPointer->mainAllowList.end());
-    int mainBlockListSize = distance(filterListStructPointer->mainBlockList.begin(), filterListStructPointer->mainBlockList.end());
-    int initialDomainBlockListSize = distance(filterListStructPointer->initialDomainBlockList.begin(), filterListStructPointer->initialDomainBlockList.end());
+    int mainAllowListSize = distance(filterListStructPointer->mainAllowListPointer->begin(), filterListStructPointer->mainAllowListPointer->end());
+    int mainBlockListSize = distance(filterListStructPointer->mainBlockListPointer->begin(), filterListStructPointer->mainBlockListPointer->end());
+    int initialDomainBlockListSize = distance(filterListStructPointer->initialDomainBlockListPointer->begin(), filterListStructPointer->initialDomainBlockListPointer->end());
+    int regularExpressionBlockListSize = distance(filterListStructPointer->regularExpressionBlockListPointer->begin(), filterListStructPointer->regularExpressionBlockListPointer->end());
 
     // Get the translated filter list names.
     QString mainAllowListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_ALLOWLIST);
     QString mainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::MAIN_BLOCKLIST);
     QString initialDomainBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::INITIAL_DOMAIN_BLOCKLIST);
+    QString regularExpressionBlockListName = globalFilterListHelperPointer->getSublistName(FilterListHelper::REGULAR_EXPRESSION_BLOCKLIST);
 
     // Populate the sublist combo box.
     sublistComboBoxPointer->addItem(i18nc("The main allow list", "%1 - %2", mainAllowListName, mainAllowListSize));
     sublistComboBoxPointer->addItem(i18nc("The main block list", "%1 - %2", mainBlockListName, mainBlockListSize));
     sublistComboBoxPointer->addItem(i18nc("The initial domain block list", "%1 - %2", initialDomainBlockListName, initialDomainBlockListSize));
+    sublistComboBoxPointer->addItem(i18nc("the regular expression block list", "%1 - %2", regularExpressionBlockListName, regularExpressionBlockListSize));
 }
 
 void FilterListsDialog::populateTableWidget(int sublistComboBoxIndex) const
 {
-    // Wipe the current table.
-    sublistTableWidgetPointer->clear();
-    sublistTableWidgetPointer->setColumnCount(0);
-    sublistTableWidgetPointer->setRowCount(0);
-
-    // Create the filter list struct.
-    FilterListStruct *filterListStructPointer;
-
-    // Populate the filer list array.
-    switch (filterListComboBoxPointer->currentIndex())
-    {
-        case 0:  // UltraList.
-            filterListStructPointer = globalFilterListHelperPointer->ultraListStructPointer;
-            break;
-
-        case 1:  // UltraPrivacy.
-            filterListStructPointer = globalFilterListHelperPointer->ultraPrivacyStructPointer;
-            break;
-
-        case 2:  // EasyList.
-            filterListStructPointer = globalFilterListHelperPointer->easyListStructPointer;
-            break;
-
-        case 3:  // EasyPrivacy.
-            filterListStructPointer = globalFilterListHelperPointer->easyPrivacyStructPointer;
-            break;
-
-        case 4:  // Fanboy's Annoyance List.
-            filterListStructPointer = globalFilterListHelperPointer->fanboyAnnoyanceStructPointer;
-            break;
-    }
-
-    // Create a filter list forward list.
-    std::forward_list<EntryStruct *> filterListForwardList;
-
-    // Populate the filter list forward list.
-    switch (sublistComboBoxIndex)
+    // Populate the table widget if there is at least one item in teh sublist combo box.
+    if (sublistComboBoxIndex >= 0)
     {
-        case FilterListHelper::MAIN_ALLOWLIST:  // The main allow list.
-            filterListForwardList = filterListStructPointer->mainAllowList;
-            break;
-
-        case FilterListHelper::MAIN_BLOCKLIST:  // The main block list.
-            filterListForwardList = filterListStructPointer->mainBlockList;
-            break;
-
-        case FilterListHelper::INITIAL_DOMAIN_BLOCKLIST:  // The initial domain block list.
-            filterListForwardList = filterListStructPointer->initialDomainBlockList;
-            break;
+        // Wipe the current table.
+        sublistTableWidgetPointer->clear();
+        sublistTableWidgetPointer->setColumnCount(0);
+        sublistTableWidgetPointer->setRowCount(0);
+
+        // Get the filter list struct.
+        FilterListStruct *filterListStructPointer = getFilterListStruct(filterListComboBoxPointer->currentIndex());
+
+        // Create a filter list forward list.
+        std::forward_list<EntryStruct *> *filterListForwardListPointer;
+
+        // Populate the filter list forward list.
+        switch (sublistComboBoxIndex)
+        {
+            case FilterListHelper::MAIN_ALLOWLIST:  // The main allow list.
+                filterListForwardListPointer = filterListStructPointer->mainAllowListPointer;
+                break;
+
+            case FilterListHelper::MAIN_BLOCKLIST:  // The main block list.
+                filterListForwardListPointer = filterListStructPointer->mainBlockListPointer;
+                break;
+
+            case FilterListHelper::INITIAL_DOMAIN_BLOCKLIST:  // The initial domain block list.
+                filterListForwardListPointer = filterListStructPointer->initialDomainBlockListPointer;
+                break;
+
+            case FilterListHelper::REGULAR_EXPRESSION_BLOCKLIST:  // the regular expression block list.
+                filterListForwardListPointer = filterListStructPointer->regularExpressionBlockListPointer;
+                break;
+        }
+
+        // Create the columns.
+        sublistTableWidgetPointer->setColumnCount(21);
+
+        // Create the table headers.
+        QTableWidgetItem *appliedEntryListHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist applied entry list header", "Applied Entry List"));
+        QTableWidgetItem *initialMatchHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist initial match header", "Initial Match"));
+        QTableWidgetItem *finalMatchHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist final match header", "Final Match"));
+        QTableWidgetItem *domainHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist domain header", "Domain"));
+        QTableWidgetItem *domainListHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist domain list Header", "Domain List"));
+        QTableWidgetItem *thirdPartyHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist third-party header", "Third Party"));
+        QTableWidgetItem *hasRequestOptionsHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist has request options header", "Has Request Options"));
+        QTableWidgetItem *fontHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist font header", "Font"));
+        QTableWidgetItem *imageHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist image header", "Image"));
+        QTableWidgetItem *mainFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist main frame header", "Main Frame"));
+        QTableWidgetItem *mediaHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist media header", "Media"));
+        QTableWidgetItem *objectHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Object"));
+        QTableWidgetItem *otherHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Other"));
+        QTableWidgetItem *pingHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist ping header", "Ping"));
+        QTableWidgetItem *scriptHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist script header", "Script"));
+        QTableWidgetItem *styleSheetHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist style sheet header", "Style Sheet"));
+        QTableWidgetItem *subFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist sub frame header", "Sub Frame"));
+        QTableWidgetItem *xmlHttpRequestHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist XML HTTP request header", "XML HTTP Request"));
+        QTableWidgetItem *appliedFilterOptionsHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist applied filter options header", "Applied Filter Options"));
+        QTableWidgetItem *originalFilterOptionsHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist original filter options header", "Original Filter Options"));
+        QTableWidgetItem *originalEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist original entry header", "Original Entry"));
+
+        // Set the horizontal headers.
+        sublistTableWidgetPointer->setHorizontalHeaderItem(0, appliedEntryListHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(1, initialMatchHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(2, finalMatchHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(3, domainHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(4, domainListHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(5, thirdPartyHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(6, hasRequestOptionsHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(7, fontHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(8, imageHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(9, mainFrameHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(10, mediaHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(11, objectHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(12, otherHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(13, pingHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(14, scriptHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(15, styleSheetHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(16, subFrameHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(17, xmlHttpRequestHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(18, appliedFilterOptionsHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(19, originalFilterOptionsHeaderItemPointer);
+        sublistTableWidgetPointer->setHorizontalHeaderItem(20, originalEntryHeaderItemPointer);
+
+        // Initialize the row counter.
+        int rowCounter = 0;
+
+        // Populate the table.
+        for (auto filterListEntry = filterListForwardListPointer->begin(); filterListEntry != filterListForwardListPointer->end(); ++filterListEntry) {
+            // Get the entry struct.
+            EntryStruct *entryStructPointer = *filterListEntry;
+
+            // Add a new row.
+            sublistTableWidgetPointer->insertRow(rowCounter);
+
+            // Create the entry items.
+            QTableWidgetItem *appliedEntryListItemPointer = new QTableWidgetItem(entryStructPointer->appliedEntryList.join(QLatin1String(" * ")));
+            QTableWidgetItem *initialMatchItemPointer = new QTableWidgetItem(entryStructPointer->initialMatch ? i18n("Yes") : QLatin1String());
+            QTableWidgetItem *finalMatchItemPointer = new QTableWidgetItem(entryStructPointer->finalMatch ? i18n("Yes") : QLatin1String());
+            QTableWidgetItem *domainItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->domain));
+            QTableWidgetItem *domainListItemPointer = new QTableWidgetItem(entryStructPointer->domainList.join(QLatin1String(" | ")));
+            QTableWidgetItem *thirdPartyItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->thirdParty));
+            QTableWidgetItem *hasRequestOptionsItemPointer = new QTableWidgetItem(entryStructPointer->hasRequestOptions ? i18n("Yes") : QLatin1String());
+            QTableWidgetItem *fontItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->font));
+            QTableWidgetItem *imageItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->image));
+            QTableWidgetItem *mainFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->mainFrame));
+            QTableWidgetItem *mediaItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->media));
+            QTableWidgetItem *objectItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->object));
+            QTableWidgetItem *otherItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->other));
+            QTableWidgetItem *pingItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->ping));
+            QTableWidgetItem *scriptItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->script));
+            QTableWidgetItem *styleSheetItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->styleSheet));
+            QTableWidgetItem *subFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->subFrame));
+            QTableWidgetItem *xmlHttpRequestItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getRequestOptionDispositionString(entryStructPointer->xmlHttpRequest));
+            QTableWidgetItem *appliedFilterOptionsItemPointer = new QTableWidgetItem(entryStructPointer->appliedFilterOptionsList.join(QLatin1String(" , ")));
+            QTableWidgetItem *originalFilterOptionsItemPointer = new QTableWidgetItem(entryStructPointer->originalFilterOptions);
+            QTableWidgetItem *originalEntryItemPointer = new QTableWidgetItem(entryStructPointer->originalEntry);
+
+            // Add the entries to the table.
+            sublistTableWidgetPointer->setItem(rowCounter, 0, appliedEntryListItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 1, initialMatchItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 2, finalMatchItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 3, domainItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 4, domainListItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 5, thirdPartyItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 6, hasRequestOptionsItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 7, fontItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 8, imageItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 9, mainFrameItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 10, mediaItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 11, objectItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 12, otherItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 13, pingItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 14, scriptItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 15, styleSheetItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 16, subFrameItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 17, xmlHttpRequestItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 18, appliedFilterOptionsItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 19, originalFilterOptionsItemPointer);
+            sublistTableWidgetPointer->setItem(rowCounter, 20, originalEntryItemPointer);
+
+            // Increment the row counter.
+            ++rowCounter;
+        }
+
+        // Get the table header view.
+        QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
+
+        // Resize the header to fit the contents.
+        headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
+
+        // Connect changes in the sort order.
+        connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
     }
+}
 
-    // Create the columns.
-    sublistTableWidgetPointer->setColumnCount(15);
-
-    // Create the table headers.
-    QTableWidgetItem *appliedEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist applied entry header", "Applied Entry"));
-    QTableWidgetItem *thirdPartyHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist third-party header", "Third-Party"));
-    QTableWidgetItem *fontHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist font header", "Font"));
-    QTableWidgetItem *imageHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist image header", "Image"));
-    QTableWidgetItem *mainFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist main frame header", "Main Frame"));
-    QTableWidgetItem *mediaHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist media header", "Media"));
-    QTableWidgetItem *objectHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Object"));
-    QTableWidgetItem *otherHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist object header", "Other"));
-    QTableWidgetItem *pingHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist ping header", "Ping"));
-    QTableWidgetItem *scriptHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist script header", "Script"));
-    QTableWidgetItem *styleSheetHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist style sheet header", "Style Sheet"));
-    QTableWidgetItem *subFrameHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist sub frame header", "Sub Frame"));
-    QTableWidgetItem *xmlHttpRequestHeaderItemPointer = new QTableWidgetItem(i18nc("XML HTTP request header", "XML HTTP Request"));
-    QTableWidgetItem *filterOptionsHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist filter options header", "Filter Options"));
-    QTableWidgetItem *originalEntryHeaderItemPointer = new QTableWidgetItem(i18nc("Sublist original entry header", "Original Entry"));
-
-    // Set the horizontal headers.
-    sublistTableWidgetPointer->setHorizontalHeaderItem(0, appliedEntryHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(1, thirdPartyHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(2, fontHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(3, imageHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(4, mainFrameHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(5, mediaHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(6, objectHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(7, otherHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(8, pingHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(9, scriptHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(10, styleSheetHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(11, subFrameHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(12, xmlHttpRequestHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(13, filterOptionsHeaderItemPointer);
-    sublistTableWidgetPointer->setHorizontalHeaderItem(14, originalEntryHeaderItemPointer);
-
-    // Initialize the row counter.
-    int rowCounter = 0;
-
-    // Populate the table.
-    for (auto filterListEntry = filterListForwardList.begin(); filterListEntry != filterListForwardList.end(); ++filterListEntry) {
-        // Get the entry struct.
-        EntryStruct *entryStructPointer = *filterListEntry;
-
-        // Add a new row.
-        sublistTableWidgetPointer->insertRow(rowCounter);
-
-        // Create the entry items.
-        QTableWidgetItem *appliedEntryItemPointer = new QTableWidgetItem(entryStructPointer->appliedEntry);
-        QTableWidgetItem *thirdPartyItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->thirdParty));
-        QTableWidgetItem *fontItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->font));
-        QTableWidgetItem *imageItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->image));
-        QTableWidgetItem *mainFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->mainFrame));
-        QTableWidgetItem *mediaItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->media));
-        QTableWidgetItem *objectItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->object));
-        QTableWidgetItem *otherItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->other));
-        QTableWidgetItem *pingItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->ping));
-        QTableWidgetItem *scriptItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->script));
-        QTableWidgetItem *styleSheetItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->styleSheet));
-        QTableWidgetItem *subFrameItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->subFrame));
-        QTableWidgetItem *xmlHttpRequestItemPointer = new QTableWidgetItem(globalFilterListHelperPointer->getFilterOptionDispositionString(entryStructPointer->xmlHttpRequest));
-        QTableWidgetItem *filterOptionsItemPointer = new QTableWidgetItem(entryStructPointer->filterOptions);
-        QTableWidgetItem *originalEntryItemPointer = new QTableWidgetItem(entryStructPointer->originalEntry);
-
-        // Add the entries to the table.
-        sublistTableWidgetPointer->setItem(rowCounter, 0, appliedEntryItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 1, thirdPartyItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 2, fontItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 3, imageItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 4, mainFrameItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 5, mediaItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 6, objectItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 7, otherItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 8, pingItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 9, scriptItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 10, styleSheetItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 11, subFrameItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 12, xmlHttpRequestItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 13, filterOptionsItemPointer);
-        sublistTableWidgetPointer->setItem(rowCounter, 14, originalEntryItemPointer);
-
-        // Increment the row counter.
-        ++rowCounter;
-    }
+void FilterListsDialog::showFilterEntryDialog(int row)
+{
+    // Get the filter list struct.
+    FilterListStruct *filterListStructPointer = getFilterListStruct(filterListComboBoxPointer->currentIndex());
 
-    // Get the table header view.
-    QHeaderView *headerViewPointer = sublistTableWidgetPointer->horizontalHeader();
+    // Create a sublist title.
+    QString sublistTitle = globalFilterListHelperPointer->getSublistName(sublistComboBoxPointer->currentIndex());
 
-    // Resize the header to fit the contents.
-    headerViewPointer->resizeSections(QHeaderView::ResizeToContents);
+    // Instantiate the filter entry dialog.
+    FilterEntryDialog *filterEntryDialogPointer = new FilterEntryDialog(this, sublistTableWidgetPointer, row, filterListStructPointer->title, sublistTitle);
 
-    // Connect changes in the sort order.
-    connect(headerViewPointer, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(sortTable(int, Qt::SortOrder)));
+    // Show the dialog.
+    filterEntryDialogPointer->show();
 }
 
 void FilterListsDialog::sortTable(int column, Qt::SortOrder sortOrder) const