diff --git a/plugins/grepview/grepdialog.cpp b/plugins/grepview/grepdialog.cpp index 955d5c6429..e04833add9 100644 --- a/plugins/grepview/grepdialog.cpp +++ b/plugins/grepview/grepdialog.cpp @@ -1,390 +1,390 @@ /*************************************************************************** * Copyright 1999-2001 Bernd Gehrmann and the KDevelop Team * * bernd@kdevelop.org * * Copyright 2007 Dukju Ahn * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "grepdialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "grepviewplugin.h" #include "grepjob.h" #include "grepoutputview.h" #include "grepfindthread.h" using namespace KDevelop; namespace { static int const MAX_LAST_SEARCH_ITEMS_COUNT = 15; const QStringList template_desc = QStringList() << "verbatim" << "word" << "assignment" << "->MEMBER(" << "class::MEMBER(" << "OBJECT->member("; const QStringList template_str = QStringList() << "%s" << "\\b%s\\b" << "\\b%s\\b\\s*=[^=]" << "\\->\\s*\\b%s\\b\\s*\\(" << "([a-z0-9_$]+)\\s*::\\s*\\b%s\\b\\s*\\(" << "\\b%s\\b\\s*\\->\\s*([a-z0-9_$]+)\\s*\\("; const QStringList repl_template = QStringList() << "%s" << "%s" << "%s = " << "->%s(" << "\\1::%s(" << "%s->\\1("; const QStringList filepatterns = QStringList() << "*.h,*.hxx,*.hpp,*.hh,*.h++,*.H,*.tlh,*.cpp,*.cc,*.C,*.c++,*.cxx,*.ocl,*.inl,*.idl,*.c,*.m,*.mm,*.M" << "*.cpp,*.cc,*.C,*.c++,*.cxx,*.ocl,*.inl,*.c,*.m,*.mm,*.M" << "*.h,*.hxx,*.hpp,*.hh,*.h++,*.H,*.tlh,*.idl" << "*.adb" << "*.cs" << "*.f" << "*.html,*.htm" << "*.hs" << "*.java" << "*.js" << "*.php,*.php3,*.php4" << "*.pl" << "*.pp,*.pas" << "*.py" << "*.js,*.css,*.yml,*.rb,*.rhtml,*.html.erb,*.rjs,*.js.rjs,*.rxml,*.xml.builder" << "CMakeLists.txt,*.cmake" << "*"; const QStringList excludepatterns = QStringList() << "/CVS/,/SCCS/,/.svn/,/_darcs/,/build/,/.git/" << ""; } const KDialog::ButtonCode GrepDialog::SearchButton = KDialog::User1; const KDialog::ButtonCode GrepDialog::ReplaceButton = KDialog::User2; GrepDialog::GrepDialog( GrepViewPlugin * plugin, QWidget *parent, bool setLastUsed ) : KDialog(parent), Ui::GrepWidget(), m_plugin( plugin ) { setAttribute(Qt::WA_DeleteOnClose); setButtons( SearchButton | ReplaceButton | KDialog::Cancel ); setButtonText( SearchButton, i18n("Search") ); setButtonText( ReplaceButton, i18n("Replace") ); - setCaption( i18n("Find In Files") ); + setCaption( i18n("Find/Replace In Files") ); setDefaultButton( SearchButton ); setupUi(mainWidget()); KConfigGroup cg = KGlobal::config()->group( "GrepDialog" ); // add default values when the most recent ones should not be set if(!setLastUsed) { patternCombo->addItem( "" ); replacementCombo->addItem( "" ); } patternCombo->addItems( cg.readEntry("LastSearchItems", QStringList()) ); patternCombo->setInsertPolicy(QComboBox::InsertAtTop); templateTypeCombo->addItems(template_desc); templateTypeCombo->setCurrentIndex( cg.readEntry("LastUsedTemplateIndex", 0) ); templateEdit->setText( cg.readEntry("LastUsedTemplateString", template_str[0]) ); replacementTemplateEdit->setText( cg.readEntry("LastUsedReplacementTemplateString", repl_template[0]) ); replacementCombo->addItems( cg.readEntry("LastReplacementItems", QStringList()) ); replacementCombo->setInsertPolicy(QComboBox::InsertAtTop); regexCheck->setChecked(cg.readEntry("regexp", false )); caseSensitiveCheck->setChecked(cg.readEntry("case_sens", true)); setDirectory( QDir::homePath() ); directoryRequester->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly ); syncButton->setIcon(KIcon("dirsync")); recursiveCheck->setChecked(cg.readEntry("recursive", true)); limitToProjectCheck->setChecked(cg.readEntry("search_project_files", true)); filesCombo->addItems(cg.readEntry("file_patterns", filepatterns)); excludeCombo->addItems(cg.readEntry("exclude_patterns", excludepatterns) ); connect(this, SIGNAL(buttonClicked(KDialog::ButtonCode)), this, SLOT(performAction(KDialog::ButtonCode))); connect(syncButton, SIGNAL(clicked()), this, SLOT(syncButtonClicked())); connect(templateTypeCombo, SIGNAL(activated(int)), this, SLOT(templateTypeComboActivated(int))); connect(patternCombo, SIGNAL(editTextChanged(const QString&)), this, SLOT(patternComboEditTextChanged( const QString& ))); patternComboEditTextChanged( patternCombo->currentText() ); patternCombo->setFocus(); connect(directoryRequester, SIGNAL(textChanged(const QString&)), this, SLOT(directoryChanged(const QString&))); } void GrepDialog::directoryChanged(const QString& dir) { setEnableProjectBox(false); KUrl currentUrl = dir; if( !currentUrl.isValid() ) return; IProject *proj = ICore::self()->projectController()->findProjectForUrl( currentUrl ); if( proj && proj->folder().isLocalFile() ) { setEnableProjectBox(! proj->files().isEmpty() ); } } // Returns the contents of a QComboBox as a QStringList static QStringList qCombo2StringList( QComboBox* combo, bool allowEmpty = false ) { QStringList list; if (!combo) { return list; } int skippedItem = -1; if (!combo->currentText().isEmpty() || allowEmpty) { list << combo->currentText(); } if (combo->currentIndex() != -1 && !combo->itemText(combo->currentIndex()).isEmpty()) { skippedItem = combo->currentIndex(); } for (int i = 0; i < std::min(MAX_LAST_SEARCH_ITEMS_COUNT, combo->count()); ++i) { if (i != skippedItem && !combo->itemText(i).isEmpty()) { list << combo->itemText(i); } } return list; } GrepDialog::~GrepDialog() { KConfigGroup cg = KGlobal::config()->group( "GrepDialog" ); // memorize the last patterns and paths cg.writeEntry("LastSearchItems", qCombo2StringList(patternCombo)); cg.writeEntry("LastReplacementItems", qCombo2StringList(replacementCombo, true)); cg.writeEntry("regexp", regexCheck->isChecked()); cg.writeEntry("recursive", recursiveCheck->isChecked()); cg.writeEntry("search_project_files", limitToProjectCheck->isChecked()); cg.writeEntry("case_sens", caseSensitiveCheck->isChecked()); cg.writeEntry("exclude_patterns", qCombo2StringList(excludeCombo)); cg.writeEntry("file_patterns", qCombo2StringList(filesCombo)); cg.writeEntry("LastUsedTemplateIndex", templateTypeCombo->currentIndex()); cg.writeEntry("LastUsedTemplateString", templateEdit->text()); cg.writeEntry("LastUsedReplacementTemplateString", replacementTemplateEdit->text()); cg.sync(); } void GrepDialog::templateTypeComboActivated(int index) { templateEdit->setText(template_str[index]); replacementTemplateEdit->setText(repl_template[index]); } void GrepDialog::syncButtonClicked( ) { IDocument *doc = m_plugin->core()->documentController()->activeDocument(); kDebug(9001) << doc; if ( doc ) { KUrl url = doc->url(); if ( url.isLocalFile() ) { setDirectory( url.upUrl().toLocalFile() ); } } } void GrepDialog::setEnableProjectBox(bool enable) { limitToProjectCheck->setEnabled(enable); if (!enable) limitToProjectCheck->setChecked(false); } void GrepDialog::setPattern(const QString &pattern) { patternCombo->setEditText(pattern); } void GrepDialog::setDirectory(const QString &dir) { directoryRequester->lineEdit()->setText(dir); directoryRequester->fileDialog()->setUrl( KUrl( dir ) ); directoryRequester->completionObject()->setDir( dir ); } QString GrepDialog::patternString() const { return patternCombo->currentText(); } QString GrepDialog::templateString() const { return templateEdit->text().isEmpty() ? "%s" : templateEdit->text(); } QString GrepDialog::replacementTemplateString() const { return replacementTemplateEdit->text(); } QString GrepDialog::replacementString() const { return replacementCombo->currentText(); } QString GrepDialog::filesString() const { return filesCombo->currentText(); } QString GrepDialog::excludeString() const { return excludeCombo->currentText(); } KUrl GrepDialog::directory() const { return directoryRequester->url(); } bool GrepDialog::useProjectFilesFlag() const { return limitToProjectCheck->isChecked(); } bool GrepDialog::regexpFlag() const { return regexCheck->isChecked(); } bool GrepDialog::recursiveFlag() const { return recursiveCheck->isChecked(); } bool GrepDialog::caseSensitiveFlag() const { return caseSensitiveCheck->isChecked(); } void GrepDialog::patternComboEditTextChanged( const QString& text) { enableButton( SearchButton, !text.isEmpty() ); enableButton( ReplaceButton, !text.isEmpty() ); } void GrepDialog::performAction(KDialog::ButtonCode button) { // a click on cancel trigger this signal too if( button != SearchButton && button != ReplaceButton ) return; // search for unsaved documents QList unsavedFiles; QStringList include = GrepFindFilesThread::parseInclude(filesString()); QStringList exclude = GrepFindFilesThread::parseExclude(excludeString()); foreach(IDocument* doc, ICore::self()->documentController()->openDocuments()) { KUrl docUrl = doc->url(); if(doc->state() != IDocument::Clean && directory().isParentOf(docUrl) && QDir::match(include, docUrl.fileName()) && !QDir::match(exclude, docUrl.toLocalFile())) { unsavedFiles << doc; } } if(!unsavedFiles.empty()) { // show dialog KSaveSelectDialog dlg(unsavedFiles, this); if(dlg.exec() == QDialog::Rejected) { close(); return; } } GrepJob* job = m_plugin->grepJob(); GrepOutputViewFactory *m_factory = new GrepOutputViewFactory(); GrepOutputView *toolView = (GrepOutputView*)ICore::self()->uiController()-> findToolView(i18n("Replace in files"), m_factory, IUiController::CreateAndRaise); toolView->renewModel(); toolView->enableReplace(button == ReplaceButton); toolView->setPlugin(m_plugin); connect(job, SIGNAL(showErrorMessage(QString, int)), toolView, SLOT(showErrorMessage(QString))); connect(job, SIGNAL(showMessage(KDevelop::IStatus*, QString, int)), toolView, SLOT(showMessage(KDevelop::IStatus*, QString))); job->setOutputModel(toolView->model()); job->setPatternString(patternString()); job->setReplacementTemplateString(replacementTemplateString()); job->setTemplateString(templateString()); job->setReplaceString(replacementString()); job->setFilesString(filesString()); job->setExcludeString(excludeString()); job->setDirectory(directory()); job->setProjectFilesFlag( useProjectFilesFlag() ); job->setRegexpFlag( regexpFlag() ); job->setRecursive( recursiveFlag() ); job->setCaseSensitive( caseSensitiveFlag() ); job->setReplaceFlag( button == ReplaceButton ); kDebug() << "registering job"; ICore::self()->runController()->registerJob(job); m_plugin->rememberSearchDirectory(directory().toLocalFile(KUrl::AddTrailingSlash)); close(); } #include "grepdialog.moc" diff --git a/plugins/grepview/kdevgrepview.desktop b/plugins/grepview/kdevgrepview.desktop index 78d7f84eb0..c0ad8334ab 100644 --- a/plugins/grepview/kdevgrepview.desktop +++ b/plugins/grepview/kdevgrepview.desktop @@ -1,90 +1,90 @@ [Desktop Entry] Type=Service Exec=blubb -Comment=Allows fast searching of multiple files using patterns or regular expressions. +Comment=Allows fast searching of multiple files using patterns or regular expressions. And allow to replace it too. Comment[ca]=Permet la cerca ràpida de múltiples fitxers usant patrons o expressions regulars. Comment[ca@valencia]=Permet la cerca ràpida de múltiples fitxers usant patrons o expressions regulars. Comment[da]=Tillader hurtig søgning af flere filer med brug af mønstre eller regulære udtryk. Comment[de]=Ermöglicht es, dateiübergreifend nach Mustern und regulären Ausdrücken zu suchen. Comment[en_GB]=Allows fast searching of multiple files using patterns or regular expressions. Comment[es]=Permitir búsquedas rápidas de múltiples archivos usando patrones o expresiones regulares. Comment[et]=Lubab mustreid või regulaaravaldisi kasutades kiiresti paljudes failides teksti otsida. Comment[fr]=Permet la recherche rapide de fichiers multiples à l'aide de motifs ou d'expressions rationnelles. Comment[ga]=Ceadaíonn sé duit il-comhaid a chuardach go tapa le patrúin nó sloinn ionadaíochta. Comment[gl]=Permite facer unha procura rápida en varios ficheiros empregando padróns ou expresións regulares. Comment[it]=Consente la ricerca veloce di file multipli usando espressioni regolari o modelli. Comment[nb]=Gjør raskt søk i flere filer mulig ved hjelp av mønstre eller regulære uttrykk. Comment[nds]=Stellt gau Dörsöken vun mehr Dateien mit Söökmustern oder reguleer Utdrück praat. Comment[nl]=Staat toe snel te zoeken naar meerdere bestanden met gebruik van patronen of reguliere expressies. Comment[pl]=Pozwala na szybkie przeszukiwanie plików za pomocą wzorców lub wyrażeń regularnych. Comment[pt]=Permite pesquisar rapidamente em vários ficheiros, usando padrões ou expressões regulares. Comment[pt_BR]=Permite pesquisar rapidamente em vários arquivos, usando padrões ou expressões regulares. Comment[sl]=Omogoča iskanje po več datotekah, z uporabo vzorcev ali pa regularnih izrazov. Comment[sv]=Tillåter snabb sökning i flera filer med mönster eller reguljära uttryck. Comment[uk]=Надає можливості швидкого пошуку декількох файлів на основі шаблонів або формальних виразів. -Comment[x-test]=xxAllows fast searching of multiple files using patterns or regular expressions.xx +Comment[x-test]=xxAllows fast searching of multiple files using patterns or regular expressions. And allow to replace it too.xx Comment[zh_CN]=允许使用匹配模式或正则表达式快速搜索多行。 Comment[zh_TW]=允許使用樣式或正規表示式來快速搜尋多個檔案。 -Name=Find In Files +Name=Find/Replace In Files Name[bg]=Търсене във файлове Name[ca]=Cerca en fitxers Name[ca@valencia]=Cerca en fitxers Name[cs]=Najít v souborech Name[da]=Find i filer Name[de]=In Dateien Suchen -Name[en_GB]=Find In Files +Name[en_GB]=Find/Replace In Files Name[es]=Buscar en archivos Name[et]=Failides otsimine Name[fr]=Chercher dans les fichiers Name[gl]=Procurar nos ficheiros Name[it]=Trova nei file Name[ja]=ファイルを検索 Name[nb]=Finn i filer Name[nds]=Binnen Dateien söken Name[nl]=Zoeken in bestanden Name[pl]=Znajdź w plikach Name[pt]=Procurar nos Ficheiros Name[pt_BR]=Procurar nos Arquivos Name[ru]=Поиск в файлах Name[sl]=Najdi v datotekah Name[sv]=Sök i filer Name[tr]=Dosyalarda Ara Name[uk]=Пошук у файлах -Name[x-test]=xxFind In Filesxx +Name[x-test]=xxFind/Replace In Filesxx Name[zh_CN]=在文件中查找 Name[zh_TW]=在檔案中尋找 GenericName=Search Tool GenericName[bg]=Инструмент за търсене GenericName[ca]=Eina de cerca GenericName[ca@valencia]=Eina de cerca GenericName[da]=Søgeværktøj GenericName[de]=Such-Werkzeug GenericName[en_GB]=Search Tool GenericName[es]=Herramienta de búsqueda GenericName[et]=Otsimise tööriist GenericName[fr]=Outil de recherche GenericName[gl]=Utilidade de procura GenericName[it]=Strumento ricerca GenericName[ja]=検索ツール GenericName[nb]=Søkeverktøy GenericName[nds]=Söökwarktüüch GenericName[nl]=Hulpmiddel voor zoeken GenericName[pl]=Narzędzie wyszukiwania GenericName[pt]=Ferramenta de Pesquisa GenericName[pt_BR]=Ferramenta de Pesquisa GenericName[ru]=Инструмент поиска GenericName[sl]=Orodje za iskanje GenericName[sv]=Sökverktyg GenericName[tr]=Arama Aracı GenericName[uk]=Інструмент пошуку GenericName[x-test]=xxSearch Toolxx GenericName[zh_CN]=搜索工具 GenericName[zh_TW]=搜尋工具 Icon=kfind ServiceTypes=KDevelop/Plugin X-KDE-Library=kdevgrepview X-KDE-PluginInfo-Name=kdevgrepview X-KDevelop-Version=11 X-KDevelop-Category=Global X-KDevelop-IRequired=org.kdevelop.IStatus X-KDevelop-Mode=GUI