Milán Major

netscape-revival

1 branch
Code

sun-java/classsrc/sun/awt/tiny/TinyToolkit.java

/*
 * @(#)TinyToolkit.java	1.9 95/12/08 Arthur van Hoff
 *
 * Copyright (c) 1995 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */

package sun.awt.tiny;

import java.util.Hashtable;
import java.awt.*;
import java.awt.peer.*;
import java.awt.image.*;
import java.net.URL;
import java.lang.SecurityManager;
import sun.awt.image.FileImageSource;
import sun.awt.image.URLImageSource;
import sun.awt.image.ImageRepresentation;

class TinyInputThread extends Thread {
    TinyInputThread() {
	super("Tiny-AWT-Input");
	start();
    }
    public native void run();
}

class TinyEventThread extends Thread {
    TinyEventThread() {
	super("Tiny-AWT-Event");
	start();
    }
    public native void run();
}

public class TinyToolkit extends Toolkit {
    static {
	SecurityManager.setScopePermission();
	System.loadLibrary("tawt");
    }

    public TinyToolkit() {
	init();
	new TinyInputThread();
	new TinyEventThread();
    }

    public native void init();

    /*
     * Create peer objects.
     */

    public WindowPeer createWindow(Window target) {
	return new TinyWindowPeer(target);
    }

    public FramePeer  createFrame(Frame target) {
	return new TinyFramePeer(target);
    }

    public CanvasPeer createCanvas(Canvas target) {
	return new TinyCanvasPeer(target);
    }

    public PanelPeer createPanel(Panel target) {
	return new TinyPanelPeer(target);
    }

    public ButtonPeer createButton(Button target) {
	return new TinyButtonPeer(target);
    }

    public TextFieldPeer createTextField(TextField target) {
	return new TinyTextFieldPeer(target);
    }

    public ChoicePeer createChoice(Choice target) {
	return new TinyChoicePeer(target);
    }

    public LabelPeer createLabel(Label target) {
	return new TinyLabelPeer(target);
    }

    public ListPeer createList(List target) {
	return new TinyListPeer(target);
    }

    public CheckboxPeer createCheckbox(Checkbox target) {
	return new TinyCheckboxPeer(target);
    }

    public ScrollbarPeer createScrollbar(Scrollbar target) {
	return new TinyScrollbarPeer(target);
    }

    public TextAreaPeer createTextArea(TextArea target) {
	return new TinyTextAreaPeer(target);
    }

    public DialogPeer createDialog(Dialog target) {
	return new TinyDialogPeer(target);
    }

    public FileDialogPeer createFileDialog(FileDialog target) {
	throw new InternalError("not implemented");
	//return new FileDialogPeer(target);
    }

    public MenuBarPeer createMenuBar(MenuBar target) {
	return new TinyMenuBarPeer(target);
    }

    public MenuPeer createMenu(Menu target) {
	return new TinyMenuPeer(target);
    }

    public MenuItemPeer createMenuItem(MenuItem target) {
	return new TinyMenuItemPeer(target);
    }

    public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) {
	return new TinyCheckboxMenuItemPeer(target);
    }

    public Dimension getScreenSize() {
	return new Dimension(getScreenWidth(), getScreenHeight());
    }

    static native ColorModel makeColorModel();
    static ColorModel screenmodel;

    static ColorModel getStaticColorModel() {
	if (screenmodel == null) {
	    screenmodel = makeColorModel();
	}
	return screenmodel;
    }

    public ColorModel getColorModel() {
	return getStaticColorModel();
    }

    public native int getScreenResolution();
    native int getScreenWidth();
    native int getScreenHeight();

    public String[] getFontList() {
	// REMIND: return something useful
	String list[] = {"Dialog", "Helvetica", "TimesRoman", "Courier", "Symbol"};
	return list;
    }

    public FontMetrics getFontMetrics(Font font) {
	return TinyFontMetrics.getFontMetrics(font);
    }

    public native void sync();

    static Hashtable imgHash = new Hashtable();

    static synchronized Image getImageFromHash(Toolkit tk, URL url) {
	System.getSecurityManager().checkConnect(url.getHost(), url.getPort());
	Image img = (Image)imgHash.get(url);
	if (img == null) {
	    try {	
		img = tk.createImage(new URLImageSource(url));
		imgHash.put(url, img);
	    } catch (Exception e) {
	    }
	}
	return img;
    }

    static synchronized Image getImageFromHash(Toolkit tk, String filename) {
	System.getSecurityManager().checkRead(filename);
	Image img = (Image)imgHash.get(filename);
	if (img == null) {
	    try {	
		img = tk.createImage(new FileImageSource(filename));
		imgHash.put(filename, img);
	    } catch (Exception e) {
	    }
	}
	return img;
    }

    public Image getImage(String filename) {
	return getImageFromHash(this, filename);
    }

    public Image getImage(URL url) {
	return getImageFromHash(this, url);
    }

    static boolean prepareScrImage(Image img, int w, int h, ImageObserver o) {
	if (w == 0 || h == 0) {
	    return true;
	}
	TinyImage ximg = (TinyImage) img;
	if (ximg.hasError()) {
	    if (o != null) {
		o.imageUpdate(img, ImageObserver.ERROR|ImageObserver.ABORT,
			      -1, -1, -1, -1);
	    }
	    return false;
	}
	if (w < 0) w = -1;
	if (h < 0) h = -1;
	ImageRepresentation ir = ximg.getImageRep(w, h);
	return ir.prepare(o);
    }

    static int checkScrImage(Image img, int w, int h, ImageObserver o) {
	TinyImage ximg = (TinyImage) img;
	int repbits;
	if (w == 0 || h == 0) {
	    repbits = ImageObserver.ALLBITS;
	} else {
	    if (w < 0) w = -1;
	    if (h < 0) h = -1;
	    repbits = ximg.getImageRep(w, h).check(o);
	}
	return ximg.check(o) | repbits;
    }

    public int checkImage(Image img, int w, int h, ImageObserver o) {
	return checkScrImage(img, w, h, o);
    }

    public boolean prepareImage(Image img, int w, int h, ImageObserver o) {
	return prepareScrImage(img, w, h, o);
    }

    public Image createImage(ImageProducer producer) {
	return new TinyImage(producer);
    }
}