ausgewähltes Document mittels Utilities.actionsGlobalContext()

Alles zu NetBeans als RCP-Platform

Moderator: wegus

Antworten
Apricum
Beiträge: 1
Registriert: 13.12.2014, 18:25

ausgewähltes Document mittels Utilities.actionsGlobalContext()

Beitrag von Apricum » 13.12.2014, 18:48

Hallo,

im DevFaqTrackGlobalSelection Tutorial im NetbeansWiki findet man folgendes Beispiel

Code: Alles auswählen

Lookup.Result res = Utilities.actionsGlobalContext().lookupResult (SomeApiClass.class);
res.addLookupListener (new LookupListener() {
   public void resultChanged (LookupEvent evt) {
     Collection c = ((Lookup.Result) evt.getSource()).allInstances();
     //do something with the collection of 0 or more instances - the collection has changed
   }
});
Versuche ich nun Folgendes

Code: Alles auswählen

Lookup.Result<Document> resFile = Utilities.actionsGlobalContext().lookupResult(Document.class);
    LookupListener thisListener;
    
    public ListenerForChangedEditor() {

        thisListener = new LookupListener() {
            public void resultChanged(LookupEvent evt) {

                if (evt.getSource() == resFile) {


                    Collection<Document> myDocs = ((Lookup.Result) evt.getSource()).allInstances();

                    for (Document a : myDocs) {
                        Document d = a;
                        
                        if(d!= null){
                            LOG.info("DOCUMENT FOUND");
                        }
                    }
                    
                }
           };
      };
                   
                        
      resFile.addLookupListener(thisListener);
                        
                        
                        
so bleibt d immer null und LOG.info wird nie ausgegeben. Verwende ich nicht Document.class, sondern FileObject.class so funktioniert es. Was mache ich falsch?

padde
Beiträge: 96
Registriert: 16.03.2010, 09:21

Re: ausgewähltes Document mittels Utilities.actionsGlobalContext()

Beitrag von padde » 15.12.2014, 12:53

Mir ist noch nicht so ganz klar, zu welchem Zeitpunkt Du überhaupt etwas mit einem Document machen möchtest. Aber generell finde ich es bei so kontextsensitiven Lookup-Geschichten immer interessant, sich mal anzuschauen, was zum gewünschten Zeitpunkt denn überhaupt im globalen Lookup ist und zu schauen, ob dort etwas dabei ist an Objekten, was einem weiter hilft.

Zum Einen kannst Du da deinen Ansatz nutzen und dort einfach nach

Code: Alles auswählen

Utilities.actionsGlobalContext().lookupResult(Object.class)
schauen und Dir einfach mal in einer Schleife die Klassen der einzelnen Objekte ausgeben lassen. Ansonsten kannst Du auch dieses Plugin nutzen, um Dir in einem Extrafenster anzeigen zu lassen, welche Objekte im globalen Lookup sind.

WeserLinux
Beiträge: 89
Registriert: 16.03.2012, 10:46
Wohnort: Niedersachsen

Re: ausgewähltes Document mittels Utilities.actionsGlobalContext()

Beitrag von WeserLinux » 17.12.2014, 11:52

Hallo

Ich habe Dir mal ein AbstractAction Beispiel von mir angehängt, in dem ich Utilities.actionsGlobalContext() nutze und über Lookup.Result<Path> verarbeite. Funktioniert prima. Vielleicht hilft das Beispiel.

In dem Beispiel soll das im Baum selektierte Element<Path> gelöscht werden

Code: Alles auswählen


public final class DeleteAction extends AbstractAction implements LookupListener, ContextAwareAction, Presenter.Popup {

    private Lookup.Result<Path> result;
    private final static String DELETE_TITLE = "Deleting files...";
    private StringBuilder infoText = new StringBuilder(100);

    public DeleteAction() {
        this(Utilities.actionsGlobalContext());
    }

    @SuppressWarnings("LeakingThisInConstructor")
    public DeleteAction(Lookup lookup) {
        super(Bundle.Delete_Name());
        result = lookup.lookupResult(Path.class);
        resultChanged(new LookupEvent(result));
        result.addLookupListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (result != null) {
            Collection<? extends Path> itemsToRemove = result.allInstances();
            if (itemsToRemove.size() == 1) {
                infoText.append("Remove \"").append(itemsToRemove.iterator().next().getFileName().toString()).append("\" permanetly?");
            } else if (itemsToRemove.size() > 1) {
                infoText.append("Do you want to remove ").append(itemsToRemove.size()).append(" items?");
            }
            Confirmation confirm = new NotifyDescriptor.Confirmation(infoText.toString(), DELETE_TITLE, NotifyDescriptor.YES_NO_OPTION);
            DialogDisplayer.getDefault().notify(confirm);
            if (confirm.getValue() == NotifyDescriptor.YES_OPTION) {
                for (Path path : itemsToRemove) {
                    try {
                        if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) {
                            for (Path element : sortedCollection(path)) {
                                Files.deleteIfExists(element);
                            }
                        } else {
                            Files.deleteIfExists(path);
                        }
                    } catch (IOException ex) {
                        Exceptions.printStackTrace(ex);
                    }
                }
            }
        }
    }

    @Override
    public void resultChanged(LookupEvent ev) {
        if (this.result.allInstances().size() > 0) {
            setEnabled(true);
        } else {
            setEnabled(false);
        }
    }

    @Override
    public Action createContextAwareInstance(Lookup actionContext) {
        return new DeleteAction(actionContext);
    }

    @Override
    public JMenuItem getPopupPresenter() {
        return new JMenuItem(this);
    }

    /**
     * Create a sorted collection of tree items recursively
     * @param path
     * @return list of sorted path elements, files at the top, directories below
     */
    private List<Path> sortedCollection(Path path) {...}

    /**
     * Listing of all directory tree elements recursively
     */
    private class TreeElementCollector extends SimpleFileVisitor<Path> {...}
    

    /**
     * Sorting the files to the top, the directories to the bottom
     */
    private class PathComparator implements Comparator<Path> {...}
}


Antworten