|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.java.swing.plaf.motif; |
|
|
|
import javax.swing.*; |
|
import java.awt.Rectangle; |
|
import java.awt.Dimension; |
|
import java.awt.Insets; |
|
import java.awt.Color; |
|
import java.awt.Graphics; |
|
import java.awt.Component; |
|
import java.awt.Point; |
|
import javax.swing.plaf.*; |
|
import java.io.Serializable; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class MotifDesktopPaneUI extends javax.swing.plaf.basic.BasicDesktopPaneUI |
|
{ |
|
|
|
|
|
public static ComponentUI createUI(JComponent d) { |
|
return new MotifDesktopPaneUI(); |
|
} |
|
|
|
public MotifDesktopPaneUI() { |
|
} |
|
|
|
protected void installDesktopManager() { |
|
desktopManager = desktop.getDesktopManager(); |
|
if(desktopManager == null) { |
|
desktopManager = new MotifDesktopManager(); |
|
desktop.setDesktopManager(desktopManager); |
|
((MotifDesktopManager)desktopManager).adjustIcons(desktop); |
|
} |
|
} |
|
|
|
public Insets getInsets(JComponent c) {return new Insets(0,0,0,0);} |
|
|
|
//////////////////////////////////////////////////////////////////////////////////// |
|
/// DragPane class |
|
|
|
private class DragPane extends JComponent { |
|
public void paint(Graphics g) { |
|
g.setColor(Color.darkGray); |
|
g.drawRect(0, 0, getWidth()-1, getHeight()-1); |
|
} |
|
}; |
|
|
|
//////////////////////////////////////////////////////////////////////////////////// |
|
/// MotifDesktopManager class |
|
|
|
private class MotifDesktopManager extends DefaultDesktopManager implements Serializable, UIResource { |
|
JComponent dragPane; |
|
boolean usingDragPane = false; |
|
private transient JLayeredPane layeredPaneForDragPane; |
|
int iconWidth, iconHeight; |
|
|
|
|
|
public void setBoundsForFrame(JComponent f, int newX, int newY, |
|
int newWidth, int newHeight) { |
|
if(!usingDragPane) { |
|
boolean didResize; |
|
didResize = (f.getWidth() != newWidth || f.getHeight() != newHeight); |
|
Rectangle r = f.getBounds(); |
|
f.setBounds(newX, newY, newWidth, newHeight); |
|
SwingUtilities.computeUnion(newX, newY, newWidth, newHeight, r); |
|
f.getParent().repaint(r.x, r.y, r.width, r.height); |
|
if(didResize) { |
|
f.validate(); |
|
} |
|
} else { |
|
Rectangle r = dragPane.getBounds(); |
|
dragPane.setBounds(newX, newY, newWidth, newHeight); |
|
SwingUtilities.computeUnion(newX, newY, newWidth, newHeight, r); |
|
dragPane.getParent().repaint(r.x, r.y, r.width, r.height); |
|
} |
|
} |
|
|
|
public void beginDraggingFrame(JComponent f) { |
|
usingDragPane = false; |
|
if(f.getParent() instanceof JLayeredPane) { |
|
if(dragPane == null) |
|
dragPane = new DragPane(); |
|
layeredPaneForDragPane = (JLayeredPane)f.getParent(); |
|
layeredPaneForDragPane.setLayer(dragPane, Integer.MAX_VALUE); |
|
dragPane.setBounds(f.getX(), f.getY(), f.getWidth(), f.getHeight()); |
|
layeredPaneForDragPane.add(dragPane); |
|
usingDragPane = true; |
|
} |
|
} |
|
|
|
public void dragFrame(JComponent f, int newX, int newY) { |
|
setBoundsForFrame(f, newX, newY, f.getWidth(), f.getHeight()); |
|
} |
|
|
|
public void endDraggingFrame(JComponent f) { |
|
if(usingDragPane) { |
|
layeredPaneForDragPane.remove(dragPane); |
|
usingDragPane = false; |
|
if (f instanceof JInternalFrame) { |
|
setBoundsForFrame(f, dragPane.getX(), dragPane.getY(), |
|
dragPane.getWidth(), dragPane.getHeight()); |
|
} else if (f instanceof JInternalFrame.JDesktopIcon) { |
|
adjustBoundsForIcon((JInternalFrame.JDesktopIcon)f, |
|
dragPane.getX(), dragPane.getY()); |
|
} |
|
} |
|
} |
|
|
|
public void beginResizingFrame(JComponent f, int direction) { |
|
usingDragPane = false; |
|
if(f.getParent() instanceof JLayeredPane) { |
|
if(dragPane == null) |
|
dragPane = new DragPane(); |
|
JLayeredPane p = (JLayeredPane)f.getParent(); |
|
p.setLayer(dragPane, Integer.MAX_VALUE); |
|
dragPane.setBounds(f.getX(), f.getY(), |
|
f.getWidth(), f.getHeight()); |
|
p.add(dragPane); |
|
usingDragPane = true; |
|
} |
|
} |
|
|
|
public void resizeFrame(JComponent f, int newX, int newY, |
|
int newWidth, int newHeight) { |
|
setBoundsForFrame(f, newX, newY, newWidth, newHeight); |
|
} |
|
|
|
public void endResizingFrame(JComponent f) { |
|
if(usingDragPane) { |
|
JLayeredPane p = (JLayeredPane)f.getParent(); |
|
p.remove(dragPane); |
|
usingDragPane = false; |
|
setBoundsForFrame(f, dragPane.getX(), dragPane.getY(), |
|
dragPane.getWidth(), dragPane.getHeight()); |
|
} |
|
} |
|
|
|
public void iconifyFrame(JInternalFrame f) { |
|
JInternalFrame.JDesktopIcon icon = f.getDesktopIcon(); |
|
Point p = icon.getLocation(); |
|
adjustBoundsForIcon(icon, p.x, p.y); |
|
super.iconifyFrame(f); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
protected void adjustIcons(JDesktopPane desktop) { |
|
|
|
JInternalFrame.JDesktopIcon icon = new JInternalFrame.JDesktopIcon( |
|
new JInternalFrame()); |
|
Dimension iconSize = icon.getPreferredSize(); |
|
iconWidth = iconSize.width; |
|
iconHeight = iconSize.height; |
|
|
|
JInternalFrame[] frames = desktop.getAllFrames(); |
|
for (int i=0; i<frames.length; i++) { |
|
icon = frames[i].getDesktopIcon(); |
|
Point ip = icon.getLocation(); |
|
adjustBoundsForIcon(icon, ip.x, ip.y); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
protected void adjustBoundsForIcon(JInternalFrame.JDesktopIcon icon, |
|
int x, int y) { |
|
JDesktopPane c = icon.getDesktopPane(); |
|
|
|
int maxy = c.getHeight(); |
|
int w = iconWidth; |
|
int h = iconHeight; |
|
c.repaint(x, y, w, h); |
|
x = x < 0 ? 0 : x; |
|
y = y < 0 ? 0 : y; |
|
|
|
|
|
|
|
* to be ssen again.*/ |
|
y = y >= maxy ? (maxy - 1) : y; |
|
|
|
|
|
int lx = (x / w) * w; |
|
int ygap = maxy % h; |
|
int ly = ((y-ygap) / h) * h + ygap; |
|
|
|
|
|
int dx = x - lx; |
|
int dy = y - ly; |
|
|
|
|
|
x = dx < w/2 ? lx: lx + w; |
|
y = dy < h/2 ? ly: ((ly + h) < maxy ? ly + h: ly); |
|
|
|
while (getIconAt(c, icon, x, y) != null) { |
|
x += w; |
|
} |
|
|
|
|
|
if (x > c.getWidth()) { |
|
return; |
|
} |
|
if (icon.getParent() != null) { |
|
setBoundsForFrame(icon, x, y, w, h); |
|
} else { |
|
icon.setLocation(x, y); |
|
} |
|
} |
|
|
|
protected JInternalFrame.JDesktopIcon getIconAt(JDesktopPane desktop, |
|
JInternalFrame.JDesktopIcon icon, int x, int y) { |
|
|
|
JInternalFrame.JDesktopIcon currentIcon = null; |
|
Component[] components = desktop.getComponents(); |
|
|
|
for (int i=0; i<components.length; i++) { |
|
Component comp = components[i]; |
|
if (comp instanceof JInternalFrame.JDesktopIcon && |
|
comp != icon) { |
|
|
|
Point p = comp.getLocation(); |
|
if (p.x == x && p.y == y) { |
|
return (JInternalFrame.JDesktopIcon)comp; |
|
} |
|
} |
|
} |
|
return null; |
|
} |
|
}; /// END of MotifDesktopManager |
|
} |