From adfb31f518925d1e30c432e7cef9c99bb508fef0 Mon Sep 17 00:00:00 2001
From: Chris PeBenito <pebenito@ieee.org>
Date: Sat, 9 Jul 2016 18:18:47 -0400
Subject: [PATCH] apol: Implement copy from table results.

Closes #123
---
 data/boolquery.ui        |  7 ++++-
 data/boundsquery.ui      |  9 ++++++-
 data/categoryquery.ui    |  7 ++++-
 data/commonquery.ui      |  7 ++++-
 data/constraintquery.ui  |  9 ++++++-
 data/defaultquery.ui     |  9 ++++++-
 data/fsusequery.ui       |  9 ++++++-
 data/genfsconquery.ui    |  9 ++++++-
 data/initsidquery.ui     |  9 ++++++-
 data/mlsrulequery.ui     |  9 ++++++-
 data/netifconquery.ui    |  9 ++++++-
 data/nodeconquery.ui     |  9 ++++++-
 data/objclassquery.ui    |  7 ++++-
 data/portconquery.ui     |  9 ++++++-
 data/rbacrulequery.ui    |  9 ++++++-
 data/rolequery.ui        |  7 ++++-
 data/sensitivityquery.ui |  7 ++++-
 data/terulequery.ui      |  9 ++++++-
 data/typeattrquery.ui    |  7 ++++-
 data/typequery.ui        |  7 ++++-
 data/userquery.ui        |  7 ++++-
 setoolsgui/tableview.py  | 56 ++++++++++++++++++++++++++++++++++++++++
 22 files changed, 206 insertions(+), 21 deletions(-)
 create mode 100644 setoolsgui/tableview.py

diff --git a/data/boolquery.ui b/data/boolquery.ui
index 477cee3..0acb7b3 100644
--- a/data/boolquery.ui
+++ b/data/boolquery.ui
@@ -304,7 +304,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -396,6 +396,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/boundsquery.ui b/data/boundsquery.ui
index 72572ca..6adcbdf 100644
--- a/data/boundsquery.ui
+++ b/data/boundsquery.ui
@@ -166,7 +166,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -522,6 +522,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/categoryquery.ui b/data/categoryquery.ui
index 832d661..d0d77c9 100644
--- a/data/categoryquery.ui
+++ b/data/categoryquery.ui
@@ -265,7 +265,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -357,6 +357,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/commonquery.ui b/data/commonquery.ui
index fb81025..9f893b7 100644
--- a/data/commonquery.ui
+++ b/data/commonquery.ui
@@ -346,7 +346,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -438,6 +438,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/constraintquery.ui b/data/constraintquery.ui
index a3654fc..637412f 100644
--- a/data/constraintquery.ui
+++ b/data/constraintquery.ui
@@ -166,7 +166,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -767,6 +767,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/defaultquery.ui b/data/defaultquery.ui
index 233fb78..8489cc9 100644
--- a/data/defaultquery.ui
+++ b/data/defaultquery.ui
@@ -166,7 +166,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -570,6 +570,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/fsusequery.ui b/data/fsusequery.ui
index c7265fa..cf4ac02 100644
--- a/data/fsusequery.ui
+++ b/data/fsusequery.ui
@@ -664,7 +664,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -744,6 +744,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/genfsconquery.ui b/data/genfsconquery.ui
index ac60d1e..447026b 100644
--- a/data/genfsconquery.ui
+++ b/data/genfsconquery.ui
@@ -173,7 +173,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -695,6 +695,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/initsidquery.ui b/data/initsidquery.ui
index a430ccd..05464f7 100644
--- a/data/initsidquery.ui
+++ b/data/initsidquery.ui
@@ -567,7 +567,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -647,6 +647,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/mlsrulequery.ui b/data/mlsrulequery.ui
index 7a36efb..18395bf 100644
--- a/data/mlsrulequery.ui
+++ b/data/mlsrulequery.ui
@@ -95,7 +95,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -711,6 +711,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/netifconquery.ui b/data/netifconquery.ui
index 6c6270b..e2a80e4 100644
--- a/data/netifconquery.ui
+++ b/data/netifconquery.ui
@@ -567,7 +567,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -647,6 +647,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/nodeconquery.ui b/data/nodeconquery.ui
index fe9e509..ddcd3f5 100644
--- a/data/nodeconquery.ui
+++ b/data/nodeconquery.ui
@@ -173,7 +173,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -705,6 +705,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/objclassquery.ui b/data/objclassquery.ui
index c6e4575..d2d1948 100644
--- a/data/objclassquery.ui
+++ b/data/objclassquery.ui
@@ -386,7 +386,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -478,6 +478,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/portconquery.ui b/data/portconquery.ui
index 308de24..98b8ecc 100644
--- a/data/portconquery.ui
+++ b/data/portconquery.ui
@@ -173,7 +173,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -727,6 +727,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/rbacrulequery.ui b/data/rbacrulequery.ui
index 6db7f04..b319dce 100644
--- a/data/rbacrulequery.ui
+++ b/data/rbacrulequery.ui
@@ -586,7 +586,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -728,6 +728,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/rolequery.ui b/data/rolequery.ui
index ffe9d90..0bf4b92 100644
--- a/data/rolequery.ui
+++ b/data/rolequery.ui
@@ -374,7 +374,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -466,6 +466,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/sensitivityquery.ui b/data/sensitivityquery.ui
index 5585011..250d827 100644
--- a/data/sensitivityquery.ui
+++ b/data/sensitivityquery.ui
@@ -265,7 +265,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -357,6 +357,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/terulequery.ui b/data/terulequery.ui
index 37b5c7e..5ea9e26 100644
--- a/data/terulequery.ui
+++ b/data/terulequery.ui
@@ -104,7 +104,7 @@
          <number>6</number>
         </property>
         <item>
