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 <qxembed.h>
00046
00047 class KHelpMenuPrivate
00048 {
00049 public:
00050 KHelpMenuPrivate()
00051 {
00052 }
00053 ~KHelpMenuPrivate()
00054 {
00055 }
00056
00057 const KAboutData *mAboutData;
00058 };
00059
00060 KHelpMenu::KHelpMenu( QWidget *parent, const QString &aboutAppText,
00061 bool showWhatsThis )
00062 : QObject(parent), mMenu(0), mAboutApp(0), mAboutKDE(0), mBugReport(0),
00063 d(new KHelpMenuPrivate)
00064 {
00065 mParent = parent;
00066 mAboutAppText = aboutAppText;
00067 mShowWhatsThis = showWhatsThis;
00068 d->mAboutData = 0;
00069 }
00070
00071 KHelpMenu::KHelpMenu( QWidget *parent, const KAboutData *aboutData,
00072 bool showWhatsThis, KActionCollection *actions )
00073 : QObject(parent), mMenu(0), mAboutApp(0), mAboutKDE(0), mBugReport(0),
00074 d(new KHelpMenuPrivate)
00075 {
00076 mParent = parent;
00077 mShowWhatsThis = showWhatsThis;
00078
00079 d->mAboutData = aboutData;
00080
00081 if (!aboutData)
00082 mAboutAppText = QString::null;
00083
00084 if (actions)
00085 {
00086 KStdAction::helpContents(this, SLOT(appHelpActivated()), actions);
00087 if (showWhatsThis)
00088 KStdAction::whatsThis(this, SLOT(contextHelpActivated()), actions);
00089 KStdAction::reportBug(this, SLOT(reportBug()), actions);
00090 KStdAction::aboutApp(this, SLOT(aboutApplication()), actions);
00091 KStdAction::aboutKDE(this, SLOT(aboutKDE()), actions);
00092 }
00093 }
00094
00095 KHelpMenu::~KHelpMenu()
00096 {
00097 delete mMenu;
00098 delete mAboutApp;
00099 delete mAboutKDE;
00100 delete mBugReport;
00101 delete d;
00102 }
00103
00104
00105 KPopupMenu* KHelpMenu::menu()
00106 {
00107 if( mMenu == 0 )
00108 {
00109
00110
00111
00112
00113
00114 const KAboutData *aboutData = KGlobal::instance()->aboutData();
00115 QString appName = (aboutData)? aboutData->programName() : QString::fromLatin1(qApp->name());
00116
00117 mMenu = new KPopupMenu();
00118 connect( mMenu, SIGNAL(destroyed()), this, SLOT(menuDestroyed()));
00119
00120 bool need_separator = false;
00121 if (kapp->authorizeKAction("help_contents"))
00122 {
00123 mMenu->insertItem( BarIcon( "contents", KIcon::SizeSmall),
00124 i18n( "%1 &Handbook" ).arg( appName) ,menuHelpContents );
00125 mMenu->connectItem( menuHelpContents, this, SLOT(appHelpActivated()) );
00126 mMenu->setAccel( KStdAccel::key(KStdAccel::Help), menuHelpContents );
00127 need_separator = true;
00128 }
00129
00130 if( (mShowWhatsThis == true) && kapp->authorizeKAction("help_whats_this") )
00131 {
00132 QToolButton* wtb = QWhatsThis::whatsThisButton(0);
00133 mMenu->insertItem( wtb->iconSet(),i18n( "What's &This" ), menuWhatsThis);
00134 mMenu->connectItem( menuWhatsThis, this, SLOT(contextHelpActivated()) );
00135 delete wtb;
00136 mMenu->setAccel( SHIFT + Key_F1, menuWhatsThis );
00137 need_separator = true;
00138 }
00139
00140 if (kapp->authorizeKAction("help_report_bug"))
00141 {
00142 if (need_separator)
00143 mMenu->insertSeparator();
00144 mMenu->insertItem( i18n( "&Report Bug..." ), menuReportBug );
00145 mMenu->connectItem( menuReportBug, this, SLOT(reportBug()) );
00146 need_separator = true;
00147 }
00148
00149 if (need_separator)
00150 mMenu->insertSeparator();
00151
00152 if (kapp->authorizeKAction("help_about_app"))
00153 {
00154 mMenu->insertItem( kapp->miniIcon(),
00155 i18n( "&About %1" ).arg(appName), menuAboutApp );
00156 mMenu->connectItem( menuAboutApp, this, SLOT( aboutApplication() ) );
00157 }
00158
00159 if (kapp->authorizeKAction("help_about_kde"))
00160 {
00161 mMenu->insertItem( SmallIcon("about_kde"), i18n( "About &KDE" ), menuAboutKDE );
00162 mMenu->connectItem( menuAboutKDE, this, SLOT( aboutKDE() ) );
00163 }
00164 }
00165
00166 return( mMenu );
00167 }
00168
00169
00170
00171 void KHelpMenu::appHelpActivated()
00172 {
00173 kapp->invokeHelp();
00174 }
00175
00176
00177 void KHelpMenu::aboutApplication()
00178 {
00179 if (d->mAboutData)
00180 {
00181 if( mAboutApp == 0 )
00182 {
00183 mAboutApp = new KAboutApplication( d->mAboutData, mParent, "about", false );
00184 connect( mAboutApp, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00185 }
00186 mAboutApp->show();
00187 }
00188 else if( mAboutAppText.isEmpty() )
00189 {
00190 emit showAboutApplication();
00191 }
00192 else
00193 {
00194 if( mAboutApp == 0 )
00195 {
00196 mAboutApp = new KDialogBase( QString::null,
00197 KDialogBase::Yes, KDialogBase::Yes,
00198 KDialogBase::Yes, mParent, "about",
00199 false, true, i18n("&OK") );
00200 connect( mAboutApp, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00201
00202 QHBox *hbox = new QHBox( mAboutApp );
00203 mAboutApp->setMainWidget( hbox );
00204 hbox->setSpacing(KDialog::spacingHint()*3);
00205 hbox->setMargin(KDialog::marginHint()*1);
00206
00207 QLabel *label1 = new QLabel(hbox);
00208 label1->setPixmap( kapp->icon() );
00209 QLabel *label2 = new QLabel(hbox);
00210 label2->setText( mAboutAppText );
00211
00212 mAboutApp->setPlainCaption( i18n("About %1").arg(kapp->caption()) );
00213 mAboutApp->disableResize();
00214 }
00215
00216 mAboutApp->show();
00217 }
00218 }
00219
00220
00221 void KHelpMenu::aboutKDE()
00222 {
00223 if( mAboutKDE == 0 )
00224 {
00225 mAboutKDE = new KAboutKDE( mParent, "aboutkde", false );
00226 connect( mAboutKDE, SIGNAL(finished()), this, SLOT( dialogFinished()) );
00227 }
00228 mAboutKDE->show();
00229 }
00230
00231
00232 void KHelpMenu::reportBug()
00233 {
00234 if( mBugReport == 0 )
00235 {
00236 mBugReport = new KBugReport( mParent, false );
00237 connect( mBugReport, SIGNAL(finished()),this,SLOT( dialogFinished()) );
00238 }
00239 mBugReport->show();
00240 }
00241
00242
00243 void KHelpMenu::dialogFinished()
00244 {
00245 QTimer::singleShot( 0, this, SLOT(timerExpired()) );
00246 }
00247
00248
00249 void KHelpMenu::timerExpired()
00250 {
00251 if( mAboutKDE != 0 && mAboutKDE->isVisible() == false )
00252 {
00253 delete mAboutKDE; mAboutKDE = 0;
00254 }
00255
00256 if( mBugReport != 0 && mBugReport->isVisible() == false )
00257 {
00258 delete mBugReport; mBugReport = 0;
00259 }
00260
00261 if( mAboutApp != 0 && mAboutApp->isVisible() == false )
00262 {
00263 delete mAboutApp; mAboutApp = 0;
00264 }
00265 }
00266
00267
00268 void KHelpMenu::menuDestroyed()
00269 {
00270 mMenu = 0;
00271 }
00272
00273
00274 void KHelpMenu::contextHelpActivated()
00275 {
00276 QWhatsThis::enterWhatsThisMode();
00277 QWidget* w = QApplication::widgetAt( QCursor::pos(), TRUE );
00278 while ( w && !w->isTopLevel() && !w->inherits("QXEmbed") )
00279 w = w->parentWidget();
00280 #ifndef Q_WS_QWS
00281 if ( w && w->inherits("QXEmbed") )
00282 (( QXEmbed*) w )->enterWhatsThisMode();
00283 #endif
00284 }
00285
00286 void KHelpMenu::virtual_hook( int, void* )
00287 { }
00288
00289
00290 #include "khelpmenu.moc"