Hi Ariel,

in my case I can reproduce the behavior by double-clicking an image when it 
hasn't been selected before. In this case the image dialog appears every time, 
also my query dispatch with .uno:ImageDialog is called every time… 
addstatuslistener and removestatuslistener are called.

In your implementation you intercept the imageDialog all the time and therefore 
don't need to call its original queryDispatch. I wonder if your implementation 
is still working if you also call the queryDispatch of  .uno:ImageDialog as  in 
my case? Or have you also done that? 

I put the whole implementation of my interceptor below. I changed the 
queryDispatch a little so it looks more like yours and I am only checking for 
imageDialog right now. Besides that my interceptor is instanciated by a 
synchronous jobs at the events onNew and onLoad and as expected my interceptor 
is  registered once when open office starts.
 
//////////////////////////////////////////////////////////////////////////////////////
public class GraphicsInterceptor implements
        XDispatchProviderInterceptor,
        XDispatch {

    private XDispatchProvider slaveDispatchProvider;
    private XDispatchProvider masterDispatchProvider;
    private XDispatch m_xInsertGraphicDispatch;


    // Default constructor
    public GraphicsInterceptor() {
    }

    // com.sun.star.frame.XDispatchProvider:
    public com.sun.star.frame.XDispatch queryDispatch(
            com.sun.star.util.URL aURL,
            String TargetFrameName,
            int SearchFlags) {
        XDispatch xRet = null;
        synchronized (this) {
            if (aURL.Complete.equalsIgnoreCase(".uno:GraphicDialog") ) {

                if (slaveDispatchProvider != null) {
                    m_xInsertGraphicDispatch = 
slaveDispatchProvider.queryDispatch(aURL, TargetFrameName, SearchFlags);
                } else {
                    m_xInsertGraphicDispatch = null;
                }

                return this;
            }
            if (slaveDispatchProvider != null) {
                xRet = slaveDispatchProvider.queryDispatch(aURL, 
TargetFrameName, SearchFlags);

            }
            return xRet;
        }
    }

    @Override
    public XDispatch[] queryDispatches(DispatchDescriptor[] arg0) {
        Log.info("queryDispatches was called");
        return new XDispatch[0];
    }

    @Override
    public void dispatch(URL aURL, PropertyValue[] arg1) {

        if (aURL.Complete.equalsIgnoreCase(".uno:GraphicDialog") || 
aURL.Complete.equalsIgnoreCase(".uno:InsertGraphic")) {
            Document currentDocument = AddOn.getInstance().getCurrentDocument();
            String guid = 
currentDocument.getDocumentHelper().getGuidOfSelectedComponent();
            if (guid != null && guid.startsWith(Constants.ADDON_PREFIX)) {
                Image image = 
currentDocument.getImageByGuid(guid.replace(Constants.ADDON_PREFIX, ""));
                if (image != null) {
                    DialogManager.showDialog(image);
                    return;
                }
            }
        }
        m_xInsertGraphicDispatch.dispatch(aURL, arg1);
    }

    @Override
    public void addStatusListener(XStatusListener xControl, URL aURL) {
    Log.info("addStatusListener was called");
        
}

    @Override
    public void removeStatusListener(XStatusListener arg0, URL arg1) {
        Log.info("removeStatusListener was called");
    }

    @Override
    public XDispatchProvider getSlaveDispatchProvider() {
        return slaveDispatchProvider;

    }

    @Override
    public void setSlaveDispatchProvider(XDispatchProvider arg0) {
        slaveDispatchProvider = arg0;
    }

    @Override
    public XDispatchProvider getMasterDispatchProvider() {
        return masterDispatchProvider;
    }

    @Override
    public void setMasterDispatchProvider(XDispatchProvider arg0) {
        masterDispatchProvider = arg0;
    }
}

thanks!
kind regards,
Fabian



On Feb 6, 2012, at 2:19 PM, Ariel Constenla-Haile wrote:

> Hi Fabian,
> 
> On Mon, Feb 06, 2012 at 11:58:33AM +0100, fabian wrote:
>> Hi,
>> 
>> I am trying to find out if one can override the event when
>> double-clicking on an embedded image within a writer document.  For my
>> extension I would like to embed an image and when double-clicking it
>> I would like to trigger my own action instead of the default "image
>> dialog" which pops up. 
> 
> not that this dialog is shown not only on double-clicking an image:
> 
> - if the image is selected, the "Insert" - "Picture" - "From file..."
>  menu item does not insert a picture but shows the picture properties
>  dialog
> - the same happens with the icon in the "Picture" toolbar
> - if the image is selected, the context menu has a "Picture..." item
>  that triggers the Picture dialog
> - that dialog can be executed using the keyboard instead of the mouse
> - ...
> 
> 
>> 
>> I tried to use com.sun.star.document.XEventListener and
>> com.sun.star.view.XSelectionChangeListener to catch the click event.
>> But so far without success.
>> 
>> Is catching this event even possible via the api?
> 
> IMO it would work better to intercept the commands, with an
> XDispatchProviderInterceptor:
> http://www.openoffice.org/api/docs/common/ref/com/sun/star/frame/XDispatchProviderInterceptor.html
> Just intercept 
> - ".uno:GraphicDialog"
> - ".uno:InsertGraphic"
> and when an image is selected, return your dispatch object in
> queryDispatch().
> 
> This adds an extra level of complexity to your extension, you will have
> to implement an css.task.Job to register your dispatch interceptor.
> http://www.openoffice.org/api/docs/common/ref/com/sun/star/task/Job.html
> http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/WritingUNO/Jobs/Implementation
> 
> IIRC there are examples in the SDK.
> 
> 
> Regards
> -- 
> Ariel Constenla-Haile
> La Plata, Argentina

Reply via email to