24 #include "kopetecontact.h"
25 #include "kopetemetacontact.h"
27 #include "kopetechatsession.h"
28 #include "kopeteplugin.h"
29 #include "kopetepluginmanager.h"
30 #include "kopetestdaction.h"
31 #include "kopeteviewmanager.h"
34 #include <ktoolbarspaceraction.h>
35 #include <kstandardaction.h>
36 #include <kcolordialog.h>
40 #include <kdeversion.h>
41 #include <kedittoolbar.h>
42 #include <kfontdialog.h>
43 #include <kcolorscheme.h>
44 #include <khtmlview.h>
45 #include <kiconloader.h>
46 #include <klibloader.h>
49 #include <kmessagebox.h>
51 #include <kpushbutton.h>
52 #include <ktextedit.h>
53 #include <kwindowsystem.h>
54 #include <kgenericfactory.h>
55 #include <kxmlguifactory.h>
64 #include <QCloseEvent>
65 #include <QHBoxLayout>
69 #include <kactioncollection.h>
71 K_PLUGIN_FACTORY( EmailWindowPluginFactory, registerPlugin<EmailWindowPlugin>(); )
72 K_EXPORT_PLUGIN( EmailWindowPluginFactory(
"kopete_emailwindow" ) )
75 Kopete::ViewPlugin( EmailWindowPluginFactory::componentData(), parent )
84 class KopeteEmailWindow::Private
87 QList<Kopete::Message> messageQueue;
102 QString unreadMessageFrom;
110 : KParts::MainWindow( ),
KopeteView( manager, parent ), d( new Private )
113 setCentralWidget( v );
115 setMinimumSize( QSize( 75, 20 ) );
117 d->split =
new QSplitter( v );
118 d->split->setOrientation( Qt::Vertical );
123 d->messagePart->view()->setMarginWidth( 4 );
124 d->messagePart->view()->setMarginHeight( 4 );
125 d->messagePart->view()->setMinimumSize( QSize( 75, 20 ) );
141 connect( d->editPart, SIGNAL(
messageSent(Kopete::Message&)),
143 connect( d->editPart, SIGNAL(canSendChanged(
bool)),
144 this, SLOT(slotUpdateReplySend()) );
145 connect( d->editPart, SIGNAL(typing(
bool)),
146 manager, SIGNAL(typing(
bool)) );
150 KopeteViewManager::viewManager(), SLOT(slotViewDestroyed(
KopeteView*)) );
152 KopeteViewManager::viewManager(), SLOT(slotViewActivated(
KopeteView*)) );
153 connect(
this, SIGNAL(
messageSent(Kopete::Message&)),
155 connect( manager, SIGNAL(messageSuccess()),
159 containerWidget->setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum) );
161 QHBoxLayout *h =
new QHBoxLayout( containerWidget );
166 d->btnReadPrev =
new KPushButton( i18n(
"<< Prev" ), containerWidget );
167 connect( d->btnReadPrev, SIGNAL(pressed()),
this, SLOT(slotReadPrev()) );
168 h->addWidget( d->btnReadPrev, 0, Qt::AlignRight | Qt::AlignVCenter );
169 d->btnReadPrev->setEnabled(
false );
171 d->btnReadNext =
new KPushButton( i18n(
"(0) Next >>" ), containerWidget );
172 connect( d->btnReadNext, SIGNAL(pressed()),
this, SLOT(slotReadNext()) );
173 h->addWidget( d->btnReadNext, 0, Qt::AlignRight | Qt::AlignVCenter );
175 d->btnReplySend =
new KPushButton( containerWidget );
176 connect( d->btnReplySend, SIGNAL(pressed()),
this, SLOT(slotReplySend()) );
177 h->addWidget( d->btnReplySend, 0, Qt::AlignRight | Qt::AlignVCenter );
182 d->showingMessage =
false;
189 KSharedConfig::Ptr config = KGlobal::config();
190 applyMainWindowSettings( config->group( QLatin1String(
"KopeteEmailWindow" ) ) );
192 d->sendInProgress =
false;
195 d->queuePosition = 0;
197 setCaption( manager->displayName() );
199 slotUpdateReplySend();
207 KConfigGroup cg( KGlobal::config(), QLatin1String(
"KopeteEmailWindow" ) );
208 saveMainWindowSettings( cg );
214 void KopeteEmailWindow::initActions(
void)
216 KActionCollection *coll = actionCollection();
218 d->chatSend =
new KAction( KIcon(
"mail-send"), i18n(
"&Send Message" ),
this );
219 coll->addAction(
"chat_send", d->chatSend );
221 d->chatSend->setShortcut( QKeySequence( Qt::Key_Return ) );
222 connect( d->chatSend, SIGNAL(triggered()),
this, SLOT(slotReplySend()) );
224 KStandardAction::quit (
this, SLOT(slotCloseView()), coll );
226 KStandardAction::cut( d->editPart->widget(), SLOT(cut()), coll );
227 KStandardAction::copy(
this, SLOT(slotCopy()), coll);
228 KStandardAction::paste( d->editPart->widget(), SLOT(paste()), coll );
231 action =
new KAction( KIcon(
"preferences-desktop-font"), i18n(
"&Set Font..." ), coll );
232 coll->addAction(
"format_font", action );
233 connect( action, SIGNAL(triggered(
bool)), d->editPart, SLOT(setFont()) );
235 action =
new KAction( KIcon(
"format-stroke-color"), i18n(
"Set Text &Color..." ), coll );
236 coll->addAction(
"format_color", action );
237 connect( action, SIGNAL(triggered()), d->editPart, SLOT(setForegroundColorColor()) );
239 action =
new KAction( KIcon(
"format-fill-color"), i18n(
"Set &Background Color..." ), coll );
240 coll->addAction(
"format_bgcolor", action );
241 connect( action, SIGNAL(triggered()), d->editPart, SLOT(setBackgroundColorColor()) );
243 KStandardAction::showMenubar(
this, SLOT(slotViewMenuBar()), coll );
244 setStandardToolBarMenuEnabled(
true );
247 coll->addAction(
"format_smiley", d->actionSmileyMenu );
248 d->actionSmileyMenu->setDelayed(
false );
249 connect(d->actionSmileyMenu, SIGNAL(
activated(QString)),
this, SLOT(slotSmileyActivated(QString)));
252 KStandardAction::keyBindings( guiFactory(), SLOT(configureShortcuts()), coll );
253 KStandardAction::configureToolbars(
this, SLOT(slotConfToolbar()), coll);
255 KopeteStdAction::preferences( coll ,
"settings_prefs" );
258 d->normalIcon = QPixmap( BarIcon( QLatin1String(
"kopete" ) ) );
260 d->animIcon.setPaused(
true);
262 d->anim =
new QLabel(
this );
263 d->anim->setObjectName( QLatin1String(
"kde toolbar widget") );
264 d->anim->setMargin( 5 );
265 d->anim->setPixmap( d->normalIcon );
267 KAction *spacerAction =
new KToolBarSpacerAction(
this );
268 spacerAction->setText( i18n(
"Spacer for Animation" ) );
269 coll->addAction(
"toolbar_spacer", spacerAction );
271 KAction *animAction =
new KAction( i18n(
"Toolbar Animation"), coll );
272 coll->addAction(
"toolbar_animation", action );
273 animAction->setDefaultWidget( d->anim );
275 setXMLFile( QLatin1String(
"kopeteemailwindow.rc" ) );
276 createGUI( d->editPart );
278 guiFactory()->addClient(m_manager);
286 if ( settingsDirty() && autoSaveSettings() )
287 saveAutoSaveSettings();
292 void KopeteEmailWindow::slotViewMenuBar()
294 if( !menuBar()->isHidden() )
300 void KopeteEmailWindow::slotSmileyActivated(
const QString &sm )
303 d->editPart->addText( sm );
306 void KopeteEmailWindow::slotConfToolbar()
308 KConfigGroup cg( KGlobal::config(), QLatin1String(
"KopeteEmailWindow" ) );
309 saveMainWindowSettings( cg );
310 QPointer <KEditToolBar> dlg =
new KEditToolBar(actionCollection());
311 dlg->setResourceFile(
"kopeteemailwindow.rc");
314 createGUI( d->editPart );
315 applyMainWindowSettings( cg );
320 void KopeteEmailWindow::slotCopy()
324 if ( d->messagePart->hasSelection() )
325 d->messagePart->copy();
327 d->editPart->textEdit()->copy();
332 if( message.from() != m_manager->myself() )
334 if( d->mode ==
Send )
337 d->messageQueue.append( message );
339 if( !d->showingMessage )
344 palette.setColor(d->btnReadNext->foregroundRole(), QColor(
"red") );
345 d->btnReadNext->setPalette(palette);
350 d->unreadMessageFrom = message.from()->metaContact() ?
351 message.from()->metaContact()->displayName() : message.from()->contactId();
352 QTimer::singleShot( 1000,
this, SLOT(slotMarkMessageRead()) );
356 void KopeteEmailWindow::slotMarkMessageRead()
358 d->unreadMessageFrom.clear();
361 void KopeteEmailWindow::updateNextButton()
363 if( d->queuePosition == d->messageQueue.count() )
365 d->btnReadNext->setEnabled(
false );
368 palette.setColor(d->btnReadNext->foregroundRole(), KColorScheme(QPalette::Active, KColorScheme::View).foreground().color() );
369 d->btnReadNext->setPalette(palette);
372 d->btnReadNext->setEnabled(
true );
374 if( d->queuePosition == 1 )
375 d->btnReadPrev->setEnabled(
false );
377 d->btnReadPrev->setEnabled(
true );
379 d->btnReadNext->setText( i18n(
"(%1) Next >>", d->messageQueue.count() - d->queuePosition ) );
382 void KopeteEmailWindow::slotUpdateReplySend()
385 if( d->mode ==
Read )
388 canSend = d->editPart->canSend();
390 d->btnReplySend->setEnabled( canSend );
391 d->chatSend->setEnabled( canSend );
394 void KopeteEmailWindow::slotReadNext()
398 d->showingMessage =
true;
402 writeMessage( (d->messageQueue[ d->queuePosition - 1 ]) );
407 void KopeteEmailWindow::slotReadPrev()
411 d->showingMessage =
true;
415 writeMessage( (d->messageQueue[ d->queuePosition - 1 ]) );
420 void KopeteEmailWindow::writeMessage( Kopete::Message &msg )
422 d->messagePart->clear();
423 d->messagePart->appendMessage( msg );
428 if ( !d->editPart->canSend() )
430 d->sendInProgress =
true;
431 d->anim->setMovie( &d->animIcon );
432 d->animIcon.setPaused(
false);
433 d->editPart->widget()->setEnabled(
false );
434 d->editPart->sendMessage();
439 d->sendInProgress =
false;
440 d->anim->setPixmap( d->normalIcon );
441 d->animIcon.setPaused(
true);
447 int response = KMessageBox::Continue;
451 if( m_manager->members().count() > 1 )
453 QString shortCaption = windowTitle();
454 if( shortCaption.length() > 40 )
455 shortCaption = shortCaption.left( 40 ) + QLatin1String(
"...");
457 response = KMessageBox::warningContinueCancel(
this, i18n(
"<qt>You are about to leave the groupchat session <b>%1</b>.<br />"
458 "You will not receive future messages from this conversation.</qt>", shortCaption), i18n(
"Closing Group Chat"),
459 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(), QLatin1String(
"AskCloseGroupChat"));
462 if( !d->unreadMessageFrom.isNull() && ( response == KMessageBox::Continue ) )
464 response = KMessageBox::warningContinueCancel(
this, i18n(
"<qt>You have received a message from <b>%1</b> in the last "
465 "second. Are you sure you want to close this chat?</qt>", d->unreadMessageFrom), i18n(
"Unread Message"),
466 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(), QLatin1String(
"AskCloseChatRecentMessage"));
469 if( d->sendInProgress && ( response == KMessageBox::Continue ) )
471 response = KMessageBox::warningContinueCancel(
this, i18n(
"You have a message send in progress, which will be "
472 "aborted if this chat is closed. Are you sure you want to close this chat?"), i18n(
"Message in Transit"),
473 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(), QLatin1String(
"AskCloseChatMessageInProgress") );
477 if( response == KMessageBox::Continue )
485 d->editPart->widget()->setEnabled(
true );
491 void KopeteEmailWindow::toggleMode( WindowMode newMode )
498 d->btnReplySend->setText( i18n(
"Send" ) );
499 d->editPart->widget()->show();
500 d->messagePart->view()->hide();
501 d->btnReadNext->hide();
502 d->btnReadPrev->hide();
505 d->btnReplySend->setText( i18n(
"Reply" ) );
506 d->editPart->widget()->hide();
507 d->messagePart->view()->show();
508 d->btnReadNext->show();
509 d->btnReadPrev->show();
512 QList<int> splitPercent;
514 splitPercent.append(50);
515 splitPercent.append(50);
516 d->btnReplySend->setText( i18n(
"Send" ) );
517 d->editPart->widget()->show();
518 d->messagePart->view()->show();
519 d->btnReadNext->show();
520 d->btnReadPrev->show();
521 d->split->setSizes( splitPercent );
522 d->editPart->widget()->setFocus();
525 slotUpdateReplySend();
528 void KopeteEmailWindow::slotReplySend()
530 if( d->mode ==
Read )
541 if ( !KWindowSystem::windowInfo( winId(), NET::WMDesktop ).onAllDesktops() )
542 KWindowSystem::setOnDesktop( winId(), KWindowSystem::currentDesktop() );
544 KXmlGuiWindow::raise();
556 KWindowSystem::activateWindow( winId() );
561 if( e->type() == QEvent::ActivationChange && isActiveWindow() )
562 emit(
activated( static_cast<KopeteView*>(
this) ) );
579 return d->editPart->contents();
584 d->editPart->setContents( newMessage );
587 void KopeteEmailWindow::slotCloseView()
593 #include "kopeteemailwindow.moc"
void activated(KopeteView *view)
KopeteView * createView(Kopete::ChatSession *manager)
virtual void setCurrentMessage(const Kopete::Message &newMessage)
virtual Kopete::ChatSession * manager(Kopete::Contact::CanCreateFlags)
K_PLUGIN_FACTORY(KopeteAccountConfigFactory, registerPlugin< KopeteAccountConfig >();) KopeteAccountConfig
virtual void changeEvent(QEvent *e)
virtual void makeVisible()
virtual Kopete::Message currentMessage()
virtual void appendMessage(Kopete::Message &message)
An instant message composition part.
This is the class that makes the emailwindow a plugin.
void messageSent(Kopete::Message &message)
void closing(KopeteView *view)
virtual void messageSentSuccessfully()
KopeteEmailWindow(Kopete::ChatSession *, EmailWindowPlugin *parent, bool foreignMessage)
virtual void raise(bool activate=false)
virtual void sendMessage()
virtual void closeEvent(QCloseEvent *e)
virtual bool closeView(bool force=false)