/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.esa.snap.rcp.developer; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.util.Lookup; import org.openide.util.LookupEvent; import org.openide.util.LookupListener; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.windows.TopComponent; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; import java.awt.BorderLayout; import java.util.Collection; /** * Displays the state of SNAP's global action context. * * @author Norman Fomferra */ @TopComponent.Description( preferredID = "ActionContextMonitorTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER ) @TopComponent.Registration(mode = "rightSlidingSide", openAtStartup = false, position = 100, roles={"developer"}) @ActionID(category = "Window", id = "org.esa.snap.rcp.developer.ActionContextMonitorTopComponent") @ActionReference(path = "Menu/View/Tool Windows/Developer", position = 10) @TopComponent.OpenActionRegistration( displayName = "#CTL_ActionContextMonitorTopComponentName", preferredID = "ActionContextMonitorTopComponent" ) @NbBundle.Messages({ "CTL_ActionContextMonitorTopComponentName=Action Context Monitor", "CTL_ActionContextMonitorTopComponentDescription=Displays the state of SNAP's global action context.", }) public final class ActionContextMonitorTopComponent extends TopComponent implements LookupListener { private JLabel infoLabel; private JTable infoTable; private Lookup.Result<Object> result; public ActionContextMonitorTopComponent() { initComponents(); setName(Bundle.CTL_ActionContextMonitorTopComponentName()); setToolTipText(Bundle.CTL_ActionContextMonitorTopComponentDescription()); putClientProperty(TopComponent.PROP_MAXIMIZATION_DISABLED, Boolean.TRUE); putClientProperty(TopComponent.PROP_KEEP_PREFERRED_SIZE_WHEN_SLIDED_IN, Boolean.TRUE); } private void initComponents() { setLayout(new BorderLayout(4, 4)); setBorder(new EmptyBorder(4, 4, 4, 4)); infoLabel = new JLabel(""); infoTable = new JTable(); add(infoLabel, BorderLayout.NORTH); add(new JScrollPane(infoTable), BorderLayout.CENTER); } @Override public void resultChanged(LookupEvent lookupEvent) { Collection<? extends Object> selectedObjects = result.allInstances(); if (!selectedObjects.isEmpty()) { Object[][] data = new Object[selectedObjects.size()][3]; int i = 0; for (Object selectedObject : selectedObjects) { data[i][0] = i + 1; data[i][1] = selectedObject.getClass().getSimpleName(); data[i][2] = String.valueOf(selectedObject); i++; } infoLabel.setText(selectedObjects.size() + " objects(s) selected:"); infoTable.setModel(new DefaultTableModel(data, new String[]{"#", "Type", "Name"})); infoTable.getColumnModel().getColumn(0).setPreferredWidth(20); infoTable.getColumnModel().getColumn(1).setPreferredWidth(80); } else { infoLabel.setText("No objects selected."); infoTable.setModel(new DefaultTableModel()); } } @Override public void componentOpened() { result = Utilities.actionsGlobalContext().lookupResult(Object.class); result.addLookupListener(this); } @Override public void componentClosed() { result.removeLookupListener(this); } }