summaryrefslogtreecommitdiffstats
path: root/src/queryviewdriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/queryviewdriver.cpp')
-rw-r--r--src/queryviewdriver.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/queryviewdriver.cpp b/src/queryviewdriver.cpp
new file mode 100644
index 0000000..f04c44d
--- /dev/null
+++ b/src/queryviewdriver.cpp
@@ -0,0 +1,180 @@
+/***************************************************************************
+ *
+ * Copyright (C) 2005 Elad Lahav ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ***************************************************************************/
+
+#include <klocale.h>
+#include "queryviewdriver.h"
+#include "queryview.h"
+
+/**
+ * Class constructor.
+ * Creates a driver that adds new records as root items in the given view.
+ * @param pView The view to which this driver should add records
+ * @param pParent The parent object of the driver
+ * @param szName The name of the object
+ */
+QueryViewDriver::QueryViewDriver(QueryView* pView, QObject* pParent,
+ const char* szName) : QObject(pParent, szName),
+ m_pView(pView),
+ m_pItem(NULL),
+ m_progress(pView),
+ m_bRunning(false)
+{
+ m_pCscope = new CscopeFrontend();
+
+ // Add records to the page when Cscope outputs them
+ connect(m_pCscope, SIGNAL(dataReady(FrontendToken*)), this,
+ SLOT(slotDataReady(FrontendToken*)));
+
+ // Report progress information
+ connect(m_pCscope, SIGNAL(progress(int, int)), this,
+ SLOT(slotProgress(int, int)));
+
+ // Perform tasks when the query process terminates
+ connect(m_pCscope, SIGNAL(finished(uint)), this,
+ SLOT(slotFinished(uint)));
+
+ connect(m_pView, SIGNAL(destroyed()), this, SLOT(slotViewClosed()));
+}
+
+/**
+ * Class destructor.
+ */
+QueryViewDriver::~QueryViewDriver()
+{
+ delete m_pCscope;
+}
+
+/**
+ * Executes a query.
+ * @param nType The type of the query (@see CscopeFrontend)
+ * @param sText The query's text
+ * @param bCase true for case-sensitive queries, false otherwise
+ * @param pItem If non-null, represents an view item passed back to
+ * the view in a call to addRecord()
+ */
+void QueryViewDriver::query(uint nType, const QString& sText, bool bCase,
+ QListViewItem* pItem)
+{
+ m_pItem = pItem;
+
+ // Make sure sorting is disabled while entries are added
+ m_pView->setSorting(100);
+
+ // Execute the query
+ m_pCscope->query(nType, sText, bCase);
+ m_bRunning = true;
+ m_pView->setEnabled(false);
+ m_pView->setUpdatesEnabled(false);
+}
+
+/**
+ * Adds a query entry to the view.
+ * Called by a CscopeFrontend object, when a new entry was received in its
+ * whole from the Cscope back-end process.
+ * @param pToken The first token in the entry
+ */
+void QueryViewDriver::slotDataReady(FrontendToken* pToken)
+{
+ QString sFile, sFunc, sLine, sText;
+
+ // Get the file name
+ sFile = pToken->getData();
+ pToken = pToken->getNext();
+
+ // Get the function name
+ sFunc = pToken->getData();
+ pToken = pToken->getNext();
+
+ // Get the line number
+ sLine = pToken->getData();
+ if (!sLine.toInt()) {
+ // Line number could not be 0!
+ // means that function name was empty
+ sLine = sFunc;
+ sFunc = "<global>";
+ }
+ else {
+ pToken = pToken->getNext();
+ }
+
+ // Get the line's text
+ sText = pToken->getData();
+ pToken = pToken->getNext();
+
+ // Add a new item at the end of the list
+ m_pView->addRecord(sFunc, sFile, sLine, sText, m_pItem);
+}
+
+/**
+ * Handles a finished query event, reported by the Cscope frontend object.
+ * If no resutls are available, a proper message is displayed. If only one
+ * record was generated by Cscope, it is automatically selected for viewing.
+ * @param nRecords The number of records the query has generated
+ */
+void QueryViewDriver::slotFinished(uint nRecords)
+{
+ // The query is no longer running
+ m_bRunning = false;
+ m_pView->setEnabled(true);
+ m_pView->setUpdatesEnabled(true);
+ m_pView->triggerUpdate();
+
+ // Destroy the progress bar
+ m_progress.finished();
+
+ // Let owner widget decide what to do based on the number of records
+ m_pView->queryFinished(nRecords, m_pItem);
+}
+
+/**
+ * Displays search progress information.
+ * This slot is connected to the progress() signal emitted by a
+ * CscopeFrontend object.
+ * @param nFiles The number of files scanned
+ * @param nTotal The total number of files in the project
+ */
+void QueryViewDriver::slotProgress(int nFiles, int nTotal)
+{
+ // A progress report is available, instruct the owner object to show the
+ // view
+ if (nTotal > 1)
+ m_pView->queryProgress();
+
+ // Set the progress bar
+ m_progress.setProgress(nFiles, nTotal);
+}
+
+/**
+ * Called when the owner view is destroyed.
+ */
+void QueryViewDriver::slotViewClosed()
+{
+ m_pView = NULL;
+ m_pCscope->kill();
+}
+
+#include "queryviewdriver.moc"