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
110 : KParts::MainWindow( ),
KopeteView( manager, parent ), d( new Private )
113 setCentralWidget( v );
115 setMinimumSize(
QSize( 75, 20 ) );
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, SLOT(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()),
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 );
234 action =
new KAction( KIcon(
"preferences-desktop-font"), i18n(
"&Set Font..." ), coll );
235 coll->addAction(
"format_font", action );
236 connect( action, SIGNAL(triggered(
bool)), d->editPart, SLOT(setFont()) );
238 action =
new KAction( KIcon(
"format-stroke-color"), i18n(
"Set Text &Color..." ), coll );
239 coll->addAction(
"format_color", action );
240 connect( action, SIGNAL(triggered()), d->editPart, SLOT(setForegroundColorColor()) );
242 action =
new KAction( KIcon(
"format-fill-color"), i18n(
"Set &Background Color..." ), coll );
243 coll->addAction(
"format_bgcolor", action );
244 connect( action, SIGNAL(triggered()), d->editPart, SLOT(setBackgroundColorColor()) );
247 KStandardAction::showMenubar(
this, SLOT(slotViewMenuBar()), coll );
248 setStandardToolBarMenuEnabled(
true );
251 coll->addAction(
"format_smiley", d->actionSmileyMenu );
252 d->actionSmileyMenu->setDelayed(
false );
256 KStandardAction::keyBindings( guiFactory(), SLOT(configureShortcuts()), coll );
257 KStandardAction::configureToolbars(
this, SLOT(slotConfToolbar()), coll);
259 KopeteStdAction::preferences( coll ,
"settings_prefs" );
264 d->animIcon.setPaused(
true);
266 d->anim =
new QLabel(
this );
267 d->anim->setObjectName(
QLatin1String(
"kde toolbar widget") );
268 d->anim->setMargin( 5 );
269 d->anim->setPixmap( d->normalIcon );
271 KAction *spacerAction =
new KToolBarSpacerAction(
this );
272 spacerAction->setText( i18n(
"Spacer for Animation" ) );
273 coll->addAction(
"toolbar_spacer", spacerAction );
275 KAction *animAction =
new KAction( i18n(
"Toolbar Animation"), coll );
276 coll->addAction(
"toolbar_animation", animAction );
277 animAction->setDefaultWidget( d->anim );
280 createGUI( d->editPart );
282 guiFactory()->addClient(m_manager);
290 if ( settingsDirty() && autoSaveSettings() )
291 saveAutoSaveSettings();
296 void KopeteEmailWindow::slotViewMenuBar()
298 if( !menuBar()->isHidden() )
304 void KopeteEmailWindow::slotSmileyActivated(
const QString &sm )
307 d->editPart->addText( sm );
310 void KopeteEmailWindow::slotConfToolbar()
312 KConfigGroup cg( KGlobal::config(),
QLatin1String(
"KopeteEmailWindow" ) );
313 saveMainWindowSettings( cg );
315 dlg->setResourceFile(
"kopeteemailwindow.rc");
318 createGUI( d->editPart );
319 applyMainWindowSettings( cg );
324 void KopeteEmailWindow::slotCopy()
328 if ( d->messagePart->hasSelection() )
329 d->messagePart->copy();
331 d->editPart->textEdit()->copy();
336 if( message.from() != m_manager->myself() )
338 if( d->mode ==
Send )
341 d->messageQueue.append( message );
343 if( !d->showingMessage )
348 palette.
setColor(d->btnReadNext->foregroundRole(),
QColor(
"red") );
349 d->btnReadNext->setPalette(palette);
354 d->unreadMessageFrom = message.from()->metaContact() ?
355 message.from()->metaContact()->displayName() : message.from()->contactId();
360 void KopeteEmailWindow::slotMarkMessageRead()
362 d->unreadMessageFrom.clear();
365 void KopeteEmailWindow::updateNextButton()
367 if( d->queuePosition == d->messageQueue.count() )
369 d->btnReadNext->setEnabled(
false );
372 palette.
setColor(d->btnReadNext->foregroundRole(), KColorScheme(QPalette::Active, KColorScheme::View).foreground().color() );
373 d->btnReadNext->setPalette(palette);
376 d->btnReadNext->setEnabled(
true );
378 if( d->queuePosition == 1 )
379 d->btnReadPrev->setEnabled(
false );
381 d->btnReadPrev->setEnabled(
true );
383 d->btnReadNext->setText( i18n(
"(%1) Next >>", d->messageQueue.count() - d->queuePosition ) );
386 void KopeteEmailWindow::slotUpdateReplySend()
389 if( d->mode ==
Read )
392 canSend = d->editPart->canSend();
394 d->btnReplySend->setEnabled( canSend );
395 d->chatSend->setEnabled( canSend );
398 void KopeteEmailWindow::slotReadNext()
402 d->showingMessage =
true;
406 writeMessage( (d->messageQueue[ d->queuePosition - 1 ]) );
411 void KopeteEmailWindow::slotReadPrev()
415 d->showingMessage =
true;
419 writeMessage( (d->messageQueue[ d->queuePosition - 1 ]) );
424 void KopeteEmailWindow::writeMessage( Kopete::Message &msg )
426 d->messagePart->clear();
427 d->messagePart->appendMessage( msg );
432 if ( !d->editPart->canSend() )
434 d->sendInProgress =
true;
435 d->anim->setMovie( &d->animIcon );
436 d->animIcon.setPaused(
false);
437 d->editPart->widget()->setEnabled(
false );
438 d->editPart->sendMessage();
443 d->sendInProgress =
false;
444 d->anim->setPixmap( d->normalIcon );
445 d->animIcon.setPaused(
true);
451 int response = KMessageBox::Continue;
455 if( m_manager->members().count() > 1 )
457 QString shortCaption = windowTitle();
458 if( shortCaption.
length() > 40 )
461 response = KMessageBox::warningContinueCancel(
this, i18n(
"<qt>You are about to leave the groupchat session <b>%1</b>.<br />"
462 "You will not receive future messages from this conversation.</qt>", shortCaption), i18n(
"Closing Group Chat"),
463 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(),
QLatin1String(
"AskCloseGroupChat"));
466 if( !d->unreadMessageFrom.isNull() && ( response == KMessageBox::Continue ) )
468 response = KMessageBox::warningContinueCancel(
this, i18n(
"<qt>You have received a message from <b>%1</b> in the last "
469 "second. Are you sure you want to close this chat?</qt>", d->unreadMessageFrom), i18n(
"Unread Message"),
470 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(),
QLatin1String(
"AskCloseChatRecentMessage"));
473 if( d->sendInProgress && ( response == KMessageBox::Continue ) )
475 response = KMessageBox::warningContinueCancel(
this, i18n(
"You have a message send in progress, which will be "
476 "aborted if this chat is closed. Are you sure you want to close this chat?"), i18n(
"Message in Transit"),
477 KGuiItem( i18n(
"Cl&ose Chat") ), KStandardGuiItem::cancel(),
QLatin1String(
"AskCloseChatMessageInProgress") );
481 if( response == KMessageBox::Continue )
489 d->editPart->widget()->setEnabled(
true );
495 void KopeteEmailWindow::toggleMode( WindowMode newMode )
502 d->btnReplySend->setText( i18n(
"Send" ) );
503 d->editPart->widget()->show();
504 d->messagePart->view()->hide();
505 d->btnReadNext->hide();
506 d->btnReadPrev->hide();
509 d->btnReplySend->setText( i18n(
"Reply" ) );
510 d->editPart->widget()->hide();
511 d->messagePart->view()->show();
512 d->btnReadNext->show();
513 d->btnReadPrev->show();
520 d->btnReplySend->setText( i18n(
"Send" ) );
521 d->editPart->widget()->show();
522 d->messagePart->view()->show();
523 d->btnReadNext->show();
524 d->btnReadPrev->show();
525 d->split->setSizes( splitPercent );
526 d->editPart->widget()->setFocus();
529 slotUpdateReplySend();
532 void KopeteEmailWindow::slotReplySend()
534 if( d->mode ==
Read )
545 if ( !KWindowSystem::windowInfo( winId(), NET::WMDesktop ).onAllDesktops() )
546 KWindowSystem::setOnDesktop( winId(), KWindowSystem::currentDesktop() );
548 KXmlGuiWindow::raise();
560 KWindowSystem::activateWindow( winId() );
565 if( e->
type() == QEvent::ActivationChange && isActiveWindow() )
566 emit(
activated( static_cast<KopeteView*>(
this) ) );
583 return d->editPart->contents();
588 d->editPart->setContents( newMessage );
591 void KopeteEmailWindow::slotCloseView()
597 #include "kopeteemailwindow.moc"
void activated(KopeteView *view)
void setColor(ColorGroup group, ColorRole role, const QColor &color)
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()
void append(const T &value)
virtual void appendMessage(Kopete::Message &message)
An instant message composition part.
void setMargin(int margin)
This is the class that makes the emailwindow a plugin.
void messageSent(Kopete::Message &message)
void closing(KopeteView *view)
virtual void messageSentSuccessfully()
void addStretch(int stretch)
KopeteEmailWindow(Kopete::ChatSession *, EmailWindowPlugin *parent, bool foreignMessage)
virtual void raise(bool activate=false)
virtual void sendMessage()
virtual void closeEvent(QCloseEvent *e)
QString left(int n) const
virtual bool closeView(bool force=false)
void setSpacing(int spacing)