Thanks for the explanation, it finally works ALMOST like a charm.
I encountered some problem with the whole statusChange thing now that I don't only have my buttons in the toolbar but also in the menubar (same commandUrl).

Now what I want is that of course the buttons with the same Command URL listen to the same listener and react to my FeatureStateEvents but that doesn't work. Every new Object gets a new Listener and I can't control the outcome.

Anyone got an idea here?



Carsten Driesner schrieb:
Jimmy wrote:
Thanks for the pointer Carsten. I finally got into it and thought I figured it out but still haven't been able to get it to work. Right now I'm trying to change my DispatchProvider, since all I'm trying to control are my own buttons.

1.) I add a statuslistener when my button "Lesson" gets dispatched, which I can only do in the queryDispatch method:

public XDispatch queryDispatch(URL arg0, String arg1, int arg2) {
       XDispatch xRet = null;
if (arg0.Protocol.compareTo("org.openoffice.addon.Editor:") == 0) {
           if (arg0.Path.compareTo("Lesson") == 0) {
               xRet = this;
               state1 = new StatusListener();
               xRet.addStatusListener(state1, arg0);
           }
       }
       return xRet;
   }

Hi Jimmy,

I think you misunderstood me. The user interface element uses the dispatch object (which you provide with "return xRet") to add ITSELF as listener. Therefore I don't understand your new StatusListener() and addStatusListener statements.

1. A user interface element (implements XStatusListener) knows a command URL
2. It uses interface XDispatchProvider to query for a dispatch object
3. A dispatch provider returns a dispatch object (implements XDispatch) for the command URL 4. The user interface element register itself as listener at the dispatch object!
5. The dispatch object must notify status changes via statusChanged()
6. The user interface element changes it state according to the new status.

The dispatch object has to implement XDispatch. See the following code snippet which show a typical implementation for add/removeStatusListener.

void SAL_CALL BaseDispatch::addStatusListener( const Reference< XStatusListener >& xControl, const URL& aURL ) throw (RuntimeException)
{
    if ( !aURL.Protocol.compareToAscii("vnd.sun.search:") )
    {
        if( !aURL.Path.compareToAscii("command!" ) )
    {
            ::com::sun::star::frame::FeatureStateEvent aEvent;
            aEvent.FeatureURL = aURL;
            aEvent.Source = (::com::sun::star::frame::XDispatch*)this;
            aEvent.IsEnabled = sal_True;
            aEvent.Requery = sal_False;
            sal_Bool bChecked = sal_True;
            aEvent.State <<= bChecked;
            xControl->statusChanged( aEvent );
        }
        aListenerHelper.AddListener( mxFrame, xControl, aURL.Path );
    }
}

void SAL_CALL BaseDispatch::removeStatusListener( const Reference< XStatusListener >& xControl, const URL& aURL ) throw (RuntimeException)
{
    aListenerHelper.RemoveListener( mxFrame, xControl, aURL.Path );
}


2.) Now I try to send a FeatureStateEvent to this listener which should disable the button on clicking it. Nothing happens although the statusChanged method gets called, the button stays enabled.

public void dispatch(URL arg0, PropertyValue[] arg1) {
if (arg0.Path.compareTo("ElmlLesson") == 0) {
FeatureStateEvent aState = new FeatureStateEvent();
               aState.FeatureURL = arg0;
               aState.IsEnabled = false;
               aState.State = Boolean.FALSE;
               state1.statusChanged(aState);

           }
I think it should be clear that your implementation cannot work. The user interface elements needs a statusChanged() call, but currently you call statusChanged() on a object you created yourself. Please implement the whole XDispatch interface (including add/removeStatusListener) and it shall work.

Regards,
Carsten

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to