certmanager/lib

keylistview.h

00001 /*
00002     keylistview.h
00003 
00004     This file is part of libkleopatra, the KDE keymanagement library
00005     Copyright (c) 2004 Klarälvdalens Datakonsult AB
00006 
00007     Libkleopatra is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU General Public License as
00009     published by the Free Software Foundation; either version 2 of the
00010     License, or (at your option) any later version.
00011 
00012     Libkleopatra is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021     In addition, as a special exception, the copyright holders give
00022     permission to link the code of this program with any edition of
00023     the TQt library by Trolltech AS, Norway (or with modified versions
00024     of TQt that use the same license as TQt), and distribute linked
00025     combinations including the two.  You must obey the GNU General
00026     Public License in all respects for all of the code used other than
00027     TQt.  If you modify this file, you may extend this exception to
00028     your version of the file, but you are not obligated to do so.  If
00029     you do not wish to do so, delete this exception statement from
00030     your version.
00031 */
00032 
00033 #ifndef __KLEO_KEYLISTVIEW_H__
00034 #define __KLEO_KEYLISTVIEW_H__
00035 
00036 #include <tdelistview.h>
00037 
00038 #include <gpgmepp/key.h>
00039 #include <tdepimmacros.h>
00040 
00041 class TQPainter;
00042 class TQColorGroup;
00043 class TQFont;
00044 class TQColor;
00045 
00046 namespace Kleo {
00047 
00048   // work around moc parser bug...
00049 #define TEMPLATE_TYPENAME(T) template <typename T>
00050   TEMPLATE_TYPENAME(T)
00051   inline T * lvi_cast( TQListViewItem * item ) {
00052     return item && (item->rtti() & T::RTTI_MASK) == T::RTTI
00053       ? static_cast<T*>( item ) : 0 ;
00054   }
00055 
00056   TEMPLATE_TYPENAME(T)
00057   inline const T * lvi_cast( const TQListViewItem * item ) {
00058     return item && (item->rtti() & T::RTTI_MASK) == T::RTTI
00059       ? static_cast<const T*>( item ) : 0 ;
00060   }
00061 #undef TEMPLATE_TYPENAME
00062 
00063   class KeyListView;
00064 
00065   class KDE_EXPORT KeyListViewItem : public TQListViewItem {
00066   public:
00067     KeyListViewItem( KeyListView * parent, const GpgME::Key & key );
00068     KeyListViewItem( KeyListView * parent, KeyListViewItem * after, const GpgME::Key & key );
00069     KeyListViewItem( KeyListViewItem * parent, const GpgME::Key & key );
00070     KeyListViewItem( KeyListViewItem * parent, KeyListViewItem * after, const GpgME::Key & key );
00071     ~KeyListViewItem();
00072 
00073     void setKey( const GpgME::Key & key );
00074     const GpgME::Key & key() const { return mKey; }
00075 
00076     enum { RTTI_MASK = 0xFFFFFFF0, RTTI = 0x2C1362E0 };
00077 
00078     //
00079     // only boring stuff below:
00080     //
00081     virtual TQString toolTip( int column ) const;
00082 
00084     KeyListView * listView() const;
00086     KeyListViewItem * nextSibling() const;
00088     int compare( TQListViewItem * other, int col, bool ascending ) const;
00090     TQString key( int col, bool ascending ) const { return TQListViewItem::key( col, ascending ); }
00092     int rtti() const { return RTTI; }
00094     void paintCell( TQPainter * p, const TQColorGroup & cg, int column, int width, int alignment );
00096     void insertItem( TQListViewItem * item );
00098     void takeItem( TQListViewItem * item );
00099 
00100   private:
00101     GpgME::Key mKey;
00102   };
00103 
00104   class KDE_EXPORT SubkeyKeyListViewItem : public KeyListViewItem {
00105   public:
00106     SubkeyKeyListViewItem( KeyListView * parent, const GpgME::Subkey & subkey );
00107     SubkeyKeyListViewItem( KeyListView * parent, KeyListViewItem * after, const GpgME::Subkey & subkey );
00108     SubkeyKeyListViewItem( KeyListViewItem * parent, const GpgME::Subkey & subkey );
00109     SubkeyKeyListViewItem( KeyListViewItem * parent, KeyListViewItem * after, const GpgME::Subkey & subkey );
00110 
00111     void setSubkey( const GpgME::Subkey & subkey );
00112     const GpgME::Subkey & subkey() const { return mSubkey; }
00113 
00114     enum { RTTI = KeyListViewItem::RTTI + 1 };
00115 
00116     //
00117     // only boring stuff below:
00118     //
00120     TQString toolTip( int col ) const;
00122     TQString text( int col ) const;
00124     const TQPixmap * pixmap( int col ) const;
00126     int compare( TQListViewItem * other, int col, bool ascending ) const;
00128     int rtti() const { return RTTI; }
00130     void paintCell( TQPainter * p, const TQColorGroup & cg, int column, int width, int alignment );
00131 
00132   private:
00133     GpgME::Subkey mSubkey;
00134   };
00135 
00136   class KDE_EXPORT UserIDKeyListViewItem : public KeyListViewItem {
00137   public:
00138     UserIDKeyListViewItem( KeyListView * parent, const GpgME::UserID & userid );
00139     UserIDKeyListViewItem( KeyListView * parent, KeyListViewItem * after, const GpgME::UserID & userid );
00140     UserIDKeyListViewItem( KeyListViewItem * parent, const GpgME::UserID & userid );
00141     UserIDKeyListViewItem( KeyListViewItem * parent, KeyListViewItem * after, const GpgME::UserID & userid );
00142 
00143     void setUserID( const GpgME::UserID & userid );
00144     const GpgME::UserID userID() const { return mUserID; }
00145 
00146     enum { RTTI = KeyListViewItem::RTTI + 2 };
00147 
00148     //
00149     // only boring stuff below:
00150     //
00152     TQString toolTip( int col ) const;
00154     TQString text( int col ) const;
00156     const TQPixmap * pixmap( int col ) const;
00158     int compare( TQListViewItem * other, int col, bool ascending ) const;
00160     int rtti() const { return RTTI; }
00162     void paintCell( TQPainter * p, const TQColorGroup & cg, int column, int width, int alignment );
00163 
00164   private:
00165     GpgME::UserID mUserID;
00166   };
00167 
00168   class KDE_EXPORT SignatureKeyListViewItem : public KeyListViewItem {
00169   public:
00170     SignatureKeyListViewItem( KeyListView * parent, const GpgME::UserID::Signature & sig );
00171     SignatureKeyListViewItem( KeyListView * parent, KeyListViewItem * after, const GpgME::UserID::Signature & sig );
00172     SignatureKeyListViewItem( KeyListViewItem * parent, const GpgME::UserID::Signature & sig );
00173     SignatureKeyListViewItem( KeyListViewItem * parent, KeyListViewItem * after, const GpgME::UserID::Signature & sig );
00174 
00175     void setSignature( const GpgME::UserID::Signature & sig );
00176     const GpgME::UserID::Signature & signature() const { return mSignature; }
00177 
00178     enum { RTTI = KeyListViewItem::RTTI + 3 };
00179 
00180     //
00181     // only boring stuff below:
00182     //
00184     TQString toolTip( int col ) const;
00186     TQString text( int col ) const;
00188     const TQPixmap * pixmap( int col ) const;
00190     int compare( TQListViewItem * other, int col, bool ascending ) const;
00192     int rtti() const { return RTTI; }
00194     void paintCell( TQPainter * p, const TQColorGroup & cg, int column, int width, int alignment );
00195 
00196   private:
00197     GpgME::UserID::Signature mSignature;
00198   };
00199 
00200 
00201   class KDE_EXPORT KeyListView : public TDEListView {
00202     Q_OBJECT
00203   
00204     friend class KeyListViewItem;
00205   public:
00206 
00207     class KDE_EXPORT ColumnStrategy {
00208     public:
00209       virtual ~ColumnStrategy();
00210       virtual TQString title( int column ) const = 0;
00211       virtual int width( int column, const TQFontMetrics & fm ) const;
00212       virtual TQListView::WidthMode widthMode( int ) const { return TQListView::Manual; }
00213 
00214       virtual TQString text( const GpgME::Key & key, int column ) const = 0;
00215       virtual TQString toolTip( const GpgME::Key & key, int column ) const;
00216       virtual const TQPixmap * pixmap( const GpgME::Key &, int ) const { return 0; }
00217       virtual int compare( const GpgME::Key & key1, const GpgME::Key & key2, const int column ) const;
00218 
00219       virtual TQString subkeyText( const GpgME::Subkey &, int ) const { return TQString(); }
00220       virtual TQString subkeyToolTip( const GpgME::Subkey & subkey, int column ) const;
00221       virtual const TQPixmap * subkeyPixmap( const GpgME::Subkey &, int ) const { return 0; }
00222       virtual int subkeyCompare( const GpgME::Subkey & subkey1, const GpgME::Subkey & subkey2, const int column ) const;
00223 
00224       virtual TQString userIDText( const GpgME::UserID &, int ) const { return TQString(); }
00225       virtual TQString userIDToolTip( const GpgME::UserID & userID, int column ) const;
00226       virtual const TQPixmap * userIDPixmap( const GpgME::UserID &, int ) const { return 0; }
00227       virtual int userIDCompare( const GpgME::UserID & userID1, const GpgME::UserID & userID2, const int column ) const;
00228 
00229       virtual TQString signatureText( const GpgME::UserID::Signature &, int ) const { return TQString(); }
00230       virtual TQString signatureToolTip( const GpgME::UserID::Signature & sig, int column ) const;
00231       virtual const TQPixmap * signaturePixmap( const GpgME::UserID::Signature &, int ) const { return 0; }
00232       virtual int signatureCompare( const GpgME::UserID::Signature & sig1, const GpgME::UserID::Signature & sig2, const int column ) const;
00233     };
00234 
00235     class KDE_EXPORT DisplayStrategy {
00236     public:
00237       virtual ~DisplayStrategy();
00238       //font
00239       virtual TQFont keyFont( const GpgME::Key &, const TQFont & ) const;
00240       virtual TQFont subkeyFont( const GpgME::Subkey &, const TQFont & ) const;
00241       virtual TQFont useridFont( const GpgME::UserID &, const TQFont &  ) const;
00242       virtual TQFont signatureFont( const GpgME::UserID::Signature & , const TQFont & ) const;
00243       //foreground
00244       virtual TQColor keyForeground( const GpgME::Key & , const TQColor & ) const;
00245       virtual TQColor subkeyForeground( const GpgME::Subkey &, const TQColor &  ) const;
00246       virtual TQColor useridForeground( const GpgME::UserID &, const TQColor &  ) const;
00247       virtual TQColor signatureForeground( const GpgME::UserID::Signature &, const TQColor &  ) const;
00248       //background
00249       virtual TQColor keyBackground( const GpgME::Key &, const TQColor &  ) const;
00250       virtual TQColor subkeyBackground( const GpgME::Subkey &, const TQColor &  ) const;
00251       virtual TQColor useridBackground( const GpgME::UserID &, const TQColor & ) const;
00252       virtual TQColor signatureBackground( const GpgME::UserID::Signature &, const TQColor &  ) const;
00253     };
00254 
00255     KeyListView( const ColumnStrategy * strategy,
00256          const DisplayStrategy * display=0,
00257          TQWidget * parent=0, const char * name=0, WFlags f=0 );
00258 
00259     ~KeyListView();
00260 
00261     const ColumnStrategy * columnStrategy() const { return mColumnStrategy; }
00262     const DisplayStrategy * displayStrategy() const { return mDisplayStrategy; }
00263 
00264     bool hierarchical() const { return mHierarchical; }
00265     virtual void setHierarchical( bool hier );
00266 
00267     void flushKeys() { slotUpdateTimeout(); }
00268 
00269     bool hasSelection() const;
00270 
00271     KeyListViewItem * itemByFingerprint( const TQCString & ) const;
00272 
00273   signals:
00274     void doubleClicked( Kleo::KeyListViewItem*, const TQPoint&, int );
00275     void returnPressed( Kleo::KeyListViewItem* );
00276     void selectionChanged( Kleo::KeyListViewItem* );
00277     void contextMenu( Kleo::KeyListViewItem*, const TQPoint& );
00278 
00279   public slots:
00280     virtual void slotAddKey( const GpgME::Key & key );
00281     virtual void slotRefreshKey( const GpgME::Key & key );
00282 
00283     //
00284     // Only boring stuff below:
00285     //
00286   private slots:
00287     void slotEmitDoubleClicked( TQListViewItem*, const TQPoint&, int );
00288     void slotEmitReturnPressed( TQListViewItem* );
00289     void slotEmitSelectionChanged( TQListViewItem* );
00290     void slotEmitContextMenu( TDEListView*, TQListViewItem*, const TQPoint& );
00291     void slotUpdateTimeout();
00292 
00293   public:
00295     KeyListViewItem * selectedItem() const;
00297     TQPtrList<KeyListViewItem> selectedItems() const;
00299     KeyListViewItem * firstChild() const;
00301     void clear();
00303     void insertItem( TQListViewItem * );
00305     void takeItem( TQListViewItem * );
00306 
00307   private:
00308     void doHierarchicalInsert( const GpgME::Key & );
00309     void gatherScattered();
00310     void scatterGathered( TQListViewItem * );
00311     void registerItem( KeyListViewItem * );
00312     void deregisterItem( const KeyListViewItem * );
00313 
00314   private:
00315     const ColumnStrategy * mColumnStrategy;
00316     const DisplayStrategy * mDisplayStrategy;
00317     bool mHierarchical;
00318 
00319     class Private;
00320     Private * d;
00321   };
00322 }
00323 
00324 #endif // __KLEO_KEYLISTVIEW_H__