kio Library API Documentation

kmetaprops.cpp

00001 /* This file is part of the KDE libraries
00002     Copyright (C) 2001,2002 Rolf Magnus <ramagnus@kde.org>
00003 
00004     library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License version 2 as published by the Free Software Foundation.
00007 
00008     This library is distributed in the hope that it will be useful,
00009     but WITHOUT ANY WARRANTY; without even the implied warranty of
00010     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011     Library General Public License for more details.
00012 
00013     You should have received a copy of the GNU Library General Public License
00014     along with this library; see the file COPYING.LIB.  If not, write to
00015     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016     Boston, MA 02111-1307, USA.
00017   
00018     $Id: kmetaprops.cpp,v 1.26 2002/06/18 08:25:21 ramagnus Exp $
00019  */
00020 
00021 #include "kmetaprops.h"
00022 
00023 #include <kfilemetainfo.h>
00024 #include <kglobal.h>
00025 #include <klocale.h>
00026 #include <kdebug.h>
00027 #include <kfilemetainfowidget.h>
00028 
00029 #include <qvalidator.h>
00030 #include <qlayout.h>
00031 #include <qlabel.h>
00032 #include <qfileinfo.h>
00033 #include <qdatetime.h>
00034 #include <qstylesheet.h>
00035 #include <qvgroupbox.h>
00036 
00037 #undef Bool
00038 
00039 class MetaPropsScrollView : public QScrollView
00040 {
00041 public:
00042     MetaPropsScrollView(QWidget* parent = 0, const char* name = 0)
00043         : QScrollView(parent, name)
00044     {
00045       setFrameStyle(QFrame::NoFrame);
00046       m_frame = new QFrame(viewport(), "MetaPropsScrollView::m_frame");
00047       m_frame->setFrameStyle(QFrame::NoFrame);
00048       addChild(m_frame, 0, 0);
00049     };
00050 
00051     QFrame* frame() {return m_frame;};
00052 
00053 protected:
00054     virtual void viewportResizeEvent(QResizeEvent* ev)
00055     {
00056       QScrollView::viewportResizeEvent(ev);
00057       m_frame->resize( kMax(m_frame->sizeHint().width(), ev->size().width()),
00058                        kMax(m_frame->sizeHint().height(), ev->size().height()));
00059     };
00060 
00061 private:
00062       QFrame* m_frame;
00063 };
00064 
00065 class KFileMetaPropsPlugin::KFileMetaPropsPluginPrivate
00066 {
00067 public:
00068     KFileMetaPropsPluginPrivate()  {}
00069     ~KFileMetaPropsPluginPrivate() {}
00070 
00071     QFrame*                       m_frame;
00072     QGridLayout*                  m_framelayout;
00073     KFileMetaInfo                 m_info;
00074 //    QPushButton*                m_add;
00075     QPtrList<KFileMetaInfoWidget> m_editWidgets;
00076 };
00077 
00078 KFileMetaPropsPlugin::KFileMetaPropsPlugin(KPropertiesDialog* props)
00079   : KPropsDlgPlugin(props)
00080 {
00081     d = new KFileMetaPropsPluginPrivate;
00082 
00083     KFileItem * fileitem = properties->item();
00084     kdDebug(250) << "KFileMetaPropsPlugin constructor" << endl;
00085 
00086     d->m_info  = fileitem->metaInfo();
00087     if (!d->m_info.isValid())
00088     {
00089         d->m_info = KFileMetaInfo(properties->kurl().path(-1));
00090         fileitem->setMetaInfo(d->m_info);
00091     }
00092 
00093     if ( properties->items().count() > 1 )
00094     {
00095         // not yet supported
00096         // we should allow setting values for a list of files. Itt makes sense
00097         // in some cases, like the album of a list of mp3s
00098         return;
00099     }
00100 
00101     createLayout();
00102 
00103     setDirty(true);
00104 }
00105 
00106 void KFileMetaPropsPlugin::createLayout()
00107 {
00108     QFileInfo file_info(properties->item()->url().path());
00109 
00110     kdDebug(250) << "KFileMetaPropsPlugin::createLayout" << endl;
00111 
00112     // is there any valid and non-empty info at all?
00113     if ( !d->m_info.isValid() || (d->m_info.preferredKeys()).isEmpty() )
00114         return;
00115 
00116     // now get a list of groups
00117     KFileMetaInfoProvider* prov = KFileMetaInfoProvider::self();
00118     QStringList groupList = d->m_info.preferredGroups();
00119 
00120     const KFileMimeTypeInfo* mtinfo = prov->mimeTypeInfo(d->m_info.mimeType());
00121     if (!mtinfo) 
00122     {
00123         kdDebug(7034) << "no mimetype info there\n";
00124         return;
00125     }
00126 
00127     // let the dialog create the page frame
00128     QFrame* topframe = properties->dialog()->addPage(i18n("&Meta Info"));
00129     topframe->setFrameStyle(QFrame::NoFrame);
00130     QVBoxLayout* tmp = new QVBoxLayout(topframe);
00131 
00132     // create a scroll view in the page
00133     MetaPropsScrollView* view = new MetaPropsScrollView(topframe);
00134 
00135     tmp->addWidget(view);
00136 
00137     d->m_frame = view->frame();
00138 
00139     QVBoxLayout *toplayout = new QVBoxLayout(d->m_frame);
00140     toplayout->setSpacing(KDialog::spacingHint());
00141 
00142     for (QStringList::Iterator git=groupList.begin(); 
00143             git!=groupList.end(); ++git)
00144     {
00145         kdDebug(7033) << *git << endl;
00146 
00147         QStringList itemList = d->m_info.group(*git).preferredKeys();
00148         if (itemList.isEmpty())
00149             continue;
00150 
00151         QGroupBox *groupBox = new QGroupBox(2, Qt::Horizontal, 
00152             QStyleSheet::escape(mtinfo->groupInfo(*git)->translatedName()), 
00153             d->m_frame);
00154 
00155         toplayout->addWidget(groupBox);
00156 
00157         QValueList<KFileMetaInfoItem> readItems;
00158         QValueList<KFileMetaInfoItem> editItems;
00159 
00160         for (QStringList::Iterator iit = itemList.begin(); 
00161                 iit!=itemList.end(); ++iit)
00162         {
00163             KFileMetaInfoItem item = d->m_info[*git][*iit];
00164             if ( !item.isValid() ) continue;
00165 
00166             bool editable = file_info.isWritable() && item.isEditable();
00167 
00168             if (editable)
00169                 editItems.append( item );
00170             else
00171                 readItems.append( item );
00172         }
00173 
00174         KFileMetaInfoWidget* w = 0L;
00175         // then first add the editable items to the layout
00176         for (QValueList<KFileMetaInfoItem>::Iterator iit= editItems.begin(); 
00177                 iit!=editItems.end(); ++iit)
00178         {
00179             (new QLabel((*iit).translatedKey() + ":", groupBox));
00180             QValidator* val = mtinfo->createValidator(*git, (*iit).key());
00181             if (!val) kdDebug(7033) << "didn't get a validator for " << *git << "/" << (*iit).key() << endl;
00182             w = new KFileMetaInfoWidget(*iit, val, groupBox);
00183             d->m_editWidgets.append( w );
00184             connect(w, SIGNAL(valueChanged(const QVariant&)), this, SIGNAL(changed()));
00185         }
00186 
00187         // and then the read only items
00188         for (QValueList<KFileMetaInfoItem>::Iterator iit= readItems.begin(); 
00189                 iit!=readItems.end(); ++iit)
00190         {
00191             (new QLabel((*iit).translatedKey() + ":", groupBox));
00192             (new KFileMetaInfoWidget(*iit, 0L, groupBox));
00193         }
00194     }
00195 
00196     toplayout->addStretch(1);
00197 
00198     // the add key (disabled until fully implemented)
00199 /*    d->m_add = new QPushButton(i18n("&Add"), topframe);
00200     d->m_add->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
00201                                         QSizePolicy::Fixed));
00202     connect(d->m_add, SIGNAL(clicked()), this, SLOT(slotAdd()));
00203     tmp->addWidget(d->m_add);
00204 
00205     // if nothing can be added, deactivate it
00206     if ( !d->m_info.supportsVariableKeys() )
00207     {
00208         // if supportedKeys() does contain anything not in preferredKeys,
00209         // we have something addable
00210 
00211         QStringList sk = d->m_info.supportedKeys();
00212         d->m_add->setEnabled(false);
00213         for (QStringList::Iterator it = sk.begin(); it!=sk.end(); ++it)
00214         {
00215                 if ( l.find(*it)==l.end() )
00216                 {
00217                     d->m_add->setEnabled(true);
00218                     kdDebug(250) << "**first addable key is " << (*it).latin1() << "**" <<endl;
00219                     break;
00220                 }
00221                 kdDebug(250) << "**already existing key is " << (*it).latin1() << "**" <<endl;
00222         }
00223     } */
00224 }
00225 
00226 /*void KFileMetaPropsPlugin::slotAdd()
00227 {
00228     // add a lineedit for the name
00229 
00230 
00231 
00232     // insert the item in the list
00233 
00234 }*/
00235 
00236 KFileMetaPropsPlugin::~KFileMetaPropsPlugin()
00237 {
00238   delete d;
00239 }
00240 
00241 bool KFileMetaPropsPlugin::supports( KFileItemList _items )
00242 {
00243 #ifdef _GNUC
00244 #warning TODO: Add support for more than one item
00245 #endif
00246   if (_items.count()!=1) return false;
00247   return true;
00248 }
00249 
00250 void KFileMetaPropsPlugin::applyChanges()
00251 {
00252   kdDebug(250) << "applying changes" << endl;
00253   // insert the fields that changed into the info object
00254 
00255   QPtrListIterator<KFileMetaInfoWidget> it( d->m_editWidgets );
00256   KFileMetaInfoWidget* w;
00257   for (; (w = it.current()); ++it) w->apply();
00258   d->m_info.applyChanges();
00259 }
00260 
00261 #include "kmetaprops.moc"
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.0.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Oct 8 12:21:30 2003 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2001