[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    [PATCH] Translating the clipboard with Klipper
From:       Kurt Granroth <granroth () suse ! com>
Date:       2001-02-16 20:27:26
[Download RAW message or body]

This isn't even remotely a bug fix (much less a critical one) so I
won't be hoping to get this in 2.1... but it's just so fun that I
thought I'd post the patch to it here.

I hacked klipper to add a "Translate Clipboard" submenu.  When you
select a translation (English to German, for instance), it will send
the contents of the clipboard to babelfish for the translation.

I also made the submenu a tear off one.  That allows me to have a
small menu by the side of my konsole while reading mail.  When I come
across a non-English word, I just click on the proper entry and I get
my (very rough) translation.

Now to go hack in dictionary and thesaurus support :-)
-- 
Kurt Granroth            | http://www.granroth.org
KDE Developer/Evangelist | SuSE Labs Open Source Developer
granroth@kde.org         | granroth@suse.com
            KDE -- Conquer Your Desktop

["klipper.diff" (text/plain)]

Index: toplevel.cpp
===================================================================
RCS file: /home/kde/kdebase/klipper/toplevel.cpp,v
retrieving revision 1.49
diff -b -u -r1.49 toplevel.cpp
--- toplevel.cpp	2001/01/30 21:46:15	1.49
+++ toplevel.cpp	2001/02/16 20:17:20
@@ -25,6 +25,8 @@
 #include <kstringhandler.h>
 #include <kiconloader.h>
 
+#include <krun.h>
+
 #include "configdialog.h"
 #include "toplevel.h"
 #include "urlgrabber.h"
@@ -34,8 +36,16 @@
 #define CONFIG_ITEM  60
 #define URLGRAB_ITEM 70
 
+struct Lang {
+  enum LangCodes {
+    EN_FR, EN_DE, EN_IT, EN_PT, EN_ES,
+    FR_EN, DE_EN, IT_EN, PT_EN, ES_EN, RU_EN,
+    DE_FR, FR_DE
+  };
+};
+
 // the <clipboard empty> item
-#define EMPTY 6
+#define EMPTY 8
 
 /* XPM */
 static const char*mouse[]={
@@ -88,6 +98,27 @@
     connect(pQPMmenu, SIGNAL(activated(int)),
             this, SLOT(clickedMenu(int)));
 
+    pQPMtranslate = new QPopupMenu(pQPMmenu, "translate_menu");
+    pQPMtranslate->insertTearOffHandle();
+    pQPMtranslate->setCaption(i18n("Translate Clipboard"));
+    connect(pQPMtranslate, SIGNAL(activated(int)),
+            this, SLOT(clickedTranslate(int)));
+    pQPMtranslate->insertItem(i18n("English to French"), Lang::EN_FR);
+    pQPMtranslate->insertItem(i18n("English to German"), Lang::EN_DE);
+    pQPMtranslate->insertItem(i18n("English to Italian"), Lang::EN_IT);
+    pQPMtranslate->insertItem(i18n("English to Portuguese"), Lang::EN_PT);
+    pQPMtranslate->insertItem(i18n("English to Spanish"), Lang::EN_ES);
+    pQPMtranslate->insertSeparator();
+    pQPMtranslate->insertItem(i18n("French to English"), Lang::FR_EN);
+    pQPMtranslate->insertItem(i18n("German to English"), Lang::DE_EN);
+    pQPMtranslate->insertItem(i18n("Italian to English"), Lang::IT_EN);
+    pQPMtranslate->insertItem(i18n("Portuguese to English"), Lang::PT_EN);
+    pQPMtranslate->insertItem(i18n("Spanish to English"), Lang::ES_EN);
+    pQPMtranslate->insertItem(i18n("Russian to English"), Lang::RU_EN);
+    pQPMtranslate->insertSeparator();
+    pQPMtranslate->insertItem(i18n("German to French"), Lang::DE_FR);
+    pQPMtranslate->insertItem(i18n("French to German"), Lang::FR_DE);
+
     pQIDclipData = new QIntDict<QString>();
     pQIDclipData->setAutoDelete(TRUE);
 
@@ -124,6 +155,7 @@
     delete globalKeys;
     delete pQTcheck;
     delete pQPMmenu;
+    delete pQPMtranslate;
     delete pQIDclipData;
     delete pQPpic;
     delete myURLGrabber;
@@ -229,7 +261,64 @@
     }
 }
 
+void TopLevel::clickedTranslate(int id)
+{
+    QString *data = pQIDclipData->find(pSelectedItem);
+    if(!data )
+        return;
+
+    QString query ( "text=" + KURL::encode_string( *data ) );
+    switch ( id ){
+    case Lang::EN_FR:
+        query+="&lp=en_fr";
+        break;
+    case Lang::EN_DE:
+        query+="&lp=en_de";
+        break;
+    case Lang::EN_IT:
+        query+="&lp=en_it";
+        break;
+    case Lang::EN_PT:
+        query+="&lp=en_pt";
+        break;
+    case Lang::EN_ES:
+        query+="&lp=en_es";
+        break;
+    case Lang::FR_EN:
+        query+="&lp=fr_en";
+        break;
+    case Lang::DE_EN:
+        query+="&lp=de_en";
+        break;
+    case Lang::IT_EN:
+        query+="&lp=it_en";
+        break;
+    case Lang::PT_EN:
+        query+="&lp=pt_en";
+        break;
+    case Lang::ES_EN:
+        query+="&lp=es_en";
+        break;
+    case Lang::RU_EN:
+        query+="&lp=ru_en";
+        break;
+    case Lang::DE_FR:
+        query+="&lp=de_fr";
+        break;
+    case Lang::FR_DE:
+        query+="&lp=fr_de";
+        break;
+    default:
+        query+="&lp=en_fr";
+        break;
+    }
+
+    KURL babel( "http://babel.altavista.com/translate.dyn" );
+    babel.setQuery( query );
 
+    (void)new KRun( babel );
+}
+
 void TopLevel::showPopupMenu( QPopupMenu *menu )
 {
     ASSERT( menu != 0L );
@@ -273,6 +362,8 @@
   // id aftwards for the given index.
   toggleURLGrabAction->plug( pQPMmenu, URLGRAB_ITEM );
   pQPMmenu->setId( URLGRAB_ITEM, URLGRAB_ITEM );
+  pQPMmenu->insertSeparator();
+  pQPMmenu->insertItem(i18n("&Translate Clipboard"), pQPMtranslate);
   pQPMmenu->insertSeparator();
   long int id;
 
Index: toplevel.h
===================================================================
RCS file: /home/kde/kdebase/klipper/toplevel.h,v
retrieving revision 1.13
diff -b -u -r1.13 toplevel.h
--- toplevel.h	2001/01/15 04:37:55	1.13
+++ toplevel.h	2001/02/16 20:17:20
@@ -52,6 +52,7 @@
 private slots:
     void newClipData();
     void clickedMenu(int);
+    void clickedTranslate(int);
     void slotConfigure();
 
 private:
@@ -59,6 +60,7 @@
 
     QString QSlast;
     KPopupMenu *pQPMmenu;
+    QPopupMenu *pQPMtranslate;
     KToggleAction *toggleURLGrabAction;
     QIntDict<QString> *pQIDclipData;
     QTimer *pQTcheck;

>> Visit http://master.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic