Milán Major

netscape-revival

1 branch
Code

sun-java/classsrc/sun/awt/macos/MListPeer.java

package sun.awt.macos;

import java.awt.*;
import java.awt.peer.*;

class MListPeer extends MComponentPeer implements ListPeer, ActionComponent {

	MListPeer(List target) {
		super(target);
	}
    
    native void create(MComponentPeer parent);

	void initialize() {
    
		List li = (List)target;
		
		/* add any items that were already inserted in the target. */
		int  nitems = li.countItems();
		for (int i = 0; i < nitems; i++) {
		    addItem(li.getItem(i), -1);
		}
	
		/* set whether this list should allow multiple selections. */
		setMultipleSelections(li.allowsMultipleSelections());
	
		/* make the visible position visible. */
		int index = li.getVisibleIndex();
		if (index >= 0) {
		    makeVisible(index);
		}
	
		/* select the item if necessary. */
		int sel[] = li.getSelectedIndexes();
		for (int i = 0 ; i < sel.length ; i++) {
		    select(sel[i]);
		}
	
		super.initialize();

    }

    public native void setMultipleSelections(boolean v);
    public native boolean isSelected(int index);
    public native void addItem(String item, int index);
    public native void delItems(int start, int end);
    public native void select(int index);
    public native void deselect(int index);
    public native void makeVisible(int index);

	public void clear() {
		List l = (List)target;
		delItems(0, l.countItems());
	}

    public int[] getSelectedIndexes() {
    
		List l = (List)target;
		int len = l.countItems();
		int sel[] = new int[len];
		int nsel = 0;
		for (int i = 0 ; i < len ; i++) {
			if (isSelected(i)) {
				sel[nsel++] = i;
			}
		}
		int selected[] = new int[nsel];	
		System.arraycopy(sel, 0, selected, 0, nsel);
		return selected;
		
	}

    public void action(int index) {
    
		List l = (List)target;
		l.select(index);
		target.postEvent(new Event(target, Event.ACTION_EVENT, l.getItem(index)));

    }

    public void action(boolean refcon) {
		System.err.println("Internal AWT error");
	}
	
    public void action() {
		System.err.println("Internal AWT error");
	}

	public void handleAction(int inFlags) {
    	InterfaceThread.postInterfaceEvent(target, inFlags);
	}

    public void handleListChanged(int index) {
    
		int selected[] = ((List)target).getSelectedIndexes();
		boolean isSelected = false;

		for (int i=0; i < selected.length; i++) {
			if (index == selected[i]) {
				isSelected = true;
				break;
			}
		}
		if (isSelected) {
 		    InterfaceThread.postInterfaceEvent(InterfaceEvent.LIST_SELECT, target, index);
		} else {
		    if (((List)target).allowsMultipleSelections())
 		    	InterfaceThread.postInterfaceEvent(InterfaceEvent.LIST_DESELECT, target, index);
		}

	}

    public Dimension minimumSize() {
		return minimumSize(4);
    }
    
    public Dimension preferredSize(int v) {	
    	return minimumSize(v);
    }
    
    public Dimension minimumSize(int v) {
		FontMetrics fm = getFontMetrics(target.getFont());
		return new Dimension(20 + fm.stringWidth("0123456789abcde"), (fm.getHeight() + 2) * v + 11);
    }

}