/*************************************************************************** * * Copyright (C) 2005 Elad Lahav (elad_lahav@users.sourceforge.net) * * 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 #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, TQObject* pParent, const char* szName) : TQObject(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 TQString& sText, bool bCase, TQListViewItem* 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) { TQString 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 = ""; } 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"