package org.eclipse.swt.widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.SWTEventListener;
public abstract class Widget {
static final int DISPOSED = 1<<0;
static final int KEYED_DATA = 1<<2;
private EventTable eventTable;
private Display display;
int style;
int state;
Object data;
public Widget(Display display, int style) {
this.display = display;
this.style = style;
createWidget();
initListeners();
}
protected void checkWidget () {
//FIXME Implement
}
public Display getDisplay() {
return display;
}
public int getStyle() {
checkWidget();
return style;
}
protected abstract void createWidget();
public abstract Object internal_getNativeObject();
protected void registerListener(int eventType, Listener listener) {
if (eventTable == null)
eventTable = new EventTable();
eventTable.hook(eventType, listener);
}
protected void unregisterListener(int eventType, SWTEventListener listener) {
if (eventTable == null) return;
eventTable.unhook (eventType, listener);
}
protected void initListeners() {
}
void sendEvent (int eventType, Event event, boolean send) {
if (eventTable == null && !display.filters (eventType)) {
return;
}
if (event == null) event = new Event ();
event.type = eventType;
event.display = display;
event.widget = this;
if (event.time == 0) {
event.time = display.getLastEventTime ();
}
if (send) {
sendEvent (event);
} else {
display.postEvent (event);
}
}
void sendEvent (Event event) {
Display display = event.display;
if (!display.filterEvent (event)) {
if (eventTable != null) eventTable.sendEvent (event);
}
}
protected static String notNullString(String s) {
return s == null ? "" : s;
}
protected void error(int errorNullArgument) {
// FIXME Implement
}
// public void addDisposeListener (DisposeListener listener) {
//
// }
//
public void addListener (int eventType, Listener listener) {
if (eventTable == null) eventTable = new EventTable ();
eventTable.hook (eventType, listener);
}
public void dispose () {
//FIXME Implement
}
public Object getData () {
checkWidget();
return (state & KEYED_DATA) != 0 ? ((Object []) data) [0] : data;
}
public Object getData (String key) {
checkWidget();
if (key == null) error (SWT.ERROR_NULL_ARGUMENT);
if ((state & KEYED_DATA) != 0) {
Object [] table = (Object []) data;
for (int i=1; i<table.length; i+=2) {
if (key.equals (table [i])) return table [i+1];
}
}
return null;
}
//
// public Listener[] getListeners (int eventType) {
//
// }
//
public boolean isDisposed () {
return (state & DISPOSED) != 0;
}
//
// public boolean isListening (int eventType) {
//
// }
//
// public void notifyListeners (int eventType, Event event) {
//
// }
//
// public void removeDisposeListener (DisposeListener listener) {
//
// }
//
// public void removeListener (int eventType, Listener listener) {
//
// }
//
// public void reskin (int flags) {
//
// }
//
public void setData (Object data) {
checkWidget();
if ((state & KEYED_DATA) != 0) {
((Object []) this.data) [0] = data;
} else {
this.data = data;
}
}
public void setData (String key, Object value) {
checkWidget();
if (key == null) error (SWT.ERROR_NULL_ARGUMENT);
int index = 1;
Object [] table = null;
if ((state & KEYED_DATA) != 0) {
table = (Object []) data;
while (index < table.length) {
if (key.equals (table [index])) break;
index += 2;
}
}
if (value != null) {
if ((state & KEYED_DATA) != 0) {
if (index == table.length) {
Object [] newTable = new Object [table.length + 2];
System.arraycopy (table, 0, newTable, 0, table.length);
data = table = newTable;
}
} else {
table = new Object [3];
table [0] = data;
data = table;
state |= KEYED_DATA;
}
table [index] = key;
table [index + 1] = value;
} else {
if ((state & KEYED_DATA) != 0) {
if (index != table.length) {
int length = table.length - 2;
if (length == 1) {
data = table [0];
state &= ~KEYED_DATA;
} else {
Object [] newTable = new Object [length];
System.arraycopy (table, 0, newTable, 0, index);
System.arraycopy (table, index + 2, newTable, index, length - index);
data = newTable;
}
}
}
}
if (key.equals(SWT.SKIN_CLASS) || key.equals(SWT.SKIN_ID)) this.reskin(SWT.ALL);
}
public void reskin (int flags) {
checkWidget ();
reskinWidget ();
if ((flags & SWT.ALL) != 0) reskinChildren (flags);
}
void reskinChildren (int flags) {
}
void reskinWidget() {
// if ((state & SKIN_NEEDED) != SKIN_NEEDED) {
// this.state |= SKIN_NEEDED;
// display.addSkinnableWidget(this);
// }
}
public String toString () {
String string = "*Disposed*"; //$NON-NLS-1$
if (!isDisposed ()) {
string = "*Wrong Thread*"; //$NON-NLS-1$
if (isValidThread ()) string = getNameText ();
}
return getName () + " {" + string + "}"; //$NON-NLS-1$ //$NON-NLS-2$
}
boolean isValidThread () {
return getDisplay ().isValidThread ();
}
protected String getNameText () {
return "";
}
protected String getName () {
String string = getClass ().getName ();
int index = string.lastIndexOf ('.');
if (index == -1) return string;
return string.substring (index + 1, string.length ());
}
}