/*
* This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com>
* Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/)
*/
/*
* @(#)WFramePeer.java 1.43 03/01/23
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package sun.awt.windows;
import java.util.Vector;
import java.awt.*;
import java.awt.peer.*;
import java.awt.image.ImageObserver;
import sun.awt.image.ImageRepresentation;
import sun.awt.image.IntegerComponentRaster;
import java.awt.image.Raster;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.BufferedImage;
import sun.awt.im.*;
import sun.awt.Win32GraphicsDevice;
import java.awt.image.ColorModel;
class WFramePeer extends WWindowPeer implements FramePeer {
// FramePeer implementation
public native void setState(int state);
public native int getState();
// Convenience methods to save us from trouble of extracting
// Rectangle fields in native code.
private native void setMaximizedBounds(int x, int y, int w, int h);
private native void clearMaximizedBounds();
public void setMaximizedBounds(Rectangle b) {
if (b == null) {
clearMaximizedBounds();
} else {
setMaximizedBounds(b.x, b.y, b.width, b.height);
}
}
boolean isTargetUndecorated() {
return ((Frame)target).isUndecorated();
}
public void reshape(int x, int y, int width, int height) {
Rectangle rect = constrainBounds(x, y, width, height);
if (((Frame)target).isUndecorated()) {
super.reshape(rect.x, rect.y, rect.width, rect.height);
} else {
reshapeFrame(rect.x, rect.y, rect.width, rect.height);
}
}
public Dimension getMinimumSize() {
Dimension d = new Dimension();
if (!((Frame)target).isUndecorated()) {
d.setSize(getSysMinWidth(), getSysMinHeight());
}
if (((Frame)target).getMenuBar() != null) {
d.height += getSysMenuHeight();
}
return d;
}
public void setIconImage(Image im) {
if (im == null) {
setIconImageFromIntRasterData(null, null, 0, 0, 0);
}
else {
int w = getSysIconWidth();
int h = getSysIconHeight();
BufferedImage bimage =
new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = bimage.getGraphics();
try {
if (im instanceof WImage) {
ImageRepresentation ir = ((WImage)im).getImageRep();
ir.reconstruct(ImageObserver.ALLBITS);
}
g.drawImage(im, 0, 0, w, h, null);
} finally {
g.dispose();
}
Raster raster = bimage.getRaster();
DataBuffer buffer = raster.getDataBuffer();
// REMIND: native code should use ScanStride _AND_ width
ColorModel alphaCheck = bimage.getColorModel();
//Create icon mask for transparent icons
//Color icon, so only creating AND mask, not XOR mask
byte iconmask[] = new byte[((w * h) + 7 / 8)];
byte tempAND;
int bufIdx = 0;
int maskIdx = 0;
boolean isTransparent = false;
for (bufIdx = 0, maskIdx = 0; bufIdx < buffer.getSize() &&
maskIdx < iconmask.length; maskIdx++) {
tempAND = 0;
for (int bitIdx = 0; bitIdx < 8 && bufIdx < buffer.getSize();
bitIdx++) {
//This seems wrong - shouldn't it be masked if alpha
//ISN'T 0?
if (alphaCheck.getAlpha(buffer.getElem(bufIdx++)) == 0) {
isTransparent = true;
tempAND |= (byte)0x1;
}
else {
tempAND &= (byte)0xFE;
}
if (bitIdx < 7) {
tempAND = (byte)(tempAND << 1);
}
}
iconmask[maskIdx] = tempAND;
}
if (!isTransparent) {
iconmask = null;
}
int ficW = raster.getWidth();
if (raster instanceof IntegerComponentRaster) {
ficW = ((IntegerComponentRaster)raster).getScanlineStride();
}
setIconImageFromIntRasterData(
((DataBufferInt)buffer).getData(), iconmask,
ficW, raster.getWidth(), raster.getHeight());
}
}
// Note: Because this method calls resize(), which may be overridden
// by client code, this method must not be executed on the toolkit
// thread.
public void setMenuBar(MenuBar mb) {
WMenuBarPeer mbPeer = (WMenuBarPeer) WToolkit.targetToPeer(mb);
setMenuBar0(mbPeer);
updateInsets(insets_);
}
// Note: Because this method calls resize(), which may be overridden
// by client code, this method must not be executed on the toolkit
// thread.
private native void setMenuBar0(WMenuBarPeer mbPeer);
// Toolkit & peer internals
WFramePeer(Frame target) {
super(target);
InputMethodManager imm = InputMethodManager.getInstance();
String menuString = imm.getTriggerMenuString();
if (menuString != null)
{
pSetIMMOption(menuString);
}
}
native void createAwtFrame(WComponentPeer parent);
void create(WComponentPeer parent) {
createAwtFrame(parent);
}
void initialize() {
super.initialize();
Frame target = (Frame)this.target;
if (target.getTitle() != null) {
setTitle(target.getTitle());
}
setResizable(target.isResizable());
setState(target.getExtendedState());
Image icon = target.getIconImage();
if (icon != null) {
setIconImage(icon);
}
}
private native void setIconImageFromIntRasterData(int[] rData,
byte[] maskData,
int nScanStride,
int nW, int nH);
private native static int getSysIconWidth();
private native static int getSysIconHeight();
private native static int getSysMenuHeight();
native void pSetIMMOption(String option);
void notifyIMMOptionChange(){
InputMethodManager.getInstance().notifyChangeRequest((Component)target);
}
}