Quantcast
Channel: Oracle Bloggers
Viewing all articles
Browse latest Browse all 19780

Savable in Node Based MultiViewElement

$
0
0

Some time ago, Timon Veenstra from Ordina wrote about how to create MultiViewElements for Nodes. A follow up question is... how to enable the Save Action for MultiViewElements that have been created for Nodes?

The constructor of a MultiViewElement always receives a Lookup. But how to add a Saveable object to that Lookup so that the Save Action can become enabled?

My solution is weird, but the only thing that I can think of: put the InstanceContent into the Node's Lookup, i.e., add InstanceContent to InstanceContent:

public class CustomerNode extends BeanNode<Customer> implements Serializable {
    public CustomerNode(Customer bean) throws IntrospectionException {
        this(bean, new InstanceContent());
    }
    private CustomerNode(Customer bean, InstanceContent ic) throws IntrospectionException {
        super(bean, Children.LEAF, new AbstractLookup(ic));
        ic.add(ic);
        setDisplayName(bean.getName());
    }

    @Override
    public Action getPreferredAction() {
        return new AbstractAction("Edit") {
            @Override
            public void actionPerformed(ActionEvent e) {
                TopComponent tc = MultiViews.createMultiView("application/x-customernode", CustomerNode.this);
                tc.open();
                tc.requestActive();
            }
        };
    }

}

Now, in your MultiViewElement, you can get the InstanceContent from the Lookup that you receive in the constructor. That Lookup is defined by the Lookup in the Node. Therefore, because there's an InstanceContent in the Node Lookup (as you can see above), the InstanceContent is now in the MultiViewElement:

@MultiViewElement.Registration(
        displayName = "General",
        mimeType = "application/x-customernode",
        persistenceType = TopComponent.PERSISTENCE_NEVER,
        preferredID = "CustomerNodeGeneralElement",
        position = 100)
public class GeneralPanel extends JPanel implements MultiViewElement {

    private final Lookup lookup;
    private final InstanceContent ic;
    
    public GeneralPanel(Lookup lookup) {
        this.lookup = lookup;
        this.ic = lookup.lookup(InstanceContent.class);
        ...
        ...
        ...

And now, anywhere in the MultiViewElement, you can add/remove the Savable to/from the InstanceContent whenever needed. That will trigger the Save Action to enable/disable itself.


Viewing all articles
Browse latest Browse all 19780

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>