/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkplugin.ui.components; import java.awt.Dimension; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; import javax.swing.JWindow; /** * Component to attach itself to a Frame. * * @author Derek DeMoro */ public class SnapWindow extends JWindow implements ComponentListener, WindowListener, FocusListener, MouseMotionListener { private static final long serialVersionUID = -3546188378308911117L; private final JFrame parentFrame; private int preferredWidth = 300; private boolean isActive = false; public SnapWindow(final JFrame parentFrame) { this.parentFrame = parentFrame; parentFrame.addComponentListener(this); parentFrame.addMouseMotionListener(this); parentFrame.addWindowListener(this); adjustWindow(); parentFrame.addFocusListener(this); setFocusableWindowState(false); } public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { } public void componentResized(ComponentEvent componentEvent) { adjustWindow(); } public void componentMoved(ComponentEvent componentEvent) { adjustWindow(); } public void componentShown(ComponentEvent componentEvent) { this.setVisible(true); } public void componentHidden(ComponentEvent componentEvent) { this.setVisible(false); } public void setPreferredWidth(int width) { this.preferredWidth = width; } private void adjustWindow() { if (!parentFrame.isVisible()) { return; } Point mainWindowLocation = parentFrame.getLocationOnScreen(); int x = (int)mainWindowLocation.getX() + parentFrame.getWidth(); final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int width = getWidth(); if (width == 0) { width = preferredWidth; } if ((int)screenSize.getWidth() - width < x) { x = (int)mainWindowLocation.getX() - width; } setSize(preferredWidth, (int)parentFrame.getHeight()); setLocation(x, (int)mainWindowLocation.getY()); } public void close() { parentFrame.removeComponentListener(this); parentFrame.removeWindowListener(this); parentFrame.removeMouseMotionListener(this); dispose(); } public void windowOpened(WindowEvent windowEvent) { } public void windowClosing(WindowEvent windowEvent) { } public void windowClosed(WindowEvent windowEvent) { } public void windowIconified(WindowEvent windowEvent) { setVisible(false); } public void windowDeiconified(WindowEvent windowEvent) { setVisible(true); } public void windowActivated(WindowEvent windowEvent) { if (!isActive) { setVisible(true); toFront(); isActive = true; adjustWindow(); } } public void windowDeactivated(WindowEvent windowEvent) { setVisible(false); isActive = false; } public void mouseDragged(MouseEvent mouseEvent) { adjustWindow(); } public void mouseMoved(MouseEvent mouseEvent) { adjustWindow(); } }