00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
00112
00113
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,
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 { }
00289
00290
00291
#include "khelpmenu.moc"