Revision: 2783
http://vexi.svn.sourceforge.net/vexi/?rev=2783&view=rev
Author: clrg
Date: 2008-02-02 13:49:07 -0800 (Sat, 02 Feb 2008)
Log Message:
-----------
Surface cleanup
- Add comments and remove dead code
- Reorganise into more logical segments
- Fix bug in Surface where 'alt' key modifier would be left set after an
alt-tab away
Modified Paths:
--------------
trunk/core/org.vexi.core/src/org/vexi/core/Surface.java
Modified: trunk/core/org.vexi.core/src/org/vexi/core/Surface.java
===================================================================
--- trunk/core/org.vexi.core/src/org/vexi/core/Surface.java 2008-01-31
19:00:30 UTC (rev 2782)
+++ trunk/core/org.vexi.core/src/org/vexi/core/Surface.java 2008-02-02
21:49:07 UTC (rev 2783)
@@ -98,8 +98,23 @@
public static Picture scarImage = null;
- // Helper methods for subclasses
////////////////////////////////////////////////////////////
+ // Event Handling Helper methods for subclasses ///////////////////
+
+ protected final void KeyPressed(String key) { new Message("KeyPressed",
JSU.S(key)); }
+ protected final void KeyReleased(String key) { new Message("KeyReleased",
JSU.S(key)); }
+ protected final void Close() { new Message("Close", T, false); }
+ protected final void Minimized(boolean b) { minimized = b; new
Message("Minimized", b ? T : F, false); }
+ protected final void Maximized(boolean b) { maximized = b; new
Message("Maximized", b ? T : F, false); }
+ protected final void Focused(boolean b) {
+ if (!b) { alt = control = shift = false; }
+ new Message("Focused", b ? T : F, false);
+ }
+ protected final void HScroll(int pixels) { new Message("HScroll",
JSU.N(pixels)); }
+ protected final void VScroll(int pixels) { new Message("VScroll",
JSU.N(pixels)); }
+ protected final void HScroll(float lines) { new Message("HScroll",
JSU.N(lines)); }
+ protected final void VScroll(float lines) { new Message("VScroll",
JSU.N(lines)); }
+
protected final void Press(final int button) {
last_press_x = mousex;
last_press_y = mousey;
@@ -108,10 +123,7 @@
else if (button == 2) button2 = true;
else if (button == 3) button3 = true;
- if (button == 1)
- new Message("Press1", T, root);
- else if (button == 2) new Message("Press2", T, root);
- else if (button == 3) {
+ if (button == 3) {
Scheduler.add(new Callable() { public Object run(Object o) throws
JSExn {
Platform.clipboardReadEnabled = true;
try {
@@ -121,7 +133,7 @@
}
return o;
}});
- }
+ } else new
Message(button==1?"Press1":button==2?"Press2":"Press"+button, T);
}
protected final void Release(int button) {
@@ -129,19 +141,14 @@
else if (button == 2) button2 = false;
else if (button == 3) button3 = false;
- if (button == 1) new Message("Release1", T, root);
- else if (button == 2) new Message("Release2", T, root);
- else if (button == 3) new Message("Release3", T, root);
-
+ new
Message(button==1?"Release1":button==2?"Release2":button==3?"Release3":"Release"+button,
T);
if (Platform.needsAutoClick() && Math.abs(last_press_x - mousex) < 5
&& Math.abs(last_press_y - mousey) < 5) Click(button);
last_press_x = Integer.MAX_VALUE;
last_press_y = Integer.MAX_VALUE;
}
protected final void Click(int button) {
- if (button == 1) new Message("Click1", T, root);
- else if (button == 2) new Message("Click2", T, root);
- else if (button == 3) new Message("Click3", T, root);
+ new
Message(button==1?"Click1":button==2?"Click2":button==3?"Click3":"Click"+button,
T);
if (Platform.needsAutoDoubleClick()) {
long now = System.currentTimeMillis();
if (lastClickButton == button && now - lastClickTime < 350)
DoubleClick(button);
@@ -149,18 +156,11 @@
lastClickTime = now;
}
}
-
- // FIXME: handle exceptions etc - better checking of types?
- /** prepare an image for setting it as the icon of this surface */
- protected final void queueSetIcon(JS icon) { this.icon =
Picture.load(icon, seticon); }
- private Callable seticon = new Callable() {
- public Object run(Object o) {
- Log.warn(this, "setting icon");
- setIcon(icon);
- return o;
- }
- };
+ protected final void DoubleClick(int button) {
+ new
Message(button==1?"DoubleClick1":button==2?"DoubleClick2":button==3?"DoubleClick3":"DoubleClick"+button,
T);
+ }
+
/** we enqueue ourselves in the Platform.Scheduler when we have a Move
message to deal with */
private boolean moverScheduled = false;
private Callable mover = new Callable() {
@@ -193,33 +193,79 @@
Scheduler.add(mover);
}
- protected final void HScroll(int pixels) { new Message("HScroll",
JSU.N(pixels), root); }
- protected final void VScroll(int pixels) { new Message("VScroll",
JSU.N(pixels), root); }
- protected final void HScroll(float lines) { new Message("HScroll",
JSU.N(lines), root); }
- protected final void VScroll(float lines) { new Message("VScroll",
JSU.N(lines), root); }
+ // FEATURE: reinstate recycler
+ public class Message implements Callable {
+
+ private JS value;
+ private boolean inputEvent;
+ public String name;
+ Message(String name, JS value) {
+ this(name, value, true);
+ }
+
+ Message(String name, JS value, boolean inputEvent) {
+ this.name = name;
+ this.value = value;
+ this.inputEvent = inputEvent;
+ Scheduler.add(this);
+ }
+
+ public Object run(Object o) throws JSExn {
+ if (!inputEvent) {
+ root.putAndTriggerTraps(JSU.S(name), value);
+ return o;
+ }
+
+ if (name.equals("KeyPressed")) {
+ String value = JSU.toString(this.value);
+ if (value.toLowerCase().endsWith("shift")) shift = true;
else if (shift) value = value.toUpperCase();
+ if (value.toLowerCase().equals("alt")) alt = true;
else if (alt) value = "A-" + value;
+ if (value.toLowerCase().endsWith("control")) control = true;
else if (control) value = "C-" + value;
+ if (value.equals("C-v") || value.equals("A-v"))
Platform.clipboardReadEnabled = true;
+ this.value = JSU.S(value);
+ } else if (name.equals("KeyReleased")) {
+ String value = JSU.toString(this.value);
+ if (value.toLowerCase().equals("alt")) alt = false;
+ else if (value.toLowerCase().equals("control")) control =
false;
+ else if (value.toLowerCase().equals("shift")) shift = false;
+ this.value = JSU.S(value);
+ }
+
+ try { root.tryPropagateEvent(name, value); }
+ finally { Platform.clipboardReadEnabled = false; }
+ return o;
+ }
+ public String toString() { return "Message [name=" + name + ", value="
+ JSU.toString(value) + "]"; }
+ }
+
+
+ // Frame Management ///////////////////////////////////////////////
+
+ // FIXME: handle exceptions etc - better checking of types?
+ /** prepare an image for setting it as the icon of this surface */
+ protected final void queueSetIcon(JS icon) { this.icon =
Picture.load(icon, seticon); }
+ private Callable seticon = new Callable() {
+ public Object run(Object o) {
+ Log.warn(this, "setting icon");
+ setIcon(icon);
+ return o;
+ }
+ };
+
+ public final void setMaximized(boolean b) { if (b != maximized)
_setMaximized(maximized = b); }
+ public final void setMinimized(boolean b) { if (b != minimized)
_setMinimized(minimized = b); }
+
protected boolean firstrender = false;
/** subclasses should invoke this method when the user resizes the window
*/
protected final void SizeChange(int width, int height) {
if (firstrender) return;
+ // FIXME: do this properly i.e. at platform level
// constrain our size as determined by the root box
width = root.maxwidth < width ? root.maxwidth : width;
width = root.minwidth > width ? root.minwidth : width;
height = root.maxheight < height ? root.maxheight : height;
height = root.minheight > height ? root.minheight : height;
- /*
- // the following causes the expanded region to flicker
- // as it 1. resizes (AWT), 2. fills, 3. collapses (setSizes), back to
1.
- int capwidth = width, capheight = height;
- capwidth = root.maxwidth < capwidth ? root.maxwidth : capwidth;
- capwidth = root.minwidth > capwidth ? root.minwidth : capwidth;
- capheight = root.maxheight < capheight ? root.maxheight : capheight;
- capheight = root.minheight > capheight ? root.minheight : capheight;
- if (capwidth != width || capheight != height) {
- //setSize(capwidth, capheight);
- return;
- }
- */
if (pendingWidth == width && pendingHeight == height) return;
pendingWidth = width;
pendingHeight = height;
@@ -233,6 +279,7 @@
private final Callable poschanger = new Callable() {
public Object run(Object o) throws JSExn {
poschangeScheduled = false;
+ // FIXME: remove or fix the following behaviour (push it into the
widgets?)
int sw = Platform.getScreenWidth();
int sh = Platform.getScreenHeight();
int _x, _y;
@@ -285,15 +332,9 @@
setLocation();
}
- private final String[] doubleClick = new String[] { null, "DoubleClick1",
"DoubleClick2", "DoubleClick3" };
- protected final void DoubleClick(int button) { new
Message(doubleClick[button], T, root); }
- protected final void KeyPressed(String key) { new Message("KeyPressed",
JSU.S(key), root); }
- protected final void KeyReleased(String key) { new Message("KeyReleased",
JSU.S(key), root); }
- protected final void Close() { new Message("Close", T, root, false); }
- protected final void Minimized(boolean b) { minimized = b; new
Message("Minimized", b ? T : F, root, false); }
- protected final void Maximized(boolean b) { maximized = b; new
Message("Maximized", b ? T : F, root, false); }
- protected final void Focused(boolean b) { new Message("Focused", b ? T :
F, root, false); }
+ // Core Surface Logic
///////////////////////////////////////////////////////////////////////////////
+
/** refresh handles interacting with the scheduler - it needs
* to be synchronized to prevent scheduled
*/
@@ -311,12 +352,6 @@
return null;
}
- public final void setMaximized(boolean b) { if (b != maximized)
_setMaximized(maximized = b); }
- public final void setMinimized(boolean b) { if (b != minimized)
_setMinimized(minimized = b); }
-
-
- // Other Methods
///////////////////////////////////////////////////////////////////////////////
-
/** Indicates that the Surface is no longer needed */
public final void dispose(boolean quitIfAllSurfacesGone) {
Log.info(this, "disposing " + this);
@@ -441,55 +476,7 @@
}
}
- // FEATURE: reinstate recycler
- public class Message implements Callable {
-
- private Box boxContainingMouse;
- private JS value;
- private boolean inputEvent;
- public String name;
- Message(String name, JS value, Box boxContainingMouse) {
- this(name, value, boxContainingMouse, true);
- }
-
- Message(String name, JS value, Box boxContainingMouse, boolean
inputEvent) {
- this.boxContainingMouse = boxContainingMouse;
- this.name = name;
- this.value = value;
- this.inputEvent = inputEvent;
- Scheduler.add(this);
- }
-
- public Object run(Object o) throws JSExn {
- if (!inputEvent) {
- boxContainingMouse.putAndTriggerTraps(JSU.S(name), value);
- return o;
- }
-
- if (name.equals("KeyPressed")) {
- String value = JSU.toString(this.value);
- if (value.toLowerCase().endsWith("shift")) shift = true;
else if (shift) value = value.toUpperCase();
- if (value.toLowerCase().equals("alt")) alt = true;
else if (alt) value = "A-" + value;
- if (value.toLowerCase().endsWith("control")) control = true;
else if (control) value = "C-" + value;
- if (value.equals("C-v") || value.equals("A-v"))
Platform.clipboardReadEnabled = true;
- this.value = JSU.S(value);
- } else if (name.equals("KeyReleased")) {
- String value = JSU.toString(this.value);
- if (value.toLowerCase().equals("alt")) alt = false;
- else if (value.toLowerCase().equals("control")) control =
false;
- else if (value.toLowerCase().equals("shift")) shift = false;
- this.value = JSU.S(value);
- }
-
- try { boxContainingMouse.tryPropagateEvent(name, value); }
- finally { Platform.clipboardReadEnabled = false; }
- return o;
- }
- public String toString() { return "Message [name=" + name + ", value="
+ JSU.toString(value) + "]"; }
- }
-
-
// Default PixelBuffer implementation
/////////////////////////////////////////////////////////
public static abstract class DoubleBufferedSurface extends Surface
implements PixelBuffer {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Vexi-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn