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. |