/** This class can be used as a base class for UNO objects. Itimplementsthecapabilitytobekeptweakly (unoidl.com.sun.star.uno.XWeak)anditimplements unoidl.com.sun.star.lang.XTypeProviderwhichisnecessaryfor usingtheobjectfromStarBasic. Inaddition,itimplementstheinterface unoidl.com.sun.star.lang.XComponenttobedisposedexplicitly.
*/ publicclass WeakComponentBase : WeakBase, XComponent
{ privatedelegatevoid t_disposing( EventObject evt ); private t_disposing m_disposing = null; privatebool m_inDispose = false; privatebool m_disposed = false;
/** Checks whether this object is disposed and throws a DisposedException ifitisalreadydisposed.
*/ protectedvoid checkUnDisposed()
{ if (! isDisposed())
{ thrownew unoidl.com.sun.star.lang.DisposedException( "object already disposed!", this );
}
}
/** Override to perform extra clean-up work. Provided for subclasses. Itiscalledduringdispose()
*/ protectedvoid preDisposing()
{
}
/** Override to become notified right before the disposing action is performed.
*/ protectedvoid postDisposing()
{
}
// XComponent impl /** This method is called by the owner of this object to explicitly disposeit.Thisimplementationofdispose()firstnotifiesthisobject viapreDisposing(),thenallregisteredeventlistenersand finallythisobjectagaincallingpostDisposing().
*/ publicvoid dispose()
{ // Determine in a thread-safe way if this is the first call to this // method. Only then we proceed with the notification of event // listeners. It is an error to call this method more than once. bool doDispose = false;
t_disposing call = null; lock (this)
{ if (! m_inDispose && !m_disposed)
{
call = m_disposing;
m_disposing = null;
m_inDispose = true;
doDispose = true;
}
} // The notification occurs in an unsynchronized block in order to avoid // deadlocks if one of the listeners calls back in a different thread on // a synchronized method which uses the same object. if (doDispose)
{ try
{ // call sub class
preDisposing(); // send disposing notifications to listeners if (null != call)
{
EventObject evt = new EventObject( this );
call( evt );
} // call sub class
postDisposing();
} finally
{ // finally makes sure that the flags are set ensuring // that this function is only called once.
m_disposed = true;
m_inDispose = false;
}
} else
{ // in a multithreaded environment, it can't be avoided, // that dispose is called twice. // However this condition is traced, because it MAY indicate an // error. #if DEBUG
Console.WriteLine( "WeakComponentBase.dispose() - dispose called twice" ); #endif // Debug.Fail( "WeakComponentBase.dispose() - dispose called twice" );
}
} /** Registers an event listener being notified when this object is disposed.
@paramxListenereventlistener
*/ publicvoid addEventListener( XEventListener xListener )
{ booladd; lock (this)
{ add = (! m_inDispose && !m_disposed); if (add)
m_disposing += new t_disposing( xListener.disposing );
} if (! add)
xListener.disposing( new EventObject( this ) );
} /** Revokes an event listener from being notified when this object isdisposed. @paramxListenereventlistener
*/ publicvoid removeEventListener( XEventListener xListener )
{ lock (this)
{ if (! m_inDispose && !m_disposed)
m_disposing -= new t_disposing( xListener.disposing );
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.