khelpmenu.cpp

00001 /*
00002  * This file is part of the KDE Libraries
00003  * Copyright (C) 1999-2000 Espen Sand (espen@kde.org)
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Library General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  *
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Library General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Library General Public License
00016  * along with this library; see the file COPYING.LIB.  If not, write to
00017  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019  *
00020  */
00021 
00022 // I (espen) prefer that header files are included alphabetically
00023 #include <qhbox.h>
00024 #include <qlabel.h>
00025 #include <qtimer.h>
00026 #include <qtoolbutton.h>
00027 #include <qwhatsthis.h>
00028 #include <qwidget.h>
00029 
00030 #include <kaboutapplication.h>
00031 #include <kaboutdata.h>
00032 #include <kaboutkde.h>
00033 #include <kaction.h>
00034 #include <kapplication.h>
00035 #include <kbugreport.h>
00036 #include <kdialogbase.h>
00037 #include <khelpmenu.h>
00038 #include <kiconloader.h>
00039 #include <klocale.h>
00040 #include <kmessagebox.h>
00041 #include <kpopupmenu.h>
00042 #include <kstdaccel.h>
00043 #include <kstdaction.h>
00044 
00045 #include "config.h"
00046 #include <qxembed.h>
00047 
00048 class KHelpMenuPrivate
00049 {
00050 public:
00051     KHelpMenuPrivate()
00052     {
00053     }
00054     ~KHelpMenuPrivate()
00055     {
00056     }
00057 
00058     const KAboutData *mAboutData;
00059 };
00060 
00061 KHelpMenu::KHelpMenu( QWidget *parent, const QString &aboutAppText,
00062               bool showWhatsThis )
00063   : QObject(parent), mMenu(0), mAboutApp(0), mAboutKDE(0), mBugReport(0),
00064     d(new KHelpMenuPrivate)
00065 {
00066   mParent = parent;
00067   mAboutAppText = aboutAppText;
00068   mShowWhatsThis = showWhatsThis;
00069   d->mAboutData = 0;
00070 }
00071 
00072 KHelpMenu::KHelpMenu( QWidget *parent, const KAboutData *aboutData,
00073               bool showWhatsThis, KActionCollection *actions )
00074   : QObject(parent), mMenu(0), mAboutApp(0), mAboutKDE(0), mBugReport(0),
00075     d(new KHelpMenuPrivate)
00076 {
00077   mParent = parent;
00078   mShowWhatsThis = showWhatsThis;
00079 
00080   d->mAboutData = aboutData;
00081 
00082   if (!aboutData)
00083     mAboutAppText = QString::null;
00084 
00085   if (actions)
00086   {
00087     KStdAction::helpContents(this, SLOT(appHelpActivated()), actions);
00088     if (showWhatsThis)
00089       KStdAction::whatsThis(this, SLOT(contextHelpActivated()), actions);
00090     KStdAction::reportBug(this, SLOT(reportBug()), actions);
00091     KStdAction::aboutApp(this, SLOT(aboutApplication()), actions);
00092     KStdAction::aboutKDE(this, SLOT(aboutKDE()), actions);
00093   }
00094 }
00095 
00096 KHelpMenu::~KHelpMenu()
00097 {
00098   delete mMenu;
00099   delete mAboutApp;
00100   delete mAboutKDE;
00101   delete mBugReport;
00102   delete d;
00103 }
00104 
00105 
00106 KPopupMenu* KHelpMenu::menu()
00107 {
00108   if( !mMenu )
00109   {
00110     //
00111     // 1999-12-02 Espen Sand:
00112     // I use hardcoded menu id's here. Reason is to stay backward
00113     // compatible.
00114     //
00115     const KAboutData *aboutData = d->mAboutData ? d->mAboutData : KGlobal::instance()->aboutData();
00116     QString appName = (aboutData)? aboutData->programName() : QString::fromLatin1(qApp->name());
00117 
00118     mMenu = new KPopupMenu();
00119     connect( mMenu, SIGNAL(destroyed()), this, SLOT(menuDestroyed()));
00120 
00121     bool need_separator = false;
00122     if (kapp->authorizeKAction("help_contents"))
00123     {
00124       mMenu->insertItem( BarIcon( "contents", KIcon::SizeSmall),
00125                      i18n( "%1 &Handbook" ).arg( appName) ,menuHelpContents );
00126       mMenu->connectItem( menuHelpContents, this, SLOT(appHelpActivated()) );
00127       mMenu->setAccel( KStdAccel::shortcut(KStdAccel::Help), menuHelpContents );
00128       need_separator = true;
00129     }
00130 
00131     if( mShowWhatsThis && kapp->authorizeKAction("help_whats_this") )
00132     {
00133       QToolButton* wtb = QWhatsThis::whatsThisButton(0);
00134       mMenu->insertItem( wtb->iconSet(),i18n( "What's &This" ), menuWhatsThis);
00135       mMenu->connectItem( menuWhatsThis, this, SLOT(contextHelpActivated()) );
00136       delete wtb;
00137       mMenu->setAccel( SHIFT + Key_F1, menuWhatsThis );
00138       need_separator = true;
00139     }
00140 
00141     if (kapp->authorizeKAction("help_report_bug") && aboutData && !aboutData->bugAddress().isEmpty() )
00142     {
00143       if (need_separator)
00144         mMenu->insertSeparator();
00145       mMenu->insertItem( i18n( "&Report Bug..." ), menuReportBug );
00146       mMenu->connectItem( menuReportBug, this, SLOT(reportBug()) );
00147       need_separator = true;
00148     }
00149 
00150     if (need_separator)
00151       mMenu->insertSeparator();
00152 
00153     if (kapp->authorizeKAction("help_about_app"))
00154     {
00155       mMenu->insertItem( kapp->miniIcon(),
00156         i18n( "&About %1" ).arg(appName), menuAboutApp );
00157       mMenu->connectItem( menuAboutApp, this, SLOT( aboutApplication() ) );
00158     }
00159     
00160     if (kapp->authorizeKAction("help_about_kde"))
00161     {
00162       mMenu->insertItem( SmallIcon("about_kde"), i18n( "About &KDE" ), menuAboutKDE );
00163       mMenu->connectItem( menuAboutKDE, this, SLOT( aboutKDE() ) );
00164     }
00165   }
00166 
00167   return mMenu;
00168 }
00169 
00170 
00171 
00172 void KHelpMenu::appHelpActivated()
00173 {
00174   kapp->invokeHelp();
00175 }
00176 
00177 
00178 void KHelpMenu::aboutApplication()
00179 {
00180   if (d->mAboutData)
00181   {
00182     if( !mAboutApp )
00183     {
00184       mAboutApp = new KAboutApplication( d->mAboutData, mParent, "about", false );
00185       connect( mAboutApp, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00186     }
00187     mAboutApp->show();
00188   }
00189   else if( mAboutAppText.isEmpty() )
00190   {
00191     emit showAboutApplication();
00192   }
00193   else
00194   {
00195     if( !mAboutApp )
00196     {
00197       mAboutApp = new KDialogBase( QString::null, // Caption is defined below
00198                    KDialogBase::Yes, KDialogBase::Yes,
00199                    KDialogBase::Yes, mParent, "about",
00200                    false, true, KStdGuiItem::ok() );
00201       connect( mAboutApp, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00202 
00203       QHBox *hbox = new QHBox( mAboutApp );
00204       mAboutApp->setMainWidget( hbox );
00205       hbox->setSpacing(KDialog::spacingHint()*3);
00206       hbox->setMargin(KDialog::marginHint()*1);
00207 
00208       QLabel *label1 = new QLabel(hbox);
00209       label1->setPixmap( kapp->icon() );
00210       QLabel *label2 = new QLabel(hbox);
00211       label2->setText( mAboutAppText );
00212 
00213       mAboutApp->setPlainCaption( i18n("About %1").arg(kapp->caption()) );
00214       mAboutApp->disableResize();
00215     }
00216 
00217     mAboutApp->show();
00218   }
00219 }
00220 
00221 
00222 void KHelpMenu::aboutKDE()
00223 {
00224   if( !mAboutKDE )
00225   {
00226     mAboutKDE = new KAboutKDE( mParent, "aboutkde", false );
00227     connect( mAboutKDE, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00228   }
00229   mAboutKDE->show();
00230 }
00231 
00232 
00233 void KHelpMenu::reportBug()
00234 {
00235   if( !mBugReport )
00236   {
00237     mBugReport = new KBugReport( mParent, false, d->mAboutData );
00238     connect( mBugReport, SIGNAL(finished()),this,SLOT( dialogFinished()) );
00239   }
00240   mBugReport->show();
00241 }
00242 
00243 
00244 void KHelpMenu::dialogFinished()
00245 {
00246   QTimer::singleShot( 0, this, SLOT(timerExpired()) );
00247 }
00248 
00249 
00250 void KHelpMenu::timerExpired()
00251 {
00252   if( mAboutKDE && !mAboutKDE->isVisible() )
00253   {
00254     delete mAboutKDE; mAboutKDE = 0;
00255   }
00256 
00257   if( mBugReport && !mBugReport->isVisible() )
00258   {
00259     delete mBugReport; mBugReport = 0;
00260   }
00261 
00262   if( mAboutApp && !mAboutApp->isVisible() )
00263   {
00264     delete mAboutApp; mAboutApp = 0;
00265   }
00266 }
00267 
00268 
00269 void KHelpMenu::menuDestroyed()
00270 {
00271   mMenu = 0;
00272 }
00273 
00274 
00275 void KHelpMenu::contextHelpActivated()
00276 {
00277   QWhatsThis::enterWhatsThisMode();
00278   QWidget* w = QApplication::widgetAt( QCursor::pos(), true );
00279   while ( w && !w->isTopLevel() && !w->inherits("QXEmbed")  )
00280       w = w->parentWidget();
00281 #ifdef Q_WS_X11
00282    if ( w && w->inherits("QXEmbed") )
00283       (( QXEmbed*) w )->enterWhatsThisMode();
00284 #endif
00285 }
00286 
00287 void KHelpMenu::virtual_hook( int, void* )
00288 { /*BASE::virtual_hook( id, data );*/ }
00289 
00290 
00291 #include "khelpmenu.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys