⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symboldlg.cpp

📁 linux下的sourceinsight
💻 CPP
字号:
/*************************************************************************** * * 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 <qlabel.h>#include <qlistview.h>#include <qpushbutton.h>#include <qradiobutton.h>#include <qcheckbox.h>#include <qgroupbox.h>#include <kcombobox.h>#include <klocale.h>#include "symboldlg.h"#include "cscopefrontend.h"#include "kscopeconfig.h"QStringList SymbolDlg::s_slHistory;/** * Class constructor. * @param	pParent	Parent widget * @param	szName	This widget's name */SymbolDlg::SymbolDlg(QWidget* pParent, const char* szName) : 	SymbolLayout(pParent, szName, true, 0),	m_progress(m_pHintList){	// Create a persistent Cscope process	m_pCscope = new CscopeFrontend();		// Initialise the hint list (hidden by default)	m_pHintList->addColumn(i18n("Suggested Symbols"));	m_pHintList->hide();	((QWidget*)m_pHintGroup)->hide();	m_pBeginWithRadio->toggle();	adjustSize();		// Close the dialogue when either the "OK" or "Cancel" button are clicked	connect(m_pOKButton, SIGNAL(clicked()), this, SLOT(accept()));	connect(m_pCancelButton, SIGNAL(clicked()), this, SLOT(reject()));		// Run a symbol completion query when the "Hint" button is clicked	connect(m_pHintButton, SIGNAL(clicked()), this, SLOT(slotHintClicked()));		// Add results to the hint list	connect(m_pCscope, SIGNAL(dataReady(FrontendToken*)), this,		SLOT(slotHintDataReady(FrontendToken*)));	// Set hint button availability based on the type of query	connect(m_pTypeCombo, SIGNAL(activated(int)), this, 		SLOT(slotTypeChanged(int)));			// Selecting an item in the hint list sets it as the current text		connect(m_pHintList, SIGNAL(selectionChanged(QListViewItem*)), this,		SLOT(slotHintItemSelected(QListViewItem*)));		// Double-clicking an item in the hint list accepts that item as the	// result of the query (i.e., the item is selcted and the dialogue is	// closed)	connect(m_pHintList, SIGNAL(doubleClicked(QListViewItem*)), this,		SLOT(accept()));			// Refresh the hint list when the hint options change	connect(m_pBeginWithRadio, SIGNAL(toggled(bool)), this,		SLOT(slotHintOptionChanged(bool)));	connect(m_pContainRadio, SIGNAL(toggled(bool)), this,		SLOT(slotHintOptionChanged(bool)));			// Show hint query progress information	connect(m_pCscope, SIGNAL(progress(int, int)), this,		SLOT(slotHintProgress(int, int)));	connect(m_pCscope, SIGNAL(finished(uint)), this,		SLOT(slotHintFinished(uint)));}/** * Class destructor. */SymbolDlg::~SymbolDlg(){	delete m_pCscope;}/** * Displays the requested type of query in the type combo-box. * @param	nType	The requested type */void SymbolDlg::setType(uint nType){	m_pTypeCombo->setCurrentItem(nType);	slotTypeChanged(nType);}/** * @param	sSymbol	The initial text of the combo-box */void SymbolDlg::setSymbol(const QString& sSymbol){	m_pSymbolHC->setCurrentText(sSymbol);}/** * @param	slSymHistory	A list of previously queried symbols */void SymbolDlg::setHistory(QStringList& slSymHistory){	m_pSymbolHC->setHistoryItems(slSymHistory);}/** * @return	The current text of the symbol combo-box */QString SymbolDlg::getSymbol() const{	QString sResult;		sResult = m_pSymbolHC->currentText().stripWhiteSpace();	if (m_pSubStringCheck->isChecked())		sResult = ".*" + sResult + ".*";			return sResult;}/** * @return	The type of query requested by the user * @note	The returned value does not conform to the type used for running * 			Cscope queries. Use getQueryType() to translate between these *			values. */uint SymbolDlg::getType() const{	return m_pTypeCombo->currentItem();}bool SymbolDlg::getCase() const{	return !m_pCaseCheck->isChecked();}/** * A convinience static function for creating and showing SymbolDlg dialogue. * @param	pParent		The parent widget * @param	nType		The type of query requested by the user (may be *						changed in the dialogue) * @param	sSymbol		The initial text of the combo-box * @return	The text entered by the user in the symbol combo-box, or an empty *			string if the dialogue was cancelled */QString SymbolDlg::promptSymbol(QWidget* pParent, uint& nType, 	const QString& sSymbol, bool& bCase){	SymbolDlg dlg(pParent);		// Initialise the dialogue	dlg.setType(nType);	dlg.setHistory(s_slHistory);	dlg.setSymbol(sSymbol);		// Display the dialogue	if (dlg.exec() != QDialog::Accepted)		return "";		// Return the text entered by the user	nType = dlg.getType();	bCase = dlg.getCase();	dlg.m_pSymbolHC->addToHistory(dlg.getSymbol());	s_slHistory = dlg.m_pSymbolHC->historyItems();	return dlg.getSymbol();}/** * Translates a symbol dialogue type into a Cscope query type. * @param	nType	The type to translate * @return	A query type matching the symbol dialogue type */uint SymbolDlg::getQueryType(uint nType){	if (nType == CallTree)		return CscopeFrontend::None;			if (nType <= Text)		return nType;			return nType + 1;}/** * Runs a symbol definition query, looking for symbols starting with the * currently entered text. * If the hint list is not visible, it is shown first. * This slot is connected to the clicked() signal of the "Hint" button. */void SymbolDlg::slotHintClicked(){	QString sText, sRegExp;		// Show the hint list if necessary	if (!m_pHintList->isVisible()) {		m_pHintList->show();		((QWidget*)m_pHintGroup)->show();		adjustSize();	}		// Clear the previous contents	m_pHintList->clear();		// Get the currently entered text (must have at least one character)	sText = m_pSymbolHC->currentText().stripWhiteSpace();	if (sText.isEmpty())		return;	// Create the regular expression	if (m_pBeginWithRadio->isOn())		sRegExp = sText + "[a-zA-Z0-9_]*";	else			sRegExp = "[a-zA-Z0-9_]*" + sText + "[a-zA-Z0-9_]*";		m_reHint.setPattern(sRegExp);	// Run a Cscope symbol definition query using a regular expression	m_pCscope->query(CscopeFrontend::Definition, sRegExp);}/** * Called when a new record is ready to be added to the hint list. * NOTE: Cscope 15.5 has a bug where the "function" field of the record * displays the regular expression instead of the matched symbol name. For * this reason, we need to extract the symbol from the "Text" field. * @param	pToken	The head of the record's token list */void SymbolDlg::slotHintDataReady(FrontendToken* pToken){	QString sText;	// Get the line text	pToken = pToken->getNext()->getNext()->getNext();	sText = pToken->getData();	// Find the symbol within the line	if (m_reHint.search(sText) == -1)		return;		// Find the symbol within the list, if found - do not add	if (m_pHintList->findItem(m_reHint.capturedTexts().first(), 0))		return;		// Add a list item	(void)new QListViewItem(m_pHintList, m_reHint.capturedTexts().first());}/** * Sets the text of a selected hint list item as the current text of the * symbol combo-box.  * This slot is connected to the doubleClicked() signal of the hint list-view. * @param	pItem	The clicked list item */void SymbolDlg::slotHintItemSelected(QListViewItem* pItem){	m_pSymbolHC->setCurrentText(pItem->text(0));}/** * Refreshes the hint list based on the newly selected option. * This slot is connected to the toggled() signal of the hint options radio * buttons. * NOTE: The list is only refreshed if the system profile is set to Fast. * @param	bOn	true if the button was toggled on */void SymbolDlg::slotHintOptionChanged(bool bOn){	if (bOn && Config().getSysProfile() == KScopeConfig::Fast)		slotHintClicked();}/** * Display a progress bar while the hint query is working. * This slot is connected to the progress() signal emitted by the Cscope * frontend object. * @param	nProgress	Progress value * @param	nTotal		The final expected value */void SymbolDlg::slotHintProgress(int nProgress, int nTotal){	m_progress.setProgress(nProgress, nTotal);}/** * Destroys all progress information widget when the query process terminates. * This slot is connected to the finished() signal emitted by the Cscope * process. */void SymbolDlg::slotHintFinished(uint /* ignored */){	m_progress.finished();}/** * Enables/disables the hint button, based on the newly selected type. * This slot is connected to the activated() signal of the type combo-box. * @param	nType	The newly selected type */void SymbolDlg::slotTypeChanged(int nType){	if (nType == FileName || nType == Including)		m_pHintButton->setEnabled(false);	else		m_pHintButton->setEnabled(true);}#include "symboldlg.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -