|
From: <ls...@us...> - 2007-03-08 21:07:32
|
Revision: 3135
http://jnode.svn.sourceforge.net/jnode/?rev=3135&view=rev
Author: lsantha
Date: 2007-03-08 13:07:31 -0800 (Thu, 08 Mar 2007)
Log Message:
-----------
Added suupport for console stacking.
Modified Paths:
--------------
trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java
trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsole.java
trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsoleManager.java
trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java
Modified: trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java
===================================================================
--- trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java 2007-02-27 15:39:33 UTC (rev 3134)
+++ trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java 2007-03-08 21:07:31 UTC (rev 3135)
@@ -22,6 +22,7 @@
package org.jnode.driver.console;
import java.util.Set;
+import java.io.PrintStream;
import org.jnode.driver.input.KeyboardListener;
import org.jnode.driver.input.PointerListener;
@@ -101,18 +102,21 @@
public void setParent(ConsoleManager parent);
/**
- * Option constants for use in {@link #createConsole(String, int)}
+ * Option constants for use in {@link org.jnode.driver.console.ConsoleManager#createConsole(String, int)}
* @author Ewout Prangsma (ep...@us...)
*/
public static final class CreateOptions {
- /** Create a text console */
+ /** Create a text console. */
public static final int TEXT = 0x01;
- /** Create a scrollable console */
+ /** Create a scrollable console. */
public static final int SCROLLABLE = 0x02;
- /** Do not claim System.out, err, in when focused */
+ /** Do not claim System.out, err, in when focused. */
public static final int NO_SYSTEM_OUT_ERR_IN = 0x04;
+
+ /** Stack console on the current screen */
+ public static final int STACKED = 0x08;
}
/**
@@ -122,4 +126,6 @@
* @return
*/
public Console createConsole(String name, int options);
+
+ public void printConsoles(PrintStream ps);
}
Modified: trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsole.java
===================================================================
--- trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsole.java 2007-02-27 15:39:33 UTC (rev 3134)
+++ trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsole.java 2007-03-08 21:07:31 UTC (rev 3135)
@@ -256,6 +256,8 @@
public void setAcceleratorKeyCode(int keyCode) {
this.acceleratorKeyCode = keyCode;
+ if(mgr instanceof AbstractConsoleManager)
+ ((AbstractConsoleManager)mgr).restack(this);
}
public int getAcceleratorKeyCode() {
Modified: trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsoleManager.java
===================================================================
--- trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsoleManager.java 2007-02-27 15:39:33 UTC (rev 3134)
+++ trunk/core/src/driver/org/jnode/driver/console/spi/AbstractConsoleManager.java 2007-03-08 21:07:31 UTC (rev 3135)
@@ -22,14 +22,9 @@
package org.jnode.driver.console.spi;
import java.awt.event.InputEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
+import java.awt.event.KeyEvent;
+import java.util.*;
+import java.io.PrintStream;
import javax.naming.NameNotFoundException;
@@ -77,13 +72,16 @@
private AbstractConsoleManager parent;
+ private final Map<Integer, Stack<Console>> stackMap = new HashMap<Integer, Stack<Console>>();
+ private Stack<Console> currentStack;
+
/**
* Initialize a new instance
*/
public AbstractConsoleManager()
throws ConsoleException {
try {
- devMan = (DeviceManager) InitialNaming.lookup(DeviceManager.NAME);
+ devMan = InitialNaming.lookup(DeviceManager.NAME);
openInput(devMan);
} catch (NameNotFoundException ex) {
throw new ConsoleException("DeviceManager not found", ex);
@@ -93,7 +91,7 @@
protected final void initializeKeyboard(Device kbDev) {
try {
- this.kbApi = (KeyboardAPI) kbDev.getAPI(KeyboardAPI.class);
+ this.kbApi = kbDev.getAPI(KeyboardAPI.class);
this.kbApi.addKeyboardListener(this);
} catch (ApiNotFoundException ex) {
BootLog.error("KeyboardAPI not found", ex);
@@ -195,15 +193,54 @@
}
}
- public Console getConsoleByAccelerator(int keyCode) {
- for (Console console : consoles.values()) {
- if (console.getAcceleratorKeyCode() == keyCode) {
- return console;
+ public void printConsoles(PrintStream ps) {
+ ArrayList<Integer> list = new ArrayList<Integer>();
+ list.addAll(stackMap.keySet());
+ Collections.sort(list);
+ for(Integer key : list){
+ ps.println("Screen of " + KeyEvent.getKeyText(key) + ":");
+ Stack<Console> stack = stackMap.get(key);
+ int t_ind = stack.size();
+ for(int i = t_ind; i-- > 0;){
+ Console console = stack.get(i);
+ String prefix = console == current ? " > " :
+ i == t_ind - 1? " * " : " ";
+ ps.println(prefix + console.getConsoleName());
}
}
+ }
+
+ public Console getConsoleByAccelerator(int keyCode) {
+ Stack<Console> stack = stackMap.get(keyCode);
+ if(stack != null && !stack.empty()){
+ currentStack = stack;
+ return stack.peek();
+ }
+
return null;
}
+ protected void setAccelerator(Console console) {
+ for (int i = 0; i < 12; i++) {
+ final int keyCode = KeyEvent.VK_F1 + i;
+ Stack<Console> stack = stackMap.get(keyCode);
+ if (stack == null) {
+ stack = new Stack<Console>();
+ }
+
+ if (stack.empty()){
+ stackMap.put(keyCode, stack);
+ stack.push(console);
+ currentStack = stack;
+ return;
+ }
+ }
+ }
+
+ protected void stackConsole(Console console){
+ if(currentStack != null) currentStack.push(console);
+ }
+
/**
* Just keeping track of the One previous console will lead to lots of
* problems. We need a stack, at least. Currently it is the client's
@@ -219,13 +256,56 @@
if (current == console) {
console.focusLost(new FocusEvent(FocusEvent.FOCUS_LOST));
}
+
consoles.remove(console.getConsoleName());
+ if(currentStack != null && currentStack.peek() == console) {
+ currentStack.pop();
+ if(!currentStack.empty()) {
+ current = currentStack.peek();
+ focus(current);
+ } else {
+ Integer last_key = null;
+ for(Iterator<Map.Entry<Integer, Stack<Console>>> it = stackMap.entrySet().iterator(); it.hasNext(); ){
+ Map.Entry<Integer, Stack<Console>> entry = it.next();
+ if(entry.getValue().equals(currentStack)){
+ last_key = entry.getKey();
+ it.remove();
+ break;
+ }
+ }
+ if(!stackMap.isEmpty()){
+ Integer new_key = null;
+ List<Integer> keys = new ArrayList<Integer>(stackMap.keySet());
+ Collections.sort(keys);
+ if(last_key == null){
+ new_key = keys.get(0);
+ } else {
+ Collections.reverse(keys);
+ for(Integer k : keys){
+ if(k < last_key){
+ new_key = k;
+ break;
+ }
+ }
+ if(new_key == null){
+ new_key = keys.get(keys.size() - 1);
+ }
+ }
+
+ currentStack = stackMap.get(new_key);
+ current = currentStack.peek();
+ focus(current);
+ }
+ }
+ }
+
if (current == console) {
current = null;
if (!consoles.isEmpty()) {
- focus((Console)consoles.values().iterator().next());
+ focus(consoles.values().iterator().next());
}
}
+
if(parent != null && consoles.isEmpty()){
handleFocus();
}
@@ -320,6 +400,36 @@
this.parent = (AbstractConsoleManager) parent;
}
+ void restack(final AbstractConsole console){
+ int accel = console.getAcceleratorKeyCode();
+ if(accel == 0) return;
+
+ //remove console
+ for(Iterator<Integer> iter = stackMap.keySet().iterator(); iter.hasNext(); ){
+ Integer key = iter.next();
+ if(key == accel)
+ return; //no restack needed
+
+ Stack<Console> stack = stackMap.get(key);
+ if(stack.contains(console)){
+ stack.remove(console);
+
+ if(stack.empty())
+ iter.remove();
+
+ break;
+ }
+ }
+
+ //add the console to the specified screen
+ Stack<Console> stack = stackMap.get(accel);
+ if(stack == null){
+ stack = new Stack<Console>();
+ stackMap.put(accel, stack);
+ }
+ stack.push(console);
+ }
+
/**
* This listener looks for registration of a keyboard device.
*
@@ -349,5 +459,4 @@
}
}
}
-
}
Modified: trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java
===================================================================
--- trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java 2007-02-27 15:39:33 UTC (rev 3134)
+++ trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java 2007-03-08 21:07:31 UTC (rev 3135)
@@ -68,8 +68,13 @@
final TextScreen screen;
screen = tsm.getSystemScreen().createCompatibleBufferScreen();
console = new TextScreenConsole(this, name, screen, options);
- }
- setAccelerator(console);
+ }
+ if ((options & CreateOptions.STACKED) != 0){
+ stackConsole(console);
+ } else {
+ setAccelerator(console);
+ }
+
registerConsole(console);
return console;
} else {
@@ -102,14 +107,16 @@
}
}
}
-
- private void setAccelerator(Console console) {
+
+ /*
+ protected void setAccelerator(Console console) {
for (int i = 0; i < 12; i++) {
final int keyCode = KeyEvent.VK_F1 + i;
if (getConsoleByAccelerator(keyCode) == null) {
console.setAcceleratorKeyCode(keyCode);
break;
}
- }
+ }
}
+ */
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|