All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jdplus.toolkit.desktop.plugin.ui.ActiveViewManager Maven / Gradle / Ivy

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jdplus.toolkit.desktop.plugin.ui;

import java.awt.Frame;
import java.util.Collections;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

import org.openide.util.Lookup;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;

/**
 * A hack simulating MDI documents (to be changed ?)
 *
 * @author Jean Palate
 */
public class ActiveViewManager implements Lookup.Provider {

    public static ActiveViewManager getInstance() {
        return INSTANCE;
    }
    private static final ActiveViewManager INSTANCE = new ActiveViewManager();
    private static final String ACTIVE = "_Active_View";
    private static final int POS = 2;
    private boolean updating = false;
    private final InstanceContent content = new InstanceContent();
    private final Lookup lookup;

    private ActiveViewManager() {
        lookup = new AbstractLookup(content);
     }
    
    public boolean isActive(ActiveView view){
        return lookup.lookup(view.getClass()) == view;
    }

    public void set(ActiveView view) {
        if (view == null) {
            content.set(Collections.emptySet(), null);
        } else {
            content.set(Collections.singleton(view), null);
        }
        updateMenu(view);
    }

    private void updateMenu(ActiveView view) {
        JMenu menu = activeMenu();
        if (menu == null) {
            return;
        }
        if (view == null || !view.hasContextMenu()) {
            menu.setVisible(false);
        } else {
            menu.removeAll();
            menu.setVisible(true);
            menu.setText(view.getName());
        }
    }

    private JMenu activeMenu() {
        Frame frame = WindowManager.getDefault().getMainWindow();
        if (frame == null || !(frame instanceof JFrame)) {
            return null;
        }
        JFrame mainWindow = (JFrame) frame;
        JMenuBar menuBar = mainWindow.getJMenuBar();
        if (menuBar == null) {
            return null;
        }
        for (int i = 0; i < menuBar.getMenuCount(); ++i) {
            JMenu cur = menuBar.getMenu(i);
            if (cur != null && ACTIVE.equals(cur.getName())) {
                return cur;
            }
        }
        final JMenu nmenu = new JMenu();
        nmenu.setName(ACTIVE);
        menuBar.add(nmenu, POS);
        menuBar.validate();
        nmenu.addMenuListener(new MenuListener() {
            @Override
            public void menuSelected(MenuEvent e) {
                if (updating) {
                    return;
                }
                nmenu.removeAll();
                ActiveView view = currentView();
                if (view != null && view.hasContextMenu()) {
                    view.fill(nmenu);
                }
            }

            @Override
            public void menuDeselected(MenuEvent e) {
            }

            @Override
            public void menuCanceled(MenuEvent e) {
            }
        });
        return nmenu;
    }

    private void fill(JMenu current) {
        try {
            updating = true;
            TopComponent activated = WindowManager.getDefault().getRegistry().getActivated();
            if (activated != null) {
                ActiveView view = activated instanceof ActiveView ? (ActiveView) activated : activated.getLookup().lookup(ActiveView.class);
                if (view == null) {
                    current.setVisible(false);
                } else {
                    current.removeAll();
                    current.setVisible(true);
                    current.setText(activated.getName());
                }
            } else {
                current.setVisible(false);
            }
        } finally {
            updating = false;
        }
    }

    private ActiveView currentView() {
        return lookup.lookup(ActiveView.class);
    }

    @Override
    public Lookup getLookup() {
        return lookup;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy