ExtensionsBundle Implementation

Post here questions and problems related to oXygen frameworks/document types.
sebastienlavandier
Posts: 124

ExtensionsBundle Implementation

Wed Nov 20, 2013 11:11 am

Hi,

I need to implement a StyleFilter which must used an AuthorAccess. So, for do that I implemented an CustomExtensionsBundle which extend ExtensionsBundle.

Code: Select all

public class CustomExtensionBundle extends ExtensionsBundle {
    private CustomAuthorExtensionStateListener extensionStateListener = new CustomAuthorExtensionStateListener ();

    @Override
    public String getDocumentTypeID() {
        return "Document type ID";
    }

    @Override
    public String getDescription() {
        return "Description";
    }   

    @Override
    public ro.sync.exml.editor.xmleditor.pageauthor.AuthorDnDListener createAuthorAWTDndListener() {
        return new DragNDropListener();
    }

    @Override
    public StylesFilter createAuthorStylesFilter() {
        return new CustomStylesFilter(extensionStateListener);
    }

    @Override
    public AuthorExtensionStateListener createAuthorExtensionStateListener() {
        return extensionStateListener;
    }
}


This CustomExtensionsBundle instantiate a CustomStylesFilter (which implements StylesFilter) and an AuthorExtensionStateListener (which implements AuthorExtensionStateListener, AuthorAccessProvider).

The Only one reference about this CustomExtensionsBundle is in my .framework file.

Code: Select all

<field name="extensionsBundleClassName">
<String>com.miyCompany.extensionBundle.CustomExtensionBundle</String></field>


But the CustomExtensionBundle is instanciate twice, and I don't understand why.

Do you have an idea about it ?
Thanks in advance for your answer.

Sébastien
alex_jitianu
Posts: 654

Re: ExtensionsBundle Implementation

Wed Nov 20, 2013 11:41 am

Hi Sebastien,

We are aware that the ExtensionsBundle gets instantiated twice on document load and we already have added an issue to fix it. We also have an issue registered to provide the StylesFilter with an AuthorAccess instance. Meanwhile, if you want an AuthorAccess instance in the StylesFilter you can get one like this:

Code: Select all

WSEditor editorAccess =
  PluginWorkspaceProvider.getPluginWorkspace().getCurrentEditorAccess(PluginWorkspace.MAIN_EDITING_AREA);
if (editorAccess != null) {
  WSEditorPage currentPage = editorAccess.getCurrentPage();
  if (currentPage instanceof WSAuthorEditorPage) {
    AuthorAccess authorAccess = ((WSAuthorEditorPage) currentPage).getAuthorAccess();
  }
}



Best regards,
Alex
alex_jitianu
Posts: 654

Re: ExtensionsBundle Implementation

Thu Nov 21, 2013 11:06 am

Hi Sebastien,

I'm just curious, why you need an AuthorAccess object in a StylesFilter? What's the use case?

Best regards,
Alex
sebastienlavandier
Posts: 124

Re: ExtensionsBundle Implementation

Thu Nov 21, 2013 1:28 pm

Hi,

We work with CGM/TIFF illustrations format files in our xml documents, so we need to convert this to SVG format.

When our CustomStyleFilter found an illustration element node Ex:<GRAPHIC>, it must access to the DOCTYPE to find the illustration's filename. And for read the Doctype, we must used : authorAccess.getDocumentController().getDoctype();

With the fileName, we can convert the CGM, or TIF file to SVG.

Do you have a solution without AuhtorAcces ?
Thanks in advance.

Sébastien
Radu
Posts: 6001

Re: ExtensionsBundle Implementation

Thu Nov 21, 2013 2:34 pm

Hi Sébastien,

How exactly does the graphic refer the image? If you are using unparsed entity references you could use the API

Code: Select all

ro.sync.ecss.extensions.api.AuthorDocumentController.getUnparsedEntityUri(AuthorNode, String)


Regards,
Radu
Radu Coravu
<oXygen/> XML Editor
http://www.oxygenxml.com
sebastienlavandier
Posts: 124

Re: ExtensionsBundle Implementation

Thu Nov 21, 2013 5:09 pm

Hi,

Unfortunately in the Style Filter, we have only Styles and AuthorNode

Code: Select all

public Styles filter(Styles styles, AuthorNode authorNode)
.
To use the AuthorDocumentController, we need the AuthorAccess too.

Sébastien
Radu
Posts: 6001

Re: ExtensionsBundle Implementation

Mon Nov 25, 2013 11:10 am

Hi Sébastien,

I understand, we'll see how we can improve the StylesFilter API in a future version. In the meantime you can use Alex's workaround code.

Regards,
Radu
Radu Coravu
<oXygen/> XML Editor
http://www.oxygenxml.com
Radu
Posts: 6001

Re: ExtensionsBundle Implementation

Mon Nov 25, 2013 11:18 am

By the way, if you just want to show an image referenced via an unparsed entity you can also do this via the CSS:

http://www.oxygenxml.com/doc/ug-oxygen/index.html#concepts/dg-unparsed-entity-uri-function.html

Regards,
Radu
Radu Coravu
<oXygen/> XML Editor
http://www.oxygenxml.com
sebastienlavandier
Posts: 124

Re: ExtensionsBundle Implementation

Mon Nov 25, 2013 12:33 pm

Hi,
We already use oxy_unparsed-entity-uri for all supported image file extension by Oxygen. But for the CGM files we don't have solution if we can't use the styleFilter with AuthorAcces.

We are waiting the next version ...

have a nice day.
Sébastien.
Radu
Posts: 6001

Re: ExtensionsBundle Implementation

Mon Nov 25, 2013 1:32 pm

Hi Sébastien,

It's important when asking advice to give more details about the use case, maybe your specific problem can be solved not necessarily using a certain API but by taking a different approach.

I thing you have several other choices, haven't tested them thoroughly but they might work.
Let's say that the CSS is something like:

Code: Select all

imagedata[entityref]{
content: oxy_url(oxy_unparsed-entity-uri(attr(entityref)));
}


First approach:

In the StylesFilter implementation you received a pre-computed Styles object which on the method Styles.getMixedContent() will return an array containing an ro.sync.ecss.css.URIContent pointing to the CGM image. The URIContent.getCatalogExpandedURL() already has the reference to the CGM properly computed going through the unparsed URI mappings. So you could take this URL and create another URIContent object by changing the extension to point to an SVG image instead.

Second approach:

Without any StylesFilter, Oxygen uses the usual Swing libraries to load images, and you can implement a Swing "ImageIO" plugin for CGM images. This plugin would be packed in a JAR which would need to be in the component's class path.

Third approach:

In the CSS you could have something like:

Code: Select all

imagedata[entityref]{
content: oxy_url(oxy_replace(oxy_unparsed-entity-uri(attr(entityref)), '.cgm', '.svg'));
}


By the way, do you use an open source converter for CGM to SVG? We are interested in having better CGM support in Oxygen. Do you know any details about how the XML referencing CGM gets published? If it gets published to HTML does the CGM support need to have an ActiveX control installed in IE in order to show the CGM properly?

Regards,
Radu
Radu Coravu
<oXygen/> XML Editor
http://www.oxygenxml.com
Radu
Posts: 6001

Re: ExtensionsBundle Implementation

Thu Dec 05, 2013 4:51 pm

Hi Sébastien,

Have you tried any of the workarounds I gave you?

Regards,
Radu
Radu Coravu
<oXygen/> XML Editor
http://www.oxygenxml.com

Return to “SDK-API, Frameworks - Document Types”

Who is online

Users browsing this forum: No registered users and 1 guest