KDEUI
kcheckaccelerators.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #define INCLUDE_MENUITEM_DEF
00022
00023 #include "kcheckaccelerators.h"
00024
00025 #include <config.h>
00026
00027 #include <QApplication>
00028 #include <QCheckBox>
00029 #include <QDialog>
00030 #include <QKeyEvent>
00031 #include <QLayout>
00032 #include <QMenuBar>
00033 #include <QMetaObject>
00034 #include <QPushButton>
00035 #include <QTabBar>
00036
00037 #include <kconfig.h>
00038 #include <kdebug.h>
00039 #include <kglobal.h>
00040 #include <klocale.h>
00041 #include <kshortcut.h>
00042 #include <ktextbrowser.h>
00043
00044 #include "kacceleratormanager.h"
00045 #include <kconfiggroup.h>
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 KCheckAccelerators::KCheckAccelerators( QObject* parent )
00079 : QObject( parent ), key(0), block( false ), drklash(0)
00080 {
00081 setObjectName( "kapp_accel_filter" );
00082 parent->installEventFilter( this );
00083 KConfigGroup cg( KGlobal::config(), "Development" );
00084 QString sKey = cg.readEntry( "CheckAccelerators" ).trimmed();
00085 if( !sKey.isEmpty() ) {
00086 KShortcut cuts( sKey );
00087 if( !cuts.isEmpty() )
00088 key = int(cuts.primary()[0]);
00089 }
00090 alwaysShow = cg.readEntry( "AlwaysShowCheckAccelerators", false );
00091 autoCheck = cg.readEntry( "AutoCheckAccelerators", true );
00092 connect( &autoCheckTimer, SIGNAL(timeout()), SLOT(autoCheckSlot()));
00093 }
00094
00095 bool KCheckAccelerators::eventFilter( QObject * , QEvent * e)
00096 {
00097 if ( block )
00098 return false;
00099
00100 switch ( e->type() ) {
00101 case QEvent::Shortcut:
00102 if ( key && (static_cast<QKeyEvent *>(e)->key() == key) ) {
00103 block = true;
00104 checkAccelerators( false );
00105 block = false;
00106 static_cast<QKeyEvent *>(e)->accept();
00107 return true;
00108 }
00109 break;
00110 case QEvent::ChildAdded:
00111 case QEvent::ChildRemoved:
00112
00113 if ( !static_cast<QChildEvent *>(e)->child()->isWidgetType() )
00114 break;
00115
00116 case QEvent::Resize:
00117 case QEvent::LayoutRequest:
00118 case QEvent::WindowActivate:
00119 case QEvent::WindowDeactivate:
00120 if( autoCheck ) {
00121 autoCheckTimer.setSingleShot( true );
00122 autoCheckTimer.start( 20 );
00123 }
00124 break;
00125 case QEvent::Timer:
00126 case QEvent::MouseMove:
00127 case QEvent::Paint:
00128 return false;
00129 default:
00130
00131 break;
00132 }
00133 return false;
00134 }
00135
00136 void KCheckAccelerators::autoCheckSlot()
00137 {
00138 if( block )
00139 {
00140 autoCheckTimer.setSingleShot( true );
00141 autoCheckTimer.start( 20 );
00142 return;
00143 }
00144 block = true;
00145 checkAccelerators( !alwaysShow );
00146 block = false;
00147 }
00148
00149 void KCheckAccelerators::createDialog(QWidget *actWin, bool automatic)
00150 {
00151 if ( drklash )
00152 return;
00153
00154 drklash = new QDialog( actWin );
00155 drklash->setAttribute( Qt::WA_DeleteOnClose );
00156 drklash->setObjectName( "kapp_accel_check_dlg" );
00157 drklash->setWindowTitle( i18nc("@title:window", "Dr. Klash' Accelerator Diagnosis" ));
00158 drklash->resize( 500, 460 );
00159 QVBoxLayout* layout = new QVBoxLayout( drklash );
00160 layout->setMargin( 11 );
00161 layout->setSpacing( 6 );
00162 drklash_view = new KTextBrowser( drklash );
00163 layout->addWidget( drklash );
00164 QCheckBox* disableAutoCheck = NULL;
00165 if( automatic ) {
00166 disableAutoCheck = new QCheckBox( i18nc("@option:check","Disable automatic checking" ), drklash );
00167 connect(disableAutoCheck, SIGNAL(toggled(bool)), SLOT(slotDisableCheck(bool)));
00168 layout->addWidget( disableAutoCheck );
00169 }
00170 QPushButton* btnClose = new QPushButton( i18nc("@action:button", "Close" ), drklash );
00171 btnClose->setDefault( true );
00172 layout->addWidget( btnClose );
00173 connect( btnClose, SIGNAL(clicked()), drklash, SLOT(close()) );
00174 if (disableAutoCheck)
00175 disableAutoCheck->setFocus();
00176 else
00177 drklash_view->setFocus();
00178 }
00179
00180 void KCheckAccelerators::slotDisableCheck(bool on)
00181 {
00182 autoCheck = !on;
00183 if (!on)
00184 autoCheckSlot();
00185 }
00186
00187 void KCheckAccelerators::checkAccelerators( bool automatic )
00188 {
00189 QWidget* actWin = qApp->activeWindow();
00190 if ( !actWin )
00191 return;
00192
00193 KAcceleratorManager::manage(actWin);
00194 QString a, c, r;
00195 KAcceleratorManager::last_manage(a, c, r);
00196
00197 if (automatic)
00198 return;
00199
00200 if (c.isEmpty() && r.isEmpty() && (automatic || a.isEmpty()))
00201 return;
00202
00203 QString s;
00204
00205 if ( ! c.isEmpty() ) {
00206 s += i18n("<h2>Accelerators changed</h2>");
00207 s += "<table border><tr><th><b>Old Text</b></th><th><b>New Text</b></th></tr>"
00208 + c + "</table>";
00209 }
00210
00211 if ( ! r.isEmpty() ) {
00212 s += i18n("<h2>Accelerators removed</h2>");
00213 s += "<table border><tr><th><b>Old Text</b></th></tr>" + r + "</table>";
00214 }
00215
00216 if ( ! a.isEmpty() ) {
00217 s += i18n("<h2>Accelerators added (just for your info)</h2>");
00218 s += "<table border><tr><th><b>New Text</b></th></tr>" + a + "</table>";
00219 }
00220
00221 createDialog(actWin, automatic);
00222 drklash_view->setHtml(s);
00223 drklash->show();
00224 drklash->raise();
00225
00226
00227 }
00228
00229 #include "kcheckaccelerators.moc"