1    	// @(#)root/base:$Id$
2    	// Author: Valeriy Onuchin & Fons Rademakers   15/10/2000
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
6    	 * All rights reserved.                                                  *
7    	 *                                                                       *
8    	 * For the licensing terms see $ROOTSYS/LICENSE.                         *
9    	 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
10   	 *************************************************************************/
11   	
12   	#ifndef ROOT_TQObject
13   	#define ROOT_TQObject
14   	
15   	//////////////////////////////////////////////////////////////////////////
16   	//                                                                      //
17   	// This is the ROOT implementation of the Qt object communication       //
18   	// mechanism (see also http://www.troll.no/qt/metaobjects.html)         //
19   	//                                                                      //
20   	// Signals and slots are used for communication between objects.        //
21   	// When an object has changed in some way that might be interesting     //
22   	// for the outside world, it emits a signal to tell whoever is          //
23   	// listening. All slots that are connected to this signal will be       //
24   	// activated (called).  It is even possible to connect a signal         //
25   	// directly to  another signal (this will emit the second signal        //
26   	// immediately whenever the first is emitted.) There is no limitation   //
27   	// on the number of slots that can be connected to a signal.            //
28   	// The slots will be activated in the order they were connected         //
29   	// to the signal. This mechanism allows objects to be easily reused,    //
30   	// because the object that emits a signal does not need to know         //
31   	// to what the signals are connected to.                                //
32   	// Together, signals and slots make up a powerfull component            //
33   	// programming mechanism.                                               //
34   	//                                                                      //
35   	// This implementation is provided by                                   //
36   	// Valeriy Onuchin (onuchin@sirius.ihep.su).                            //
37   	//                                                                      //
38   	//////////////////////////////////////////////////////////////////////////
39   	
40   	#ifndef ROOT_TString
41   	#include "TString.h"
42   	#endif
43   	
44   	class TList;
45   	class TObject;
46   	class TQConnection;
47   	class TClass;
48   	
49   	class TQObject {
50   	
51   	friend class TQConnection;
52   	
53   	protected:
54   	   TList   *fListOfSignals;        //! list of signals from this object
55   	   TList   *fListOfConnections;    //! list of connections to this object
56   	   Bool_t   fSignalsBlocked;       //! flag used for suppression of signals
57   	
58   	   static Bool_t fgAllSignalsBlocked;  // flag used for suppression of all signals
59   	
60   	   virtual void       *GetSender() { return this; }
61   	   virtual const char *GetSenderClassName() const { return ""; }
62   	
63   	   static Bool_t ConnectToClass(TQObject *sender,
64   	                                const char *signal,
65   	                                TClass *receiver_class,
66   	                                void *receiver,
67   	                                const char *slot);
68   	
69   	   static Bool_t ConnectToClass(const char *sender_class,
70   	                                const char *signal,
71   	                                TClass *receiver_class,
72   	                                void *receiver,
73   	                                const char *slot);
74   	
75   	   static Int_t CheckConnectArgs(TQObject *sender,
76   	                                 TClass *sender_class, const char *signal,
77   	                                 TClass *receiver_class, const char *slot);
78   	
79   	private:
80   	   TQObject(const TQObject& tqo);            // not implemented
81   	   TQObject& operator=(const TQObject& tqo); // not implemented
82   	
83   	public:
84   	   TQObject();
85   	   virtual ~TQObject();
86   	
87   	   TList   *GetListOfClassSignals() const;
88   	   TList   *GetListOfSignals() const { return fListOfSignals; }
89   	   TList   *GetListOfConnections() const { return fListOfConnections; }
90   	
91   	   Bool_t   AreSignalsBlocked() const { return fSignalsBlocked; }
92   	   Bool_t   BlockSignals(Bool_t b)
93   	            { Bool_t ret = fSignalsBlocked; fSignalsBlocked = b; return ret; }
94   	
95   	   void  CollectClassSignalLists(TList& list, TClass* cls);
96   	
97   	   void  EmitVA(const char *signal, Int_t nargs, ...);
98   	   void  EmitVA(const char *signal, Int_t nargs, va_list va);
99   	   void  Emit(const char *signal);
100  	   void  Emit(const char *signal, Long_t *paramArr);
101  	   void  Emit(const char *signal, const char *params);
102  	   void  Emit(const char *signal, Double_t param);
103  	   void  Emit(const char *signal, Long_t param);
104  	   void  Emit(const char *signal, Long64_t param);
105  	   void  Emit(const char *signal, Bool_t param)
106  	         { Emit(signal, (Long_t)param); }
107  	   void  Emit(const char *signal, Char_t param)
108  	         { Emit(signal, (Long_t)param); }
109  	   void  Emit(const char *signal, UChar_t param)
110  	         { Emit(signal, (Long_t)param); }
111  	   void  Emit(const char *signal, Short_t param)
112  	         { Emit(signal, (Long_t)param); }
113  	   void  Emit(const char *signal, UShort_t param)
114  	         { Emit(signal, (Long_t)param); }
115  	   void  Emit(const char *signal, Int_t param)
116  	         { Emit(signal, (Long_t)param); }
117  	   void  Emit(const char *signal, UInt_t param)
118  	         { Emit(signal, (Long_t)param); }
119  	   void  Emit(const char *signal, ULong_t param)
120  	         { Emit(signal, (Long_t)param); }
121  	   void  Emit(const char *signal, ULong64_t param)
122  	         { Emit(signal, (Long64_t) param); }
123  	   void  Emit(const char *signal, Float_t param)
124  	         { Emit(signal, (Double_t)param); }
125  	
126  	   Bool_t Connect(const char *signal,
127  	                  const char *receiver_class,
128  	                  void *receiver,
129  	                  const char *slot);
130  	
131  	   Bool_t Disconnect(const char *signal = 0,
132  	                     void *receiver = 0,
133  	                     const char *slot = 0);
134  	
135  	   virtual void   HighPriority(const char *signal_name,
136  	                               const char *slot_name = 0);
137  	
138  	   virtual void   LowPriority(const char *signal_name,
139  	                              const char *slot_name = 0);
140  	
141  	   virtual Bool_t HasConnection(const char *signal_name) const;
142  	   virtual Int_t  NumberOfSignals() const;
143  	   virtual Int_t  NumberOfConnections() const;
144  	   virtual void   Connected(const char * /*signal_name*/) { }
145  	   virtual void   Disconnected(const char * /*signal_name*/) { }
146  	
147  	   virtual void   Destroyed()
148  	                  { Emit("Destroyed()"); }                 // *SIGNAL*
149  	   virtual void   ChangedBy(const char *method)
150  	                  { Emit("ChangedBy(char*)", method); }    // *SIGNAL*
151  	   virtual void   Message(const char *msg)
152  	                  { Emit("Message(char*)", msg); }         // *SIGNAL*
153  	
154  	   static Bool_t  Connect(TQObject *sender,
155  	                          const char *signal,
156  	                          const char *receiver_class,
157  	                          void *receiver,
158  	                          const char *slot);
159  	
160  	   static Bool_t  Connect(const char *sender_class,
161  	                          const char *signal,
162  	                          const char *receiver_class,
163  	                          void *receiver,
164  	                          const char *slot);
165  	
166  	   static Bool_t  Disconnect(TQObject *sender,
167  	                             const char *signal = 0,
168  	                             void *receiver = 0,
169  	                             const char *slot = 0);
170  	
171  	   static Bool_t  Disconnect(const char *class_name,
172  	                             const char *signal,
173  	                             void *receiver = 0,
174  	                             const char *slot = 0);
175  	
176  	   static Bool_t  AreAllSignalsBlocked();
177  	   static Bool_t  BlockAllSignals(Bool_t b);
178  	
179  	   static void    LoadRQ_OBJECT();
180  	
181  	   ClassDef(TQObject,1) //Base class for object communication mechanism
182  	};
183  	
184  	
185  	R__EXTERN void *gTQSender;   // the latest sender object
186  	
187  	class TQObjSender : public TQObject {
188  	
189  	protected:
190  	   void    *fSender;        //delegation object
191  	   TString  fSenderClass;   //class name of delegation object
192  	
193  	   virtual void       *GetSender() { return fSender; }
194  	   virtual const char *GetSenderClassName() const { return fSenderClass; }
195  	
196  	private:
197  	   TQObjSender(const TQObjSender&);            // not implemented
198  	   TQObjSender& operator=(const TQObjSender&); // not implemented
199  	
200  	public:
201  	   TQObjSender() : TQObject(), fSender(0), fSenderClass() { }
202  	   virtual ~TQObjSender() { Disconnect(); }
203  	
204  	   virtual void SetSender(void *sender) { fSender = sender; }
205  	   void SetSenderClassName(const char *sclass = "") { fSenderClass = sclass; }
206  	
207  	   ClassDef(TQObjSender,0) //Used to "delegate" TQObject functionality
208  	                           //to interpreted classes, see also RQ_OBJECT.h
209  	};
210  	
211  	// Global function which simplifies making connections in interpreted
212  	// ROOT session
213  	//
214  	//  ConnectCINT      - connects to interpreter(CINT) command
215  	
216  	extern Bool_t ConnectCINT(TQObject *sender, const char *signal,
217  	                          const char *slot);
218  	
219  	#ifdef G__DICTIONARY
220  	// This include makes it possible to have a single connection
221  	// from all objects of the same class but is only needed in
222  	// the dictionary.
223  	#include "TQClass.h"
224  	#endif
225  	
226  	
227  	//---- ClassImpQ macro ----------------------------------------------
228  	//
229  	// This macro used to correspond to the ClassImp macro and should be used
230  	// for classes derived from TQObject instead of the ClassImp macro.
231  	// This macro makes it possible to have a single connection from
232  	// all objects of the same class.
233  	// *** It is now obsolete ***
234  	
235  	#define ClassImpQ(name) \
236  	   ClassImp(name)
237  	
238  	#endif
239