diff options
Diffstat (limited to 'kmail/urlhandlermanager.cpp')
-rw-r--r-- | kmail/urlhandlermanager.cpp | 207 |
1 files changed, 187 insertions, 20 deletions
diff --git a/kmail/urlhandlermanager.cpp b/kmail/urlhandlermanager.cpp index 100009faa..8ab2a25fc 100644 --- a/kmail/urlhandlermanager.cpp +++ b/kmail/urlhandlermanager.cpp @@ -2,7 +2,7 @@ urlhandlermanager.cpp This file is part of KMail, the KDE mail client. - Copyright (c) 2002-2003 Klar�vdalens Datakonsult AB + Copyright (c) 2002-2003 Klar�lvdalens Datakonsult AB Copyright (c) 2003 Marc Mutz <mutz@kde.org> KMail is free software; you can redistribute it and/or modify it @@ -43,9 +43,11 @@ #include "kmreaderwin.h" #include "kmkernel.h" #include "callback.h" +#include "stl_util.h" +#include <kstandarddirs.h> +#include <kurldrag.h> #include <kimproxy.h> -#include "stl_util.h" #include <kurl.h> #include <algorithm> @@ -123,8 +125,14 @@ namespace { ~AttachmentURLHandler() {} bool handleClick( const KURL &, KMReaderWin * ) const; + bool handleShiftClick( const KURL &url, KMReaderWin *window ) const; + bool handleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const; + bool willHandleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const; bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const; TQString statusBarMessage( const KURL &, KMReaderWin * ) const; + private: + partNode* partNodeForUrl( const KURL &url, KMReaderWin *w ) const; + bool attachmentIsInHeader( const KURL &url ) const; }; class ShowAuditLogURLHandler : public KMail::URLHandler { @@ -137,6 +145,24 @@ namespace { TQString statusBarMessage( const KURL &, KMReaderWin * ) const; }; + // Handler that prevents dragging of internal images added by KMail, such as the envelope image + // in the enterprise header + class InternalImageURLHandler : public KMail::URLHandler { + public: + InternalImageURLHandler() : KMail::URLHandler() + {} + ~InternalImageURLHandler() + {} + bool handleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const; + bool willHandleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const; + bool handleClick( const KURL &, KMReaderWin * ) const + { return false; } + bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const + { return false; } + TQString statusBarMessage( const KURL &, KMReaderWin * ) const + { return TQString(); } + }; + class FallBackURLHandler : public KMail::URLHandler { public: FallBackURLHandler() : KMail::URLHandler() {} @@ -212,7 +238,7 @@ static partNode * partNodeFromXKMailUrl( const KURL & url, KMReaderWin * w, TQSt const int part_id = urlParts[1].toInt( &ok ); if ( !ok ) return 0; - *path = KURL::decode_string( urlParts[2], 106 ); + *path = KURL::decode_string( urlParts[2] ); return w->partNodeForId( part_id ); } @@ -274,6 +300,7 @@ KMail::URLHandlerManager::URLHandlerManager() { registerHandler( new AttachmentURLHandler() ); registerHandler( mBodyPartURLHandlerManager = new BodyPartURLHandlerManager() ); registerHandler( new ShowAuditLogURLHandler() ); + registerHandler( new InternalImageURLHandler ); registerHandler( new FallBackURLHandler() ); } @@ -311,6 +338,32 @@ bool KMail::URLHandlerManager::handleClick( const KURL & url, KMReaderWin * w ) return false; } +bool KMail::URLHandlerManager::handleShiftClick( const KURL &url, KMReaderWin *window ) const +{ + for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) + if ( (*it)->handleShiftClick( url, window ) ) + return true; + return false; +} + +bool KMail::URLHandlerManager::willHandleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const +{ + for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) + if ( (*it)->willHandleDrag( url, imagePath, window ) ) + return true; + return false; +} + +bool KMail::URLHandlerManager::handleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const +{ + for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) + if ( (*it)->handleDrag( url, imagePath, window ) ) + return true; + return false; +} + bool KMail::URLHandlerManager::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const { for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) if ( (*it)->handleContextMenuRequest( url, p, w ) ) @@ -405,6 +458,13 @@ namespace { return true; } + if ( url.path() == "showRawToltecMail" ) { + w->saveRelativePosition(); + w->setShowRawToltecMail( true ); + w->update( true ); + return true; + } + // if ( url.path() == "startIMApp" ) // { // kmkernel->imProxy()->startPreferredApp(); @@ -430,6 +490,10 @@ namespace { return i18n("Show signature details."); if ( url.path() == "hideSignatureDetails" ) return i18n("Hide signature details."); + if ( url.path() == "hideAttachmentQuicklist" ) + return i18n( "Hide attachment list" ); + if ( url.path() == "showAttachmentQuicklist" ) + return i18n( "Show attachment list" ); } return TQString::null ; } @@ -459,11 +523,14 @@ namespace { if ( url.protocol() == "kmail" && url.path() == "levelquote" ) { TQString query= url.query(); - if ( query.length()>=2 ) - if ( query[ 1 ] =='-' ) + if ( query.length()>=2 ) { + if ( query[ 1 ] =='-' ) { return i18n("Expand all quoted text."); - else + } + else { return i18n("Collapse quoted text."); + } + } } return TQString::null ; } @@ -517,32 +584,106 @@ namespace { } namespace { - bool AttachmentURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const { + + partNode* AttachmentURLHandler::partNodeForUrl( const KURL &url, KMReaderWin *w ) const + { if ( !w || !w->message() ) + return 0; + if ( url.protocol() != "attachment" ) + return 0; + + bool ok; + int nodeId = url.path().toInt( &ok ); + if ( !ok ) + return 0; + + partNode * node = w->partNodeForId( nodeId ); + return node; + } + + bool AttachmentURLHandler::attachmentIsInHeader( const KURL &url ) const + { + bool inHeader = false; + const TQString place = url.queryItem( "place" ).lower(); + if ( place != TQString::null ) { + inHeader = ( place == "header" ); + } + return inHeader; + } + + bool AttachmentURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const + { + partNode * node = partNodeForUrl( url, w ); + if ( !node ) + return false; + + const bool inHeader = attachmentIsInHeader( url ); + const bool shouldShowDialog = !node->isDisplayedEmbedded() || !inHeader; + if ( inHeader ) + w->scrollToAttachment( node ); + if ( shouldShowDialog ) + w->openAttachment( node->nodeId(), w->tempFileUrlFromPartNode( node ).path() ); + return true; + } + + bool AttachmentURLHandler::handleShiftClick( const KURL &url, KMReaderWin *window ) const + { + partNode * node = partNodeForUrl( url, window ); + if ( !node ) return false; - const int id = KMReaderWin::msgPartFromUrl( url ); - if ( id <= 0 ) + if ( !window ) return false; - w->openAttachment( id, url.path() ); + window->saveAttachment( window->tempFileUrlFromPartNode( node ) ); return true; } - bool AttachmentURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const { - if ( !w || !w->message() ) + bool AttachmentURLHandler::willHandleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const + { + Q_UNUSED( imagePath ); + return partNodeForUrl( url, window ) != 0; + } + + bool AttachmentURLHandler::handleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const + { + Q_UNUSED( imagePath ); + const partNode * node = partNodeForUrl( url, window ); + if ( !node ) return false; - const int id = KMReaderWin::msgPartFromUrl( url ); - if ( id <= 0 ) + + KURL file = window->tempFileUrlFromPartNode( node ).path(); + if ( !file.isEmpty() ) { + TQString icon = node->msgPart().iconName( KIcon::Small ); + KURLDrag* urlDrag = new KURLDrag( file, window ); + if ( !icon.isEmpty() ) { + TQPixmap iconMap( icon ); + urlDrag->setPixmap( iconMap ); + } + urlDrag->drag(); + return true; + } + else { + return false; + } + } + + bool AttachmentURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const + { + partNode * node = partNodeForUrl( url, w ); + if ( !node ) return false; - w->showAttachmentPopup( id, url.path(), p ); + + w->showAttachmentPopup( node->nodeId(), w->tempFileUrlFromPartNode( node ).path(), p ); return true; } - TQString AttachmentURLHandler::statusBarMessage( const KURL & url, KMReaderWin * w ) const { - if ( !w || !w->message() ) - return TQString::null; - const partNode * node = w->partNodeFromUrl( url ); + TQString AttachmentURLHandler::statusBarMessage( const KURL & url, KMReaderWin * w ) const + { + partNode * node = partNodeForUrl( url, w ); if ( !node ) return TQString::null; + const KMMessagePart & msgPart = node->msgPart(); TQString name = msgPart.fileName(); if ( name.isEmpty() ) @@ -569,7 +710,9 @@ namespace { return true; } - bool ShowAuditLogURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint &, KMReaderWin * w ) const { + bool ShowAuditLogURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint &, KMReaderWin * w ) const + { + Q_UNUSED( w ); // disable RMB for my own links: return !extractAuditLog( url ).isEmpty(); } @@ -583,6 +726,30 @@ namespace { } namespace { + bool InternalImageURLHandler::handleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const + { + Q_UNUSED( window ); + Q_UNUSED( url ); + const TQString kmailImagePath = locate( "data", "kmail/pics/" ); + if ( imagePath.contains( kmailImagePath ) ) { + // Do nothing, don't start a drag + return true; + } + return false; + } + + bool InternalImageURLHandler::willHandleDrag( const KURL &url, const TQString& imagePath, + KMReaderWin *window ) const + { + Q_UNUSED( window ); + Q_UNUSED( url ); + const TQString kmailImagePath = locate( "data", "kmail/pics/" ); + return imagePath.contains( kmailImagePath ); + } +} + +namespace { bool FallBackURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const { if ( w ) w->emitUrlClicked( url, Qt::LeftButton ); |