diff options
| author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
|---|---|---|
| committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
| commit | e9ae80694875f869892f13f4fcaf1170a00dea41 (patch) | |
| tree | aa2f8d8a217e2d376224c8d46b7397b68d35de2d /kfilereplace/kfilereplaceview.cpp | |
| download | tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.tar.gz tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.zip | |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdewebdev@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kfilereplace/kfilereplaceview.cpp')
| -rw-r--r-- | kfilereplace/kfilereplaceview.cpp | 672 | 
1 files changed, 672 insertions, 0 deletions
| diff --git a/kfilereplace/kfilereplaceview.cpp b/kfilereplace/kfilereplaceview.cpp new file mode 100644 index 00000000..16ca82da --- /dev/null +++ b/kfilereplace/kfilereplaceview.cpp @@ -0,0 +1,672 @@ +/***************************************************************************** +                          kfilereplaceview.cpp  -  description +                             ------------------- +    begin                : sam oct 16 15:28:00 CEST 1999 +    copyright            : (C) 1999 by Fran�is Dupoux <dupoux@dupoux.com> +                           (C) 2004 Emiliano Gulmini <emi_barbarossa@yahoo.it> +*****************************************************************************/ + +/***************************************************************************** + *                                                                           * + *   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.                                     * + *                                                                           * + *****************************************************************************/ + +// Qt +#include <qwhatsthis.h> +#include <qmap.h> +#include <qfileinfo.h> + +// KDE +#include <klistview.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kpopupmenu.h> +#include <krun.h> +#include <kpropertiesdialog.h> +#include <kapplication.h> +#include <dcopclient.h> +#include <dcopref.h> +//#include <kdebug.h> +#include <kiconloader.h> +#include <kled.h> +#include <kfiledialog.h> + +// local +#include "kfilereplaceview.h" +#include "kfilereplacelib.h" +#include "kaddstringdlg.h" +#include "whatthis.h" + +using namespace whatthisNameSpace; + +KFileReplaceView::KFileReplaceView(RCOptions* info, QWidget *parent,const char *name):KFileReplaceViewWdg(parent,name) +{ +  m_option = info; + +  initGUI(); + +  // connect events +  connect(m_lvResults, SIGNAL(mouseButtonClicked(int, QListViewItem *, const QPoint &, int)), this, SLOT(slotMouseButtonClicked(int, QListViewItem *, const QPoint &))); +  connect(m_lvResults_2, SIGNAL(mouseButtonClicked(int, QListViewItem *, const QPoint &, int)), this, SLOT(slotMouseButtonClicked(int, QListViewItem *, const QPoint &))); +  connect(m_lvStrings, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(slotStringsEdit())); +  connect(m_lvStrings_2, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(slotStringsEdit())); + +  whatsThis(); +} + +QString KFileReplaceView::currentPath() +{ +  QListViewItem *lvi; + +  if(! m_lviCurrent) lvi = m_rv->currentItem(); +  else lvi = (QListViewItem*) m_lviCurrent; + +  while (lvi->parent()) +    lvi = lvi->parent(); + +  return QString(lvi->text(1)+"/"+lvi->text(0)); +} + +void KFileReplaceView::showSemaphore(QString s) +{ +  if(s == "green") +  { +    m_ledGo->setState(KLed::On); +    m_ledWait->setState(KLed::Off); +    m_ledStop->setState(KLed::Off); +  } +  else +    if(s == "yellow") +  { +    m_ledGo->setState(KLed::Off); +    m_ledWait->setState(KLed::On); +    m_ledStop->setState(KLed::Off); +  } +  else +    if(s == "red") +  { +    m_ledGo->setState(KLed::Off); +    m_ledWait->setState(KLed::Off); +    m_ledStop->setState(KLed::On); +  } +} + +void KFileReplaceView::stringsInvert(bool invertAll) +{ +  QListViewItem* lviCurItem, +  * lviFirst; +  KListView* sv = getStringsView(); + +  if(invertAll) +    lviCurItem = lviFirst = sv->firstChild(); +  else +    lviCurItem = lviFirst = sv->currentItem(); + +  if(lviCurItem == 0) +    return ; + +  do +  { +    QString searchText = lviCurItem->text(0), +            replaceText = lviCurItem->text(1); + +      // Cannot invert the string when search string is empty +    if (replaceText.isEmpty()) +    { +      KMessageBox::error(0, i18n("<qt>Cannot invert string <b>%1</b>, because the search string would be empty.</qt>").arg(searchText)); +      return; +    } + +    lviCurItem->setText(0, replaceText); +    lviCurItem->setText(1, searchText); + +    lviCurItem = lviCurItem->nextSibling(); +    if(!invertAll) +      break; +  } while(lviCurItem && lviCurItem != lviFirst); +  setCurrentStringsViewMap(); +} + +void KFileReplaceView::changeView(bool searchingOnlyMode) +{ +  if(searchingOnlyMode) +    { +      m_stackResults->raiseWidget(m_lvResults_2); +      m_stackStrings->raiseWidget(m_lvStrings_2); +      m_rv = m_lvResults_2; +      m_sv = m_lvStrings_2; +    } +  else +    { +      m_stackResults->raiseWidget(m_lvResults); +      m_stackStrings->raiseWidget(m_lvStrings); +      m_rv = m_lvResults; +      m_sv = m_lvStrings; +    } +} + +KListView* KFileReplaceView::getResultsView() +{ +  if(m_option->m_searchingOnlyMode) +    m_rv = m_lvResults_2; +  else +    m_rv = m_lvResults; + +  return m_rv; +} + +KListView* KFileReplaceView::getStringsView() +{ +  if(m_option->m_searchingOnlyMode) +    m_sv = m_lvStrings_2; +  else +    m_sv = m_lvStrings; +  return m_sv; +} + +//PUBLIC SLOTS +void KFileReplaceView::slotMouseButtonClicked (int button, QListViewItem *lvi, const QPoint &pos) +{ +  if (lvi == 0) // No item selected +    return; + +  // RIGHT BUTTON +  if (button == QMouseEvent::RightButton) +    { +      m_lviCurrent = static_cast<KListViewItem*>(lvi); +      m_menuResult->popup(pos); +    } +} + +void KFileReplaceView::slotResultProperties() +{ +  QString currItem = currentPath(); +  if(! currItem.isEmpty()) +    { +      KURL url(currItem); +      (void) new KPropertiesDialog(url); +      m_lviCurrent = 0; +    } +} + +void KFileReplaceView::slotResultOpen() +{ +  QString currItem = currentPath(); +  if(!currItem.isEmpty()) +    { +      (void) new KRun(KURL(currItem), 0, true, true); +      m_lviCurrent = 0; +    } +} + +void KFileReplaceView::slotResultOpenWith() +{ +  QString currItem = currentPath(); +  if(!currItem.isEmpty()) +    { +      KURL::List kurls; +      kurls.append(KURL(currItem)); +      KRun::displayOpenWithDialog(kurls); +      m_lviCurrent = 0; +    } +} + +void KFileReplaceView::slotResultDirOpen() +{ +  QString currItem = currentPath(); +  if(!currItem.isEmpty()) +    { +      QFileInfo fi; +      fi.setFile(currItem); +      (void) new KRun (KURL::fromPathOrURL(fi.dirPath()), 0, true, true); +      m_lviCurrent = 0; +    } +} + +void KFileReplaceView::slotResultEdit() +{ +  QListViewItem *lvi = m_rv->firstChild(); + +  while (lvi) +    { +      DCOPClient *client = kapp->dcopClient(); +      DCOPRef quanta(client->appId(),"WindowManagerIf"); +      QString path = QString(lvi->text(1)+"/"+lvi->text(0)); +      QListViewItem *lviChild = lvi; + +      while(lviChild) +        { +          if(lviChild->isSelected()) +            { +              coord c; +              if(lviChild == lvi) +                { +                  c.line = 0; +                  c.column = 0; +                } +              else +                { +                  c= extractWordCoordinates(lviChild); +                } +              bool success = quanta.send("openFile", path, c.line, c.column); + +              if(!success) +                { +                  QString message = i18n("File %1 cannot be opened. Might be a DCOP problem.").arg(path); +                  KMessageBox::error(parentWidget(), message); +                } +            } +            if (lviChild == lvi) +              lviChild = lviChild->firstChild(); +            else +              lviChild = lviChild->nextSibling(); +        } + +      lvi = lvi->nextSibling(); +    } + +  m_lviCurrent = 0; +} + +void KFileReplaceView::slotResultDelete() +{ +  QString currItem = currentPath(); +  if (!currItem.isEmpty()) +    { +      QFile fi; +      int answer = KMessageBox::warningContinueCancel(this, i18n("Do you really want to delete %1?").arg(currItem), +                                                      QString::null,KStdGuiItem::del()); + +      if(answer == KMessageBox::Continue) +        { +          fi.setName(currItem); +          fi.remove(); + +          delete m_lviCurrent; +          m_lviCurrent = 0; +        } +    } +} + +void KFileReplaceView::slotResultTreeExpand() +{ +  QListViewItem *lviRoot = getResultsView()->firstChild(); + +  if(lviRoot) +    expand(lviRoot, true); +} + +void KFileReplaceView::slotResultTreeReduce() +{ +  QListViewItem *lviRoot = getResultsView()->firstChild(); + +  if(lviRoot) +    expand(lviRoot, false); +} + +void KFileReplaceView::slotStringsAdd() +{ +  KeyValueMap oldMap(m_option->m_mapStringsView); + +  KAddStringDlg addStringDlg(m_option, false); + +  if(!addStringDlg.exec()) +    return; + +  KeyValueMap addedStringsMap(m_option->m_mapStringsView); +  KeyValueMap::Iterator itMap; + +  for(itMap = oldMap.begin(); itMap != oldMap.end(); ++itMap) +    addedStringsMap.insert(itMap.key(),itMap.data()); + +  m_option->m_mapStringsView = addedStringsMap; + +  raiseResultsView(); +  raiseStringsView(); + +  loadMapIntoView(addedStringsMap); +} + +void KFileReplaceView::slotQuickStringsAdd(const QString& quickSearch, const QString& quickReplace) +{ +  if(!quickSearch.isEmpty()) +  { +    KeyValueMap map; +    if(quickReplace.isEmpty()) +    { +      map[quickSearch] = QString::null; +      m_option->m_searchingOnlyMode = true; +    } +    else +    { +      map[quickSearch] = quickReplace; +      m_option->m_searchingOnlyMode = false; +    } + +    m_option->m_mapStringsView = map; + +    raiseResultsView(); +    raiseStringsView(); + +    loadMapIntoView(map); +  } +} + +void KFileReplaceView::slotStringsEdit() +{ +  KeyValueMap oldMap(m_option->m_mapStringsView); +  if(oldMap.isEmpty()) return; +  bool oldSearchFlagValue = m_option->m_searchingOnlyMode; + +  oldMap.remove(m_sv->currentItem()->text(0)); + +  m_option->m_mapStringsView.clear(); + +  m_option->m_mapStringsView.insert(m_sv->currentItem()->text(0), m_sv->currentItem()->text(1)); + +  KAddStringDlg addStringDlg(m_option, true); + +  if(!addStringDlg.exec()) +    return; + +  KeyValueMap newMap(m_option->m_mapStringsView); +  if(oldSearchFlagValue == m_option->m_searchingOnlyMode) +  { +    KeyValueMap::Iterator itMap; + +      //merges the two maps +    for(itMap = oldMap.begin(); itMap != oldMap.end(); ++itMap) +      newMap.insert(itMap.key(),itMap.data()); +  } + +  m_option->m_mapStringsView = newMap; + +  raiseResultsView(); +  raiseStringsView(); + +  loadMapIntoView(newMap); +} + +void KFileReplaceView::slotStringsSave() +{ +  // Check there are strings in the list +  KListView* sv = getStringsView(); + +  if (sv->firstChild() == 0) +  { +    KMessageBox::error(0, i18n("No strings to save as the list is empty.")); +    return ; +  } + +  QString header("<?xml version=\"1.0\" ?>\n<kfr>"), +  footer("\n</kfr>"), +  body; +  if(m_option->m_searchingOnlyMode) +    header += "\n\t<mode search=\"true\"/>"; +  else +    header += "\n\t<mode search=\"false\"/>"; + +  QListViewItem*  lvi = sv->firstChild(); + +  while( lvi ) +  { +    body += QString("\n\t<replacement>" +	"\n\t\t<oldstring><![CDATA[%1]]></oldstring>" +	"\n\t\t<newstring><![CDATA[%2]]></newstring>" +	"\n\t</replacement>").arg(lvi->text(0)).arg(lvi->text(1)); +    lvi = lvi->nextSibling(); +  } + +   // Selects the file where strings will be saved +  QString menu = "*.kfr|" + i18n("KFileReplace Strings") + " (*.kfr)\n*|" + i18n("All Files") + " (*)"; +  QString fileName = KFileDialog::getSaveFileName(QString::null, menu, 0, i18n("Save Strings to File")); +  if (fileName.isEmpty()) +    return; + +   // Forces the extension to be "kfr" == KFileReplace extension + +  fileName = KFileReplaceLib::addExtension(fileName, "kfr"); + +  QFile file( fileName ); +  if(!file.open( IO_WriteOnly )) +  { +    KMessageBox::error(0, i18n("File %1 cannot be saved.").arg(fileName)); +    return ; +  } +  QTextStream oTStream( &file ); +  oTStream.setEncoding(QTextStream::UnicodeUTF8); +  oTStream << header +      << body +      << footer; +  file.close(); +} + +void KFileReplaceView::slotStringsDeleteItem() +{ +  QListViewItem* item = m_sv->currentItem(); +  if(item != 0) +  { +    KeyValueMap m = m_option->m_mapStringsView; +    m.remove(item->text(0)); +    m_option->m_mapStringsView = m; +    delete item; +  } +} + +void KFileReplaceView::slotStringsEmpty() +{ +  QListViewItem * myChild = m_sv->firstChild(); +  while( myChild ) +  { +    QListViewItem* item = myChild; +    myChild = myChild->nextSibling(); +    delete item; +  } +  KeyValueMap m; +  m_option->m_mapStringsView = m; +} + +//PRIVATE +void KFileReplaceView::initGUI() +{ +  m_option->m_searchingOnlyMode = true; + +  m_stackResults->addWidget(m_lvResults); +  m_stackResults->addWidget(m_lvResults_2); +  m_stackStrings->addWidget(m_lvStrings); +  m_stackStrings->addWidget(m_lvStrings_2); + +  DCOPClient *client = kapp->dcopClient(); +  QCStringList appList = client->registeredApplications(); +  bool quantaFound = false; + + +  for(QCStringList::Iterator it = appList.begin(); it != appList.end(); ++it) +    { +      if((*it).left(6) == "quanta") +        { +          quantaFound = true; +          break; +        } +    } + +  m_menuResult = new KPopupMenu(this, "ResultPopup"); + + + +  m_menuResult->insertItem(SmallIconSet(QString::fromLatin1("fileopen")), +                           i18n("&Open"), +                           this, +                           SLOT(slotResultOpen())); +  if(!quantaFound) +    { +      m_menuResult->insertItem(i18n("Open &With..."), +                               this, +                               SLOT(slotResultOpenWith())); +    } + +  if(quantaFound) +    { +      m_menuResult->insertItem(SmallIconSet("quanta"), +                               i18n("&Edit in Quanta"), +                               this, +                               SLOT(slotResultEdit())); +    } + +  m_menuResult->insertItem(SmallIconSet(QString::fromLatin1("up")), +                           i18n("Open Parent &Folder"), +                           this, +                           SLOT(slotResultDirOpen())); +  m_menuResult->insertItem(SmallIconSet(QString::fromLatin1("editdelete")), +                           i18n("&Delete"), +                           this, +                           SLOT(slotResultDelete())); +  m_menuResult->insertSeparator(); +  m_menuResult->insertItem(SmallIconSet(QString::fromLatin1("info")), +                           i18n("&Properties"), +                           this, +                           SLOT(slotResultProperties())); +  raiseResultsView(); +  raiseStringsView(); +} + +void KFileReplaceView::raiseStringsView() +{ +  if(m_option->m_searchingOnlyMode) +    m_sv = m_lvStrings_2; +  else +    m_sv = m_lvStrings; + +  m_stackStrings->raiseWidget(m_sv); +} + +void KFileReplaceView::raiseResultsView() +{ +  if(m_option->m_searchingOnlyMode) +    m_rv = m_lvResults_2; +  else +    m_rv = m_lvResults; + +  m_stackResults->raiseWidget(m_rv); +} + +coord KFileReplaceView::extractWordCoordinates(QListViewItem* lvi) +{ +  //get coordinates of the first string of the current selected file +  coord c; +  c.line = 0; +  c.column = 0; +  QString s = lvi->text(0); +  //qWarning("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW=%s",s.latin1()); + /* if(lvi->parent()) s = lvi->text(0); +  else return c;*/ + +  QString temp; +  int i = 0; + +  //extracts line and column from lvi->text(0) +  //FIXME: Don't get the line and column number from the text as it's translated and it will +  //fail for non-English languages! + +  //EMILIANO: This is not a good fixing but for now it should reduce the problems +  while(true) +    { +      if(s[i] < '0' || s[i] > '9') +	i++; +      else +	break; +    } +  while(true) +    { +      if(s[i] >= '0' && s[i] <= '9') +        { +	  temp += s[i]; +	  i++; +	} +      else +	break; +    } +  c.line = temp.toInt(); +  temp = QString::null; + +  while(true) +    { +      if(s[i] < '0' || s[i] > '9') +	i++; +      else +	break; +    } +  while(true) +    { +      if(s[i] >= '0' && s[i] <= '9') +      { +	temp += s[i]; +	i++; +      } +      else +	break; +    } +  c.column = temp.toInt(); + +  if(c.line > 0) c.line--; +  if(c.column > 0) c.column--; + +  return c; +} + +void KFileReplaceView::expand(QListViewItem *lviCurrent, bool b) +{ +  // current item +  lviCurrent->setOpen(b); + +  // recursivity +  while((lviCurrent = lviCurrent->nextSibling()) != 0) +    { +      lviCurrent->setOpen(b); + +      if (lviCurrent->firstChild()) +        expand(lviCurrent->firstChild(), b); +    } +} + +void KFileReplaceView::setMap() +{ +  KeyValueMap map; +  QListViewItem* i = m_sv->firstChild(); +  while(i != 0) +  { +    if(m_option->m_searchingOnlyMode) +      map[i->text(0)] = QString::null; +    else +      map[i->text(0)] = i->text(1); +    i = i->nextSibling(); +  } +  m_option->m_mapStringsView = map; +} + +void KFileReplaceView::loadMapIntoView(KeyValueMap map) +{ +  m_sv->clear(); +  KeyValueMap::Iterator itMap; + +  for(itMap = map.begin(); itMap != map.end(); ++itMap) +    { +      QListViewItem* lvi = new QListViewItem(m_sv); +      lvi->setMultiLinesEnabled(true); +      lvi->setText(0,itMap.key()); +      if(!m_option->m_searchingOnlyMode) +        lvi->setText(1,itMap.data()); +    } + +} + +void KFileReplaceView::whatsThis() +{ +  QWhatsThis::add(getResultsView(), lvResultWhatthis); +  QWhatsThis::add(getStringsView(), lvStringsWhatthis); +} +#include "kfilereplaceview.moc" | 
