/* ============================================================ * * This file is a part of kipi-plugins project * http://www.kipi-plugins.org * * Date : 2003-10-01 * Description : a kipi plugin to e-mailing images * * Copyright (C) 2003-2007 by Gilles Caulier * Copyright (C) 2006 by Tom Albers * Copyright (C) 2006 by Michael Hoechstetter * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // TQt includes. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // LibKipi includes. #include // Local includes. #include "kpaboutdata.h" #include "pluginsversion.h" #include "listimageserrordialog.h" #include "sendimagesdialog.h" #include "sendimagesdialog.moc" namespace KIPISendimagesPlugin { class ImageItem : public TQListBoxText { public: ImageItem(TQListBox * parent, TQString const & comments, KURL const & url) : TQListBoxText(parent), _comments(comments), _url(url) {} TQString comments() { return _comments; } TQString name() { return _url.fileName(); } KURL url() { return _url; } TQString album() { return _url.directory().section('/', -1); } void setName(const TQString &newName) { setText(newName); } private: TQString _comments; KURL _url; }; ListImageItems::ListImageItems(TQWidget *parent, const char *name) : TDEListBox(parent, name) { setSelectionMode (TQListBox::Extended); setAcceptDrops(true); } void ListImageItems::dragEnterEvent(TQDragEnterEvent *e) { e->accept(TQUriDrag::canDecode(e)); } void ListImageItems::dropEvent(TQDropEvent *e) { TQStrList strList; TQStringList FilesPath; if ( !TQUriDrag::decode(e, strList) ) return; TQStrList stringList; TQStrListIterator it(strList); char *str; while ( (str = it.current()) != 0 ) { TQString filePath = TQUriDrag::uriToLocalFile(str); TQFileInfo fileInfo(filePath); if (fileInfo.isFile() && fileInfo.exists()) FilesPath.append(fileInfo.filePath()); ++it; } if (FilesPath.isEmpty() == false) emit addedDropItems(FilesPath); } SendImagesDialog::SendImagesDialog(TQWidget *parent, KIPI::Interface* interface, const KIPI::ImageCollection& images ) : KDialogBase( IconList, i18n("Email Images Options"), Help|Ok|Cancel, Ok, parent, "SendImagesDialog", false, true ) { m_interface = interface; m_thumbJob = 0; setupImagesList(); setupEmailOptions(); readSettings(); setImagesList( images.images() ); page_setupImagesList->setFocus(); m_ImagesFilesListBox->setSelected(0, true); slotImageSelected(m_ImagesFilesListBox->item(0)); setNbItems(); resize( 600, 400 ); // About data and help button. m_about = new KIPIPlugins::KPAboutData(I18N_NOOP("Send Images"), 0, TDEAboutData::License_GPL, I18N_NOOP("A Kipi plugin for emailing images"), "(c) 2003-2007, Gilles Caulier"); m_about->addAuthor("Gilles Caulier", I18N_NOOP("Author and maintainer"), "caulier dot gilles at gmail dot com"); m_about->addAuthor("Michael Hoechstetter", I18N_NOOP("Developer"), "michael dot hoechstetter at gmx dot de"); m_about->addAuthor("Tom Albers", I18N_NOOP("Developer"), "tomalbers at kde dot nl"); m_helpButton = actionButton( Help ); KHelpMenu* helpMenu = new KHelpMenu(this, m_about, false); helpMenu->menu()->removeItemAt(0); helpMenu->menu()->insertItem(i18n("Plugin Handbook"), this, TQT_SLOT(slotHelp()), 0, -1, 0); m_helpButton->setPopup( helpMenu->menu() ); slotMailAgentChanged(m_mailAgentName->currentItem()); } SendImagesDialog::~SendImagesDialog() { if ( m_thumbJob ) delete m_thumbJob; delete m_about; } void SendImagesDialog::readSettings(void) { // Read all settings from configuration file. TDEConfig config("kipirc"); config.setGroup("SendImages Settings"); TQString t = config.readEntry("MailAgentName", "Default"); // The _old_ Kmail (mind the lowercase 'm') called the default mailer. // this is now renamed to 'Default'. It should not interfere with KMail, which // is now doing what you expect. if (t == "Kmail") t = "Default"; m_mailAgentName->setCurrentText(t); m_ThunderbirdBinPath->setURL( config.readEntry("ThunderbirdBinPath", "/usr/bin/mozilla-thunderbird")); if (config.readEntry("ImagesChangeProp", "true") == "true") m_changeImagesProp->setChecked( true ); else m_changeImagesProp->setChecked( false ); m_imagesResize->setCurrentItem(config.readNumEntry("ImageResize", 2)); // Medium size used by default. m_imageCompression->setValue(config.readNumEntry("ImageCompression", 75)); m_imagesFormat->setCurrentText(config.readEntry("ImageFormat", "JPEG")); m_attachmentlimit->setValue(config.readNumEntry("AttachmentLimit", 10)); if (config.readEntry("AddComments", "true") == "true") m_addComments->setChecked( true ); else m_addComments->setChecked( false ); if (config.readEntry("Comment2ImageName", "true") == "true") m_comment2ImageName->setChecked( true ); else m_comment2ImageName->setChecked( false ); } void SendImagesDialog::writeSettings(void) { // Write all settings in configuration file. TDEConfig config("kipirc"); config.setGroup("SendImages Settings"); config.writeEntry("MailAgentName", m_mailAgentName->currentText()); config.writeEntry("ThunderbirdBinPath", m_ThunderbirdBinPath->url()); config.writeEntry("AddComments", m_addComments->isChecked()); config.writeEntry("ImagesChangeProp", m_changeImagesProp->isChecked()); config.writeEntry("ImageResize", m_imagesResize->currentItem()); config.writeEntry("ImageCompression", m_imageCompression->value()); config.writeEntry("ImageFormat", m_imagesFormat->currentText()); config.writeEntry("AttachmentLimit", m_attachmentlimit->value()); config.writeEntry("Comment2ImageName", m_comment2ImageName->isChecked()); config.sync(); } void SendImagesDialog::setupImagesList(void) { TQString whatsThis; page_setupImagesList = addPage(i18n("Images"), i18n("Images to EMail"), BarIcon("image", TDEIcon::SizeMedium)); TQVBoxLayout *vlay = new TQVBoxLayout( page_setupImagesList, 0, spacingHint() ); //--------------------------------------------- m_groupBoxImageList = new TQGroupBox( page_setupImagesList ); m_groupBoxImageList->setFlat(false); TQGridLayout* grid = new TQGridLayout( m_groupBoxImageList, 2, 2 , 20, 20); m_ImagesFilesListBox = new ListImageItems( m_groupBoxImageList, "ListImageItems" ); TQWhatsThis::add( m_ImagesFilesListBox, i18n( "

This is the list of images to email. " "If you want to add some images click on the 'Add Images...' " "button or use the drag-and-drop.")); grid->addMultiCellWidget(m_ImagesFilesListBox, 0, 2, 0, 1); KButtonBox* imagesListButtonBox = new KButtonBox( m_groupBoxImageList,Qt::Vertical ); TQPushButton* m_addImagesButton = imagesListButtonBox->addButton ( i18n( "&Add ..." ) ); TQWhatsThis::add( m_addImagesButton, i18n("

Add images to the list.") ); TQPushButton* m_remImagesButton = imagesListButtonBox->addButton ( i18n( "&Remove" )); TQWhatsThis::add( m_remImagesButton, i18n("

Remove selected images from the list.") ); imagesListButtonBox->layout(); grid->addMultiCellWidget(imagesListButtonBox, 0, 1, 2, 2); m_imageLabel = new TQLabel( m_groupBoxImageList ); m_imageLabel->setFixedHeight( 120 ); m_imageLabel->setAlignment( TQt::AlignHCenter | TQt::AlignVCenter ); m_imageLabel->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); TQWhatsThis::add( m_imageLabel, i18n( "

Preview of the currently selected image on the list." ) ); grid->addMultiCellWidget(m_imageLabel, 2, 2, 2, 2); vlay->addWidget( m_groupBoxImageList ); //--------------------------------------------- TQGroupBox * groupBox2 = new TQGroupBox( i18n("Image Description"), page_setupImagesList ); groupBox2->setColumnLayout(0, Qt::Vertical ); groupBox2->layout()->setSpacing( 6 ); groupBox2->layout()->setMargin( 11 ); TQWhatsThis::add( groupBox2, i18n("

The description of the currently selected image on the list.") ); TQVBoxLayout * groupBox2Layout = new TQVBoxLayout( groupBox2->layout() ); groupBox2Layout->setAlignment( TQt::AlignTop ); m_ImageComments = new KSqueezedTextLabel( groupBox2 ); m_ImageComments->setAlignment( int( TQLabel::WordBreak | TQLabel::AlignVCenter ) ); groupBox2Layout->addWidget( m_ImageComments ); m_ImageAlbum = new KSqueezedTextLabel( groupBox2 ); m_ImageAlbum->setAlignment( int( TQLabel::WordBreak | TQLabel::AlignVCenter ) ); groupBox2Layout->addWidget( m_ImageAlbum ); vlay->addWidget( groupBox2 ); vlay->addStretch(1); //--------------------------------------------- connect(m_addImagesButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotImagesFilesButtonAdd())); connect(m_remImagesButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotImagesFilesButtonRem())); connect(m_ImagesFilesListBox, TQT_SIGNAL( currentChanged( TQListBoxItem * ) ), this, TQT_SLOT( slotImageSelected( TQListBoxItem * ))); connect(m_ImagesFilesListBox, TQT_SIGNAL( addedDropItems(TQStringList) ), this, TQT_SLOT( slotAddDropItems(TQStringList))); } void SendImagesDialog::setImagesList( const KURL::List& Files ) { if ( Files.count() == 0 ) return; for( KURL::List::ConstIterator it = Files.begin(); it != Files.end(); ++it ) { KIPI::ImageInfo imageInfo = m_interface->info( *it ); TQString comments = imageInfo.description(); // Check if the new item already exist in the list. bool findItem = false; for (uint i = 0 ; i < m_ImagesFilesListBox->count() ; ++i) { ImageItem *pitem = static_cast( m_ImagesFilesListBox->item(i) ); if (pitem->url() == (*it)) findItem = true; } if (findItem == false) { ImageItem *item = new ImageItem(m_ImagesFilesListBox, comments, // Image comments. *it // Complete url (path & file name). ); item->setName( (*it).fileName() ); } } m_ImagesFilesListBox->setCurrentItem( m_ImagesFilesListBox->count()-1) ; slotImageSelected(m_ImagesFilesListBox->item(m_ImagesFilesListBox->currentItem())); m_ImagesFilesListBox->centerCurrentItem(); } void SendImagesDialog::setupEmailOptions(void) { TQString whatsThis; page_setupEmailOptions = addPage(i18n("Mail"), i18n("Mail Options"), BarIcon("mail_generic", TDEIcon::SizeMedium)); TQVBoxLayout *vlay = new TQVBoxLayout( page_setupEmailOptions, 0, spacingHint() ); //--------------------------------------------- TQHBoxLayout *hlay10 = new TQHBoxLayout( ); vlay->addLayout( hlay10 ); TQLabel *m_mailAgentLabel = new TQLabel( i18n("Mail agent:"), page_setupEmailOptions); m_mailAgentName = new TQComboBox( false, page_setupEmailOptions ); m_mailAgentName->insertItem( i18n("Default") ); m_mailAgentName->insertItem( "Balsa" ); m_mailAgentName->insertItem( "Claws Mail" ); m_mailAgentName->insertItem( "Evolution" ); m_mailAgentName->insertItem( "GmailAgent" ); m_mailAgentName->insertItem( "KMail" ); m_mailAgentName->insertItem( "Mozilla" ); m_mailAgentName->insertItem( "Netscape" ); m_mailAgentName->insertItem( "Sylpheed" ); m_mailAgentName->insertItem( "Sylpheed-Claws" ); m_mailAgentName->insertItem( "Thunderbird" ); m_mailAgentName->setCurrentText( i18n("Default") ); TQWhatsThis::add( m_mailAgentName, i18n("

Select here your preferred external mail agent program." "These mail agent versions are supported:

" "Balsa: >= 2.x

" "Claws Mail: >= 2.6.1

" "Evolution: >= 1.4

" "GmailAgent: >= 0.2

" "KMail: >= 1.3

" "Mozilla: >= 1.4

" "Netscape: >= 7.x

" "Sylpheed: >= 0.9

" "Sylpheed-Claws: >= 0.9

" "Thunderbird: >= 0.4

") ); hlay10->addWidget( m_mailAgentLabel ); hlay10->addStretch( 1 ); hlay10->addWidget( m_mailAgentName ); connect(m_mailAgentName, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotMailAgentChanged(int))); //--------------------------------------------- m_labelThunderbirdBinPath = new TQLabel(i18n("&Thunderbird binary path:"), page_setupEmailOptions); vlay->addWidget( m_labelThunderbirdBinPath ); m_ThunderbirdBinPath = new KURLRequester( "/usr/bin/thunderbird", page_setupEmailOptions); m_labelThunderbirdBinPath->setBuddy( m_ThunderbirdBinPath ); vlay->addWidget(m_ThunderbirdBinPath); connect(m_ThunderbirdBinPath, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(slotThunderbirdBinPathChanged(const TQString&))); TQWhatsThis::add( m_ThunderbirdBinPath, i18n("

The path name to the Thunderbird binary program.") ); //--------------------------------------------- m_addComments = new TQCheckBox( i18n("Attach a file with caption and tags"), page_setupEmailOptions); TQWhatsThis::add( m_addComments, i18n("

If you enable this option, all image captions and tags " "will be added as an attached file.") ); vlay->addWidget( m_addComments ); m_comment2ImageName = new TQCheckBox( i18n("Generate new filenames from image captions (if available)"), page_setupEmailOptions); vlay->addWidget( m_comment2ImageName ); //--------------------------------------------- TQGroupBox * groupBox2 = new TQGroupBox( i18n("Image Properties"), page_setupEmailOptions ); groupBox2->setColumnLayout(0, Qt::Vertical ); groupBox2->layout()->setSpacing( 6 ); groupBox2->layout()->setMargin( 11 ); TQWhatsThis::add( groupBox2, i18n("

The properties of images to send.") ); TQVBoxLayout * groupBox2Layout = new TQVBoxLayout( groupBox2->layout() ); groupBox2Layout->setAlignment( TQt::AlignTop ); m_changeImagesProp = new TQCheckBox(i18n("Adjust image properties"), groupBox2); TQWhatsThis::add( m_changeImagesProp, i18n("

If you enable this option, " "all images to send can be resized and recompressed.") ); m_changeImagesProp->setChecked( true ); groupBox2Layout->addWidget( m_changeImagesProp ); TQHBoxLayout *hlay12 = new TQHBoxLayout(); groupBox2Layout->addLayout( hlay12 ); m_imagesResize = new TQComboBox(false, groupBox2); m_imagesResize->insertItem(i18n("Very Small (320 pixels)")); m_imagesResize->insertItem(i18n("Small (640 pixels)")); m_imagesResize->insertItem(i18n("Medium (800 pixels)")); m_imagesResize->insertItem(i18n("Big (1024 pixels)")); m_imagesResize->insertItem(i18n("Very Big (1280 pixels)")); m_imagesResize->insertItem(i18n("Huge - for printing (1600 pixels)")); m_imagesResize->setCurrentText (i18n("Medium (800 pixels)")); whatsThis = i18n("

Select here the images size to send:

" "%1: use this if you have a very slow internet " "connection or if the target mailbox size is very limited.

" "%2: use this if you have a slow internet connection " "and if the target mailbox size is limited.

" "%3: this is the default value for a medium internet connection " "and a target mailbox size.

" "%4: use this if you have a high-speed internet connection " "and if the target mailbox size is not limited.

" "%5: use this if you have no size or speed restrictions.

" "%6: use this only for printing purpose.

") .arg(i18n("very small (320 pixels)")) .arg(i18n("small (640 pixels)")) .arg(i18n("medium (800 pixels)")) .arg(i18n("big (1024 pixels)")) .arg(i18n("very big (1280 pixels)")) .arg(i18n("huge - for printing (1600 pixels)")); TQWhatsThis::add( m_imagesResize, whatsThis ); m_labelImageSize = new TQLabel( i18n("Sent image size:"), groupBox2); hlay12->addWidget( m_labelImageSize ); m_labelImageSize->setBuddy( m_imagesResize ); hlay12->addStretch( 1 ); hlay12->addWidget(m_imagesResize); //--------------------------------------------- m_imageCompression = new KIntNumInput(75, groupBox2); m_imageCompression->setRange(1, 100, 1, true ); m_imageCompression->setLabel( i18n("Sent image quality level:") ); groupBox2Layout->addWidget( m_imageCompression ); whatsThis = i18n("

The new compression value of images to send:

"); whatsThis = whatsThis + i18n("1: very high compression

" "25: high compression

" "50: medium compression

" "75: low compression (default value)

" "100: no compression"); TQWhatsThis::add( m_imageCompression, whatsThis); //--------------------------------------------- TQHBoxLayout *hlay13 = new TQHBoxLayout(); groupBox2Layout->addLayout( hlay13 ); m_imagesFormat = new TQComboBox(false, groupBox2); m_imagesFormat->insertItem("JPEG"); m_imagesFormat->insertItem("PNG"); m_imagesFormat->setCurrentText ("JPEG"); whatsThis = i18n("

Select here the images files format to send.

"); whatsThis = whatsThis + i18n("JPEG: The Joint Photographic Experts Group's file format " "is a good Web file format but it uses lossy compression.

" "PNG: the Portable Network Graphics format is an extensible file format for " "the lossless, portable, well-compressed storage of raster images. PNG provides a " "patent-free replacement for GIF and can also replace many common uses of TIFF. " "PNG is designed to work well in online viewing applications, such as the World Wide Web, " "so it is fully streamable with a progressive display option. Also, PNG can store gamma " "and chromaticity data for improved color matching on heterogeneous platforms."); TQWhatsThis::add( m_imagesFormat, whatsThis ); m_labelImageFormat = new TQLabel(i18n("Image file format:"), groupBox2); hlay13->addWidget(m_labelImageFormat); m_labelImageFormat->setBuddy(m_imagesFormat); hlay13->addStretch(1); hlay13->addWidget(m_imagesFormat); vlay->addWidget(groupBox2); vlay->addStretch(1); m_attachmentlimit = new KIntNumInput(17, page_setupEmailOptions); m_attachmentlimit->setRange(1, 50, 1, true ); m_attachmentlimit->setLabel( i18n("Maximum Email size limit:")); m_attachmentlimit->setSuffix(i18n("MB")); vlay->addWidget( m_attachmentlimit ); //--------------------------------------------- connect(m_changeImagesProp, TQT_SIGNAL(toggled(bool)), m_labelImageSize, TQT_SLOT(setEnabled(bool))); connect(m_changeImagesProp, TQT_SIGNAL(toggled(bool)), m_imagesResize, TQT_SLOT(setEnabled(bool))); connect(m_changeImagesProp, TQT_SIGNAL(toggled(bool)), m_imageCompression, TQT_SLOT(setEnabled(bool))); connect(m_changeImagesProp, TQT_SIGNAL(toggled(bool)), m_labelImageFormat, TQT_SLOT(setEnabled(bool))); connect(m_changeImagesProp, TQT_SIGNAL(toggled(bool)), m_imagesFormat, TQT_SLOT(setEnabled(bool))); } void SendImagesDialog::slotHelp() { TDEApplication::kApplication()->invokeHelp("sendimages", "kipi-plugins"); } void SendImagesDialog::slotMailAgentChanged(int) { if ( m_mailAgentName->currentText() == "Thunderbird" ) { m_labelThunderbirdBinPath->setEnabled(true); m_ThunderbirdBinPath->setEnabled(true); } else { m_labelThunderbirdBinPath->setEnabled(false); m_ThunderbirdBinPath->setEnabled(false); } } void SendImagesDialog::slotThunderbirdBinPathChanged(const TQString &url ) { if ( m_mailAgentName->currentText() == "Thunderbird" ) enableButtonOK( !url.isEmpty()); } void SendImagesDialog::slotAddDropItems(TQStringList filesPath) { setImagesList( KURL::List( filesPath) ); } void SendImagesDialog::slotImagesFilesButtonAdd( void ) { KURL::List urls = KIPI::ImageDialog::getImageURLs( this, m_interface ); if ( urls.isEmpty() ) return; setImagesList(urls); setNbItems(); } void SendImagesDialog::slotImagesFilesButtonRem( void ) { for (uint i = 0 ; i < m_ImagesFilesListBox->count() ; ++i) { if (m_ImagesFilesListBox->isSelected(i)) { m_ImagesFilesListBox->removeItem(i); m_ImagesFilesListBox->setCurrentItem(i); --i; } } m_ImagesFilesListBox->setSelected(m_ImagesFilesListBox->item(m_ImagesFilesListBox->currentItem()), true); slotImageSelected(m_ImagesFilesListBox->item(m_ImagesFilesListBox->currentItem())); setNbItems(); } void SendImagesDialog::slotImageSelected( TQListBoxItem * item ) { if ( !item || m_ImagesFilesListBox->count() == 0 ) { m_imageLabel->clear(); return; } ImageItem *pitem = static_cast( item ); if ( !pitem ) return; m_ImageComments->setText( i18n("Caption: %1").arg(pitem->comments()) ); m_ImageAlbum->setText( i18n("Album: %1").arg(pitem->album()) ); m_imageLabel->clear(); if ( m_thumbJob ) delete m_thumbJob; m_thumbJob = TDEIO::filePreview( pitem->url(), m_imageLabel->height() ); connect(m_thumbJob, TQT_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)), TQT_SLOT(slotGotPreview(const KFileItem*, const TQPixmap&))); connect(m_thumbJob, TQT_SIGNAL(failed(const KFileItem*)), TQT_SLOT(slotFailedPreview(const KFileItem*))); } void SendImagesDialog::slotGotPreview(const KFileItem*, const TQPixmap &pixmap) { m_imageLabel->setPixmap(pixmap); m_thumbJob = 0L; } void SendImagesDialog::slotFailedPreview(const KFileItem*) { m_thumbJob = 0L; } void SendImagesDialog::slotOk() { if ( m_ImagesFilesListBox->count() == 0 ) { KMessageBox::error(this, i18n("You must add some images to send.")); return; } if ( m_mailAgentName->currentText() == "Thunderbird" ) { TQFile fileThunderbird(m_ThunderbirdBinPath->url()); if (fileThunderbird.exists() == false) { KMessageBox::sorry(this, i18n("Thunderbird binary path is not valid. Please check it.")); return; } } writeSettings(); for (uint i = 0 ; i < m_ImagesFilesListBox->count() ; i++) { ImageItem *pitem = static_cast( m_ImagesFilesListBox->item(i) ); m_images2send << pitem->url(); } emit signalAccepted(); accept(); } void SendImagesDialog::setNbItems(void) { if ( m_ImagesFilesListBox->count() == 0 ) m_groupBoxImageList->setTitle(i18n("Image List")); else m_groupBoxImageList->setTitle(i18n("Image List (1 item)", "Image List (%n items)", m_ImagesFilesListBox->count() )); } } // NameSpace KIPISendimagesPlugin