/** * Removes the desktopIcon from its parent and adds its frame to the parent. * * @param f the <code>JInternalFrame</code> to be de-iconified */ public void deiconifyFrame(JInternalFrame f) { JInternalFrame.JDesktopIcon desktopIcon = f.getDesktopIcon(); Container c = desktopIcon.getParent(); JDesktopPane d = f.getDesktopPane(); if (c != null && d != null) { c.add(f); // If the frame is to be restored to a maximized state make // sure it still fills the whole desktop. if (f.isMaximum()) { Rectangle desktopBounds = c.getBounds(); if (f.getWidth() != desktopBounds.width || f.getHeight() != desktopBounds.height) { setBoundsForFrame(f, 0, 0, desktopBounds.width, desktopBounds.height); } } removeIconFor(f); if (f.isSelected()) { f.moveToFront(); f.restoreSubcomponentFocus(); } else { try { f.setSelected(true); } catch (PropertyVetoException e2) { } } } }
/** * Removes the frame from its parent and adds its <code>desktopIcon</code> to the parent. * * @param f the <code>JInternalFrame</code> to be iconified */ public void iconifyFrame(JInternalFrame f) { JInternalFrame.JDesktopIcon desktopIcon; Container c = f.getParent(); JDesktopPane d = f.getDesktopPane(); boolean findNext = f.isSelected(); desktopIcon = f.getDesktopIcon(); if (!wasIcon(f)) { Rectangle r = getBoundsForIconOf(f); desktopIcon.setBounds(r.x, r.y, r.width, r.height); setWasIcon(f, Boolean.TRUE); } if (c == null || d == null) { return; } if (c instanceof JLayeredPane) { JLayeredPane lp = (JLayeredPane) c; int layer = lp.getLayer(f); lp.putLayer(desktopIcon, layer); } // If we are maximized we already have the normal bounds recorded // don't try to re-record them, otherwise we incorrectly set the // normal bounds to maximized state. if (!f.isMaximum()) { f.setNormalBounds(f.getBounds()); } d.setComponentOrderCheckingEnabled(false); c.remove(f); c.add(desktopIcon); d.setComponentOrderCheckingEnabled(true); c.repaint(f.getX(), f.getY(), f.getWidth(), f.getHeight()); if (findNext) { if (d.selectFrame(true) == null) { // The icon is the last frame. f.restoreSubcomponentFocus(); } } }
/** Convenience method to remove the desktopIcon of <b>f</b> is necessary. */ protected void removeIconFor(JInternalFrame f) { JInternalFrame.JDesktopIcon di = f.getDesktopIcon(); Container c = di.getParent(); if (c != null) { c.remove(di); c.repaint(di.getX(), di.getY(), di.getWidth(), di.getHeight()); } }
/** The iconifyFrame() code calls this to determine the proper bounds for the desktopIcon. */ protected Rectangle getBoundsForIconOf(JInternalFrame f) { // // Get the icon for this internal frame and its preferred size // JInternalFrame.JDesktopIcon icon = f.getDesktopIcon(); Dimension prefSize = icon.getPreferredSize(); // // Get the parent bounds and child components. // Container c = f.getParent(); if (c == null) { c = f.getDesktopIcon().getParent(); } if (c == null) { /* the frame has not yet been added to the parent; how about (0,0) ?*/ return new Rectangle(0, 0, prefSize.width, prefSize.height); } Rectangle parentBounds = c.getBounds(); Component[] components = c.getComponents(); // // Iterate through valid default icon locations and return the // first one that does not intersect any other icons. // Rectangle availableRectangle = null; JInternalFrame.JDesktopIcon currentIcon = null; int x = 0; int y = parentBounds.height - prefSize.height; int w = prefSize.width; int h = prefSize.height; boolean found = false; while (!found) { availableRectangle = new Rectangle(x, y, w, h); found = true; for (int i = 0; i < components.length; i++) { // // Get the icon for this component // if (components[i] instanceof JInternalFrame) { currentIcon = ((JInternalFrame) components[i]).getDesktopIcon(); } else if (components[i] instanceof JInternalFrame.JDesktopIcon) { currentIcon = (JInternalFrame.JDesktopIcon) components[i]; } else /* found a child that's neither an internal frame nor an icon. I don't believe this should happen, but at present it does and causes a null pointer exception. Even when that gets fixed, this code protects against the npe. hania */ continue; // // If this icon intersects the current location, get next location. // if (!currentIcon.equals(icon)) { if (availableRectangle.intersects(currentIcon.getBounds())) { found = false; break; } } } if (currentIcon == null) /* didn't find any useful children above. This probably shouldn't happen, but this check protects against an npe if it ever does (and it's happening now) */ return availableRectangle; x += currentIcon.getBounds().width; if (x + w > parentBounds.width) { x = 0; y -= h; } } return (availableRectangle); }