00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include "kfilemetainfowidget.h"
00022 
00023 #include <keditcl.h>
00024 #include <klocale.h>
00025 #include <knuminput.h>
00026 #include <kcombobox.h>
00027 #include <klineedit.h>
00028 #include <kstringvalidator.h>
00029 #include <kdebug.h>
00030 
00031 #include <qlabel.h>
00032 #include <qcheckbox.h>
00033 #include <qspinbox.h>
00034 #include <qdatetimeedit.h>
00035 #include <qpixmap.h>
00036 #include <qimage.h>
00037 #include <qlayout.h>
00038 #include <qvalidator.h>
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 KFileMetaInfoWidget::KFileMetaInfoWidget(KFileMetaInfoItem item,
00051                                          QValidator* val,
00052                                          QWidget* parent, const char* name)
00053     : QWidget(parent, name),
00054       m_value(item.value()),
00055       m_item(item),
00056       m_validator(val)
00057 {
00058     kdDebug(7033) << "*** item "  << m_item.key()
00059                   << " is a " << value().typeName() << endl;
00060 
00061     if (m_item.isEditable())
00062         m_widget = makeWidget();
00063     else
00064         switch (m_value.type())
00065         {
00066             case QVariant::Image :
00067                 m_widget = new QLabel(this, "info image");
00068                 static_cast<QLabel*>(m_widget)->setPixmap(QPixmap(m_value.toImage()));
00069                 break;
00070             case QVariant::Pixmap :
00071                 m_widget = new QLabel(this, "info pixmap");
00072                 static_cast<QLabel*>(m_widget)->setPixmap(m_value.toPixmap());
00073                 break;
00074             default:
00075                 m_widget = new QLabel(item.string(true), this, "info label");
00076         }
00077 
00078     (new QHBoxLayout(this))->addWidget(m_widget);
00079 }
00080 
00081 KFileMetaInfoWidget::~KFileMetaInfoWidget()
00082 {
00083 }
00084 
00085 QWidget* KFileMetaInfoWidget::makeWidget()
00086 {
00087     QString valClass;
00088     QWidget* w;
00089 
00090     switch (m_value.type())
00091     {
00092         case QVariant::Invalid:     
00093             
00094             w = new QLabel(i18n("<Error>"), this, "label");
00095             break;
00096 
00097         case QVariant::Int:         
00098         case QVariant::UInt:        
00099             w = makeIntWidget();
00100             break;
00101 
00102         case QVariant::Bool:        
00103             w = makeBoolWidget();
00104             break;
00105 
00106         case QVariant::Double:      
00107             w = makeDoubleWidget();
00108             break;
00109 
00110 
00111         case QVariant::Date:        
00112             w = makeDateWidget();
00113             break;
00114 
00115         case QVariant::Time:        
00116             w = makeTimeWidget();
00117             break;
00118 
00119         case QVariant::DateTime:    
00120             w = makeDateTimeWidget();
00121             break;
00122 
00123 #if 0
00124         case QVariant::Size:        
00125         case QVariant::String:      
00126         case QVariant::List:        
00127         case QVariant::Map:         
00128         case QVariant::StringList:  
00129         case QVariant::Font:        
00130         case QVariant::Pixmap:      
00131         case QVariant::Brush:       
00132         case QVariant::Rect:        
00133         case QVariant::Color:       
00134         case QVariant::Palette:     
00135         case QVariant::ColorGroup:  
00136         case QVariant::IconSet:     
00137         case QVariant::Point:       
00138         case QVariant::Image:       
00139         case QVariant::CString:     
00140         case QVariant::PointArray:  
00141         case QVariant::Region:      
00142         case QVariant::Bitmap:      
00143         case QVariant::Cursor:      
00144         case QVariant::ByteArray:   
00145         case QVariant::BitArray:    
00146         case QVariant::SizePolicy:  
00147         case QVariant::KeySequence: 
00148 #endif
00149         default:
00150             w = makeStringWidget();
00151     }
00152 
00153     kdDebug(7033) << "*** item " << m_item.key()
00154                   << "is a " << m_item.value().typeName() << endl;
00155     if (m_validator)
00156         kdDebug(7033) << " and validator is a " << m_validator->className() << endl;
00157 
00158     kdDebug(7033) << "*** created a " << w->className() << " for it\n";
00159 
00160     return w;
00161 }
00162 
00163 
00164 
00165 
00166 
00167 QWidget* KFileMetaInfoWidget::makeBoolWidget()
00168 {
00169     QCheckBox* cb = new QCheckBox(this, "metainfo bool widget");
00170     cb->setChecked(m_item.value().toBool());
00171     connect(cb, SIGNAL(toggled(bool)), this, SLOT(slotChanged(bool)));
00172     return cb;
00173 }
00174 
00175 QWidget* KFileMetaInfoWidget::makeIntWidget()
00176 {
00177     QSpinBox* sb = new QSpinBox(this, "metainfo integer widget");
00178     sb->setValue(m_item.value().toInt());
00179 
00180     if (m_validator)
00181     {
00182         if (m_validator->inherits("QIntValidator"))
00183         {
00184             sb->setMinValue(static_cast<QIntValidator*>(m_validator)->bottom());
00185             sb->setMaxValue(static_cast<QIntValidator*>(m_validator)->top());
00186         }
00187         reparentValidator(sb, m_validator);
00188         sb->setValidator(m_validator);
00189     }
00190 
00191     
00192     if (m_item.type() == QVariant::UInt)
00193         sb->setMinValue(QMAX(sb->minValue(), 0));
00194 
00195     connect(sb, SIGNAL(valueChanged(int)), this, SLOT(slotChanged(int)));
00196     return sb;
00197 }
00198 
00199 QWidget* KFileMetaInfoWidget::makeDoubleWidget()
00200 {
00201     KDoubleNumInput* dni = new KDoubleNumInput(m_item.value().toDouble(),
00202                                                this, "metainfo double widget");
00203 
00204 
00205     if (m_validator)
00206     {
00207         if (m_validator->inherits("QDoubleValidator"))
00208         {
00209             dni->setMinValue(static_cast<QDoubleValidator*>(m_validator)->bottom());
00210             dni->setMaxValue(static_cast<QDoubleValidator*>(m_validator)->top());
00211         }
00212         reparentValidator(dni, m_validator);
00213     }
00214 
00215     connect(dni, SIGNAL(valueChanged(double)), this, SLOT(slotChanged(double)));
00216     return dni;
00217 }
00218 
00219 QWidget* KFileMetaInfoWidget::makeStringWidget()
00220 {
00221     if (m_validator && m_validator->inherits("KStringListValidator"))
00222     {
00223         KComboBox* b = new KComboBox(true, this, "metainfo combobox");
00224         KStringListValidator* val = static_cast<KStringListValidator*>
00225                                                     (m_validator);
00226         b->insertStringList(val->stringList());
00227         b->setCurrentText(m_item.value().toString());
00228         connect(b, SIGNAL(activated(const QString &)), this, SLOT(slotComboChanged(const QString &)));
00229         b->setValidator(val);
00230         reparentValidator(b, val);
00231         return b;
00232     }
00233 
00234     if ( m_item.attributes() & KFileMimeTypeInfo::MultiLine ) {
00235         KEdit *edit = new KEdit( this );
00236         edit->setText( m_item.value().toString() );
00237         connect( edit, SIGNAL( textChanged() ),
00238                  this, SLOT( slotMultiLineEditChanged() ));
00239         
00240         if ( m_validator )
00241             reparentValidator( edit, m_validator );
00242         return edit;
00243     }
00244 
00245     KLineEdit* e = new KLineEdit(m_item.value().toString(), this);
00246     if (m_validator)
00247     {
00248         e->setValidator(m_validator);
00249         reparentValidator(e, m_validator);
00250     }
00251     connect(e,    SIGNAL(textChanged(const QString&)),
00252             this, SLOT(slotLineEditChanged(const QString&)));
00253     return e;
00254 }
00255 
00256 QWidget* KFileMetaInfoWidget::makeDateWidget()
00257 {
00258   return new QDateEdit(m_item.value().toDate(), this);
00259 }
00260 
00261 QWidget* KFileMetaInfoWidget::makeTimeWidget()
00262 {
00263   return new QTimeEdit(m_item.value().toTime(), this);
00264 }
00265 
00266 QWidget* KFileMetaInfoWidget::makeDateTimeWidget()
00267 {
00268   return new QDateTimeEdit(m_item.value().toDateTime(), this);
00269 }
00270 
00271 void KFileMetaInfoWidget::reparentValidator( QWidget *widget,
00272                                              QValidator *validator )
00273 {
00274     if ( !validator->parent() )
00275         widget->insertChild( validator );
00276 }
00277 
00278 
00279 
00280 
00281 
00282 void KFileMetaInfoWidget::slotChanged(bool value)
00283 {
00284     Q_ASSERT(m_widget->inherits("QComboBox"));
00285     m_value = QVariant(value);
00286     emit valueChanged(m_value);
00287     m_dirty = true;
00288 }
00289 
00290 void KFileMetaInfoWidget::slotChanged(int value)
00291 {
00292     Q_ASSERT(m_widget->inherits("QSpinBox"));
00293     m_value = QVariant(value);
00294     emit valueChanged(m_value);
00295     m_dirty = true;
00296 }
00297 
00298 void KFileMetaInfoWidget::slotChanged(double value)
00299 {
00300     Q_ASSERT(m_widget->inherits("KDoubleNumInput"));
00301     m_value = QVariant(value);
00302     emit valueChanged(m_value);
00303     m_dirty = true;
00304 }
00305 
00306 void KFileMetaInfoWidget::slotComboChanged(const QString &value)
00307 {
00308     Q_ASSERT(m_widget->inherits("KComboBox"));
00309     m_value = QVariant(value);
00310     emit valueChanged(m_value);
00311     m_dirty = true;
00312 }
00313 
00314 void KFileMetaInfoWidget::slotLineEditChanged(const QString& value)
00315 {
00316     Q_ASSERT(m_widget->inherits("KLineEdit"));
00317     m_value = QVariant(value);
00318     emit valueChanged(m_value);
00319     m_dirty = true;
00320 }
00321 
00322 
00323 void KFileMetaInfoWidget::slotMultiLineEditChanged()
00324 {
00325     Q_ASSERT(m_widget->inherits("QTextEdit"));
00326     m_value = QVariant( static_cast<const QTextEdit*>( sender() )->text() );
00327     emit valueChanged(m_value);
00328     m_dirty = true;
00329 }
00330 
00331 void KFileMetaInfoWidget::slotDateChanged(const QDate& value)
00332 {
00333     Q_ASSERT(m_widget->inherits("QDateEdit"));
00334     m_value = QVariant(value);
00335     emit valueChanged(m_value);
00336     m_dirty = true;
00337 }
00338 
00339 void KFileMetaInfoWidget::slotTimeChanged(const QTime& value)
00340 {
00341     Q_ASSERT(m_widget->inherits("QTimeEdit"));
00342     m_value = QVariant(value);
00343     emit valueChanged(m_value);
00344     m_dirty = true;
00345 }
00346 
00347 void KFileMetaInfoWidget::slotDateTimeChanged(const QDateTime& value)
00348 {
00349     Q_ASSERT(m_widget->inherits("QDateTimeEdit"));
00350     m_value = QVariant(value);
00351     emit valueChanged(m_value);
00352     m_dirty = true;
00353 }
00354 
00355 #include "kfilemetainfowidget.moc"