-         <widget class="QTableView" name="table_results">
+         <widget class="SEToolsTableView" name="table_results">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
             <horstretch>0</horstretch>
@@ -1001,6 +1001,13 @@
    </layout>
   </widget>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>criteria_expander</tabstop>
   <tabstop>notes_expander</tabstop>
diff --git a/data/typeattrquery.ui b/data/typeattrquery.ui
index 6e24f8f..439a334 100644
--- a/data/typeattrquery.ui
+++ b/data/typeattrquery.ui
@@ -374,7 +374,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -466,6 +466,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/typequery.ui b/data/typequery.ui
index ca18fed..cc91fb0 100644
--- a/data/typequery.ui
+++ b/data/typequery.ui
@@ -399,7 +399,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -491,6 +491,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/data/userquery.ui b/data/userquery.ui
index 8fa366a..e3eb4d7 100644
--- a/data/userquery.ui
+++ b/data/userquery.ui
@@ -567,7 +567,7 @@
              <number>6</number>
             </property>
             <item>
-             <widget class="QTableView" name="table_results">
+             <widget class="SEToolsTableView" name="table_results">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
                 <horstretch>0</horstretch>
@@ -659,6 +659,11 @@
   </widget>
  </widget>
  <customwidgets>
+  <customwidget>
+   <class>SEToolsTableView</class>
+   <extends>QTableView</extends>
+   <header>setoolsgui/tableview.h</header>
+  </customwidget>
   <customwidget>
    <class>GetDetailsListView</class>
    <extends>QListView</extends>
diff --git a/setoolsgui/tableview.py b/setoolsgui/tableview.py
new file mode 100644
index 0000000..f8ebe44
--- /dev/null
+++ b/setoolsgui/tableview.py
@@ -0,0 +1,56 @@
+# Copyright 2016, Chris PeBenito <pebenito@ieee.org>
+#
+# This file is part of SETools.
+#
+# SETools is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# SETools is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with SETools.  If not, see
+# <http://www.gnu.org/licenses/>.
+#
+
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QKeySequence
+from PyQt5.QtWidgets import QApplication, QTableView
+
+
+class SEToolsTableView(QTableView):
+
+    """QTableView class extended for SETools use."""
+
+    def event(self, e):
+        if e == QKeySequence.Copy or e == QKeySequence.Cut:
+            datamodel = self.model()
+
+            selected_text = ""
+            current_row = None
+            current_col = None
+            prev_row = None
+            prev_col = None
+            for index in sorted(self.selectionModel().selectedIndexes()):
+                current_row = index.row()
+                current_col = index.column()
+
+                if prev_row is not None and current_row != prev_row:
+                    selected_text += '\n'
+                elif prev_col is not None and current_col != prev_col:
+                    selected_text += '\t'
+
+                selected_text += datamodel.data(index, Qt.DisplayRole)
+
+                prev_row = current_row
+                prev_col = current_col
+
+            QApplication.clipboard().setText(selected_text)
+            return True
+
+        else:
+            return super(SEToolsTableView, self).event(e)