package com.eas.client.utils.scalableui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.LayoutManager; import java.awt.Point; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.Popup; import javax.swing.SwingUtilities; /** * * @author Marat */ public class ScalablePopup extends Popup { public class ScalablePopupPanel extends JPanel { Component contentsOwner = null; public boolean allowHide = true; public ScalablePopupPanel(LayoutManager layout) { super(layout); } public JComponent getContents() { if (getComponentCount() > 0 && getComponent(0) != null && getComponent(0) instanceof JComponent) { return (JComponent) getComponent(0); } return null; } Component getContentsOwner() { return contentsOwner; } public void setContentsOwner(Component aContentsOwner) { contentsOwner = aContentsOwner; } } ScalablePopupPanel ppPanel = new ScalablePopupPanel(new BorderLayout()); protected ScalablePopup() { super(); } @Override public void show() { ppPanel.setVisible(true); } @Override public void hide() { if (ppPanel.getContents() instanceof ScalableComboPopup) { ppPanel.setVisible(false); Container cont = ppPanel.getParent(); if (cont != null) { cont.remove(ppPanel); } ppPanel.setContentsOwner(null); } else if (ppPanel.getContents() instanceof JPopupMenu) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ppPanel.setVisible(false); Container cont = ppPanel.getParent(); if (cont != null) { cont.remove(ppPanel); } ppPanel.setContentsOwner(null); } }); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (ppPanel != null) { ppPanel.removeAll(); // to avoid possible memory leaks } } }); } void init4Combo(Component owner, ScalableComboPopup contents, int x, int y) { JScalablePanel scp = ZoomRepaintManager.getPanelContainer(owner); if (scp != null) { ppPanel.removeAll(); ppPanel.add(contents, BorderLayout.CENTER); ppPanel.setPreferredSize(contents.getPreferredSize()); ppPanel.setMinimumSize(contents.getPreferredSize()); ppPanel.setSize(contents.getPreferredSize()); ppPanel.setContentsOwner(owner); Point lpt = new Point(0, owner.getHeight()); lpt = SwingUtilities.convertPoint(owner, lpt, scp.getContentPanel()); ppPanel.setLocation(lpt); scp.getContentPanel().add(ppPanel, 0); scp.getContentPanel().validate(); if (owner instanceof JComboBox && contents instanceof JPopupMenu) { final JComboBox lcombo = (JComboBox) owner; final JPopupMenu lppm = (JPopupMenu) contents; ItemListener itListener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { lppm.setVisible(false); } }); lcombo.removeItemListener(this); } }; lcombo.addItemListener(itListener); } } } void init4Menu(Component owner, JPopupMenu contents, int x, int y) { JScalablePanel scp = ZoomRepaintManager.getPanelContainer(owner); if (scp != null) { ppPanel.removeAll(); ppPanel.add(contents, BorderLayout.CENTER); ppPanel.setPreferredSize(contents.getPreferredSize()); ppPanel.setMinimumSize(contents.getPreferredSize()); ppPanel.setSize(contents.getPreferredSize()); ppPanel.setContentsOwner(owner); Point lpt = new Point(0, 0); if (owner != null && owner instanceof JComponent) { JComponent ljowner = (JComponent) owner; Object propO = ljowner.getClientProperty(JScalablePanel.MOUSE_PRESSED_PT_CLIENT_PROPERTY); if (propO != null && propO instanceof Point) { lpt = (Point) propO; } } lpt = SwingUtilities.convertPoint(owner, lpt, scp.getContentPanel()); ppPanel.setLocation(lpt); scp.getContentPanel().add(ppPanel, 0); scp.getContentPanel().validate(); } } }