TQObject.h

Go to the documentation of this file.
00001 // @(#)root/base:$Id: TQObject.h 22791 2008-03-20 15:33:49Z rdm $
00002 // Author: Valeriy Onuchin & Fons Rademakers   15/10/2000
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_TQObject
00013 #define ROOT_TQObject
00014 
00015 //////////////////////////////////////////////////////////////////////////
00016 //                                                                      //
00017 // This is the ROOT implementation of the Qt object communication       //
00018 // mechanism (see also http://www.troll.no/qt/metaobjects.html)         //
00019 //                                                                      //
00020 // Signals and slots are used for communication between objects.        //
00021 // When an object has changed in some way that might be interesting     //
00022 // for the outside world, it emits a signal to tell whoever is          //
00023 // listening. All slots that are connected to this signal will be       //
00024 // activated (called).  It is even possible to connect a signal         //
00025 // directly to  another signal (this will emit the second signal        //
00026 // immediately whenever the first is emitted.) There is no limitation   //
00027 // on the number of slots that can be connected to a signal.            //
00028 // The slots will be activated in the order they were connected         //
00029 // to the signal. This mechanism allows objects to be easily reused,    //
00030 // because the object that emits a signal does not need to know         //
00031 // to what the signals are connected to.                                //
00032 // Together, signals and slots make up a powerfull component            //
00033 // programming mechanism.                                               //
00034 //                                                                      //
00035 // This implementation is provided by                                   //
00036 // Valeriy Onuchin (onuchin@sirius.ihep.su).                            //
00037 //                                                                      //
00038 //////////////////////////////////////////////////////////////////////////
00039 
00040 #ifndef ROOT_TString
00041 #include "TString.h"
00042 #endif
00043 
00044 class TList;
00045 class TObject;
00046 class TQConnection;
00047 class TClass;
00048 
00049 class TQObject {
00050 
00051 friend class TQConnection;
00052 
00053 protected:
00054    TList   *fListOfSignals;        //! list of signals from this object
00055    TList   *fListOfConnections;    //! list of connections to this object
00056    Bool_t   fSignalsBlocked;       //! flag used for suppression of signals
00057 
00058    static Bool_t fgAllSignalsBlocked;  // flag used for suppression of all signals
00059 
00060    virtual void       *GetSender() { return this; }
00061    virtual const char *GetSenderClassName() const { return ""; }
00062 
00063    static Bool_t ConnectToClass(TQObject *sender,
00064                                 const char *signal,
00065                                 TClass *receiver_class,
00066                                 void *receiver,
00067                                 const char *slot);
00068 
00069    static Bool_t ConnectToClass(const char *sender_class,
00070                                 const char *signal,
00071                                 TClass *receiver_class,
00072                                 void *receiver,
00073                                 const char *slot);
00074 
00075    static Int_t CheckConnectArgs(TQObject *sender,
00076                                  TClass *sender_class, const char *signal,
00077                                  TClass *receiver_class, const char *slot);
00078 
00079 private:
00080    TQObject(const TQObject& tqo);            // not implemented
00081    TQObject& operator=(const TQObject& tqo); // not implemented
00082 
00083 public:
00084    TQObject();
00085    virtual ~TQObject();
00086 
00087    TList   *GetListOfClassSignals() const;
00088    TList   *GetListOfSignals() const { return fListOfSignals; }
00089    TList   *GetListOfConnections() const { return fListOfConnections; }
00090 
00091    Bool_t   AreSignalsBlocked() const { return fSignalsBlocked; }
00092    Bool_t   BlockSignals(Bool_t b)
00093             { Bool_t ret = fSignalsBlocked; fSignalsBlocked = b; return ret; }
00094 
00095    void  CollectClassSignalLists(TList& list, TClass* cls);
00096 
00097    void  EmitVA(const char *signal, Int_t nargs, ...);
00098    void  EmitVA(const char *signal, Int_t nargs, va_list va);
00099    void  Emit(const char *signal);
00100    void  Emit(const char *signal, Long_t *paramArr);
00101    void  Emit(const char *signal, const char *params);
00102    void  Emit(const char *signal, Double_t param);
00103    void  Emit(const char *signal, Long_t param);
00104    void  Emit(const char *signal, Long64_t param);
00105    void  Emit(const char *signal, Bool_t param)
00106          { Emit(signal, (Long_t)param); }
00107    void  Emit(const char *signal, Char_t param)
00108          { Emit(signal, (Long_t)param); }
00109    void  Emit(const char *signal, UChar_t param)
00110          { Emit(signal, (Long_t)param); }
00111    void  Emit(const char *signal, Short_t param)
00112          { Emit(signal, (Long_t)param); }
00113    void  Emit(const char *signal, UShort_t param)
00114          { Emit(signal, (Long_t)param); }
00115    void  Emit(const char *signal, Int_t param)
00116          { Emit(signal, (Long_t)param); }
00117    void  Emit(const char *signal, UInt_t param)
00118          { Emit(signal, (Long_t)param); }
00119    void  Emit(const char *signal, ULong_t param)
00120          { Emit(signal, (Long_t)param); }
00121    void  Emit(const char *signal, ULong64_t param)
00122          { Emit(signal, (Long64_t) param); }
00123    void  Emit(const char *signal, Float_t param)
00124          { Emit(signal, (Double_t)param); }
00125 
00126    Bool_t Connect(const char *signal,
00127                   const char *receiver_class,
00128                   void *receiver,
00129                   const char *slot);
00130 
00131    Bool_t Disconnect(const char *signal = 0,
00132                      void *receiver = 0,
00133                      const char *slot = 0);
00134 
00135    virtual void   HighPriority(const char *signal_name,
00136                                const char *slot_name = 0);
00137 
00138    virtual void   LowPriority(const char *signal_name,
00139                               const char *slot_name = 0);
00140 
00141    virtual Bool_t HasConnection(const char *signal_name) const;
00142    virtual Int_t  NumberOfSignals() const;
00143    virtual Int_t  NumberOfConnections() const;
00144    virtual void   Connected(const char * /*signal_name*/) { }
00145    virtual void   Disconnected(const char * /*signal_name*/) { }
00146 
00147    virtual void   Destroyed()
00148                   { Emit("Destroyed()"); }                 // *SIGNAL*
00149    virtual void   ChangedBy(const char *method)
00150                   { Emit("ChangedBy(char*)", method); }    // *SIGNAL*
00151    virtual void   Message(const char *msg)
00152                   { Emit("Message(char*)", msg); }         // *SIGNAL*
00153 
00154    static Bool_t  Connect(TQObject *sender,
00155                           const char *signal,
00156                           const char *receiver_class,
00157                           void *receiver,
00158                           const char *slot);
00159 
00160    static Bool_t  Connect(const char *sender_class,
00161                           const char *signal,
00162                           const char *receiver_class,
00163                           void *receiver,
00164                           const char *slot);
00165 
00166    static Bool_t  Disconnect(TQObject *sender,
00167                              const char *signal = 0,
00168                              void *receiver = 0,
00169                              const char *slot = 0);
00170 
00171    static Bool_t  Disconnect(const char *class_name,
00172                              const char *signal,
00173                              void *receiver = 0,
00174                              const char *slot = 0);
00175 
00176    static Bool_t  AreAllSignalsBlocked();
00177    static Bool_t  BlockAllSignals(Bool_t b);
00178 
00179    static void    LoadRQ_OBJECT();
00180 
00181    ClassDef(TQObject,1) //Base class for object communication mechanism
00182 };
00183 
00184 
00185 R__EXTERN void *gTQSender;   // the latest sender object
00186 
00187 class TQObjSender : public TQObject {
00188 
00189 protected:
00190    void    *fSender;        //delegation object
00191    TString  fSenderClass;   //class name of delegation object
00192 
00193    virtual void       *GetSender() { return fSender; }
00194    virtual const char *GetSenderClassName() const { return fSenderClass; }
00195 
00196 private:
00197    TQObjSender(const TQObjSender&);            // not implemented
00198    TQObjSender& operator=(const TQObjSender&); // not implemented
00199 
00200 public:
00201    TQObjSender() : TQObject(), fSender(0), fSenderClass() { }
00202    virtual ~TQObjSender() { Disconnect(); }
00203 
00204    virtual void SetSender(void *sender) { fSender = sender; }
00205    void SetSenderClassName(const char *sclass = "") { fSenderClass = sclass; }
00206 
00207    ClassDef(TQObjSender,0) //Used to "delegate" TQObject functionality
00208                            //to interpreted classes, see also RQ_OBJECT.h
00209 };
00210 
00211 // Global function which simplifies making connections in interpreted
00212 // ROOT session
00213 //
00214 //  ConnectCINT      - connects to interpreter(CINT) command
00215 
00216 extern Bool_t ConnectCINT(TQObject *sender, const char *signal,
00217                           const char *slot);
00218 
00219 #ifdef G__DICTIONARY
00220 // This include makes it possible to have a single connection
00221 // from all objects of the same class but is only needed in
00222 // the dictionary.
00223 #include "TQClass.h"
00224 #endif
00225 
00226 
00227 //---- ClassImpQ macro ----------------------------------------------
00228 //
00229 // This macro used to correspond to the ClassImp macro and should be used
00230 // for classes derived from TQObject instead of the ClassImp macro.
00231 // This macro makes it possible to have a single connection from
00232 // all objects of the same class.
00233 // *** It is now obsolete ***
00234 
00235 #define ClassImpQ(name) \
00236    ClassImp(name)
00237 
00238 #endif

Generated on Tue Jul 5 14:10:29 2011 for ROOT_528-00b_version by  doxygen 1.5.1