Changeset 533 for kraken-core

Show
Ignore:
Timestamp:
01/22/10 20:00:59 (6 months ago)
Author:
stania
Message:

added support for handling cursor left/right key, home, end key.

Location:
kraken-core
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • kraken-core/pom.xml

    r479 r533  
    99        </parent> 
    1010        <artifactId>kraken-core</artifactId> 
    11         <version>1.2.0</version> 
     11        <version>1.3.0</version> 
    1212        <name>Kraken Core</name> 
    1313        <packaging>jar</packaging> 
     
    3030                        <groupId>org.krakenapps</groupId> 
    3131                        <artifactId>kraken-api</artifactId> 
    32                         <version>1.2.0</version> 
     32                        <version>1.3.0</version> 
    3333                </dependency> 
    3434                <dependency> 
  • kraken-core/src/main/java/org/krakenapps/console/ConsoleController.java

    r464 r533  
    2121 
    2222import org.apache.mina.core.session.IoSession; 
     23import org.krakenapps.ansicode.CursorPosCode; 
    2324import org.krakenapps.ansicode.EraseLineCode; 
     25import org.krakenapps.ansicode.MoveCode; 
    2426import org.krakenapps.ansicode.MoveToCode; 
    2527import org.krakenapps.ansicode.EraseLineCode.Option; 
     
    3436        private ConsoleAutoComplete autoComplete; 
    3537 
     38        private int cursorPos; 
     39 
    3640        public ConsoleController(IoSession session, ConsoleAutoComplete autoComplete) { 
    3741                this.session = session; 
    3842                dataList = new LinkedList<String>(); 
     43                setCursorPos(0); 
    3944                this.autoComplete = autoComplete; 
    4045        } 
     
    4247        public void addCharacter(String character) { 
    4348                if (character.length() > 0 && (character.getBytes()[0] == (byte) 127 || character.getBytes()[0] == (byte) 8)) { 
    44                         eraseCharacter(character); 
     49                        eraseCharacter(character, false); 
     50                        try { 
     51                                throw new Exception("asdf"); 
     52                        } catch (Exception e) { 
     53                                // TODO Auto-generated catch block 
     54                                e.printStackTrace(); 
     55                        } 
    4556                } else if (character.equals("\t")) { 
    4657                        String input = peekLine(); 
    4758                        doAutoCompletion(input); 
    4859                } else if (character.equals("\n")) { 
    49                         dataList.add(character); 
    5060                        hasLine = true; 
    5161 
    52                         if (isEchoOn()) 
     62                        if (isEchoOn()) { 
     63                                dataList.addLast("\r"); 
     64                                dataList.addLast(character); 
     65                                session.write(new EraseLineCode(Option.CursorToEnd)); 
     66                                Iterator<String> i = dataList.listIterator(cursorPos); 
     67                                while (i.hasNext()) 
     68                                        session.write(i.next()); 
     69                        } 
     70                } else { 
     71                        if (character.equals("\r")) 
     72                                return; 
     73                        dataList.add(cursorPos, character); 
     74                        increaseCursorPos(); 
     75                        if (isEchoOn()) { 
     76                                session.write(new EraseLineCode(Option.CursorToEnd)); 
    5377                                session.write(character); 
    54                 } else { 
    55                         dataList.add(character); 
    56                         if (isEchoOn()) 
    57                                 session.write(character); 
     78                                session.write(new CursorPosCode(CursorPosCode.Option.Save)); 
     79                                Iterator<String> i = dataList.listIterator(cursorPos); 
     80                                while (i.hasNext()) 
     81                                        session.write(i.next()); 
     82                                session.write(new CursorPosCode(CursorPosCode.Option.Restore)); 
     83                        } 
    5884                } 
    5985        } 
     
    76102                        } 
    77103                        for (int i = 0; i < remainingCommonPrefix.length(); ++i) { 
    78                                 dataList.add(Character.toString(remainingCommonPrefix.charAt(i))); 
     104                                dataList.add(cursorPos, Character.toString(remainingCommonPrefix.charAt(i))); 
     105                                increaseCursorPos(); 
    79106                        } 
    80107                } else if (terms.size() == 1) { 
     
    93120                        if (completion.length() > 0) { 
    94121                                for (int i = 0; i < completion.length(); i++) { 
    95                                         dataList.add(completion.charAt(i) + ""); 
     122                                        dataList.add(cursorPos, Character.toString(completion.charAt(i))); 
     123                                        increaseCursorPos(); 
    96124                                } 
    97125                                session.write(completion); 
     
    141169                        return true; 
    142170                } else if (event.isPressed(KeyCode.LEFT)) { 
    143                         arrowKeyHandler.onPressLeft(); 
     171                        boolean handled = arrowKeyHandler.onPressLeft(); 
     172                        if (!handled) { 
     173                                if (decreaseCursorPos()) 
     174                                        session.write(new MoveCode(MoveCode.Direction.Left, 1)); 
     175                        } 
    144176                        return true; 
    145177                } else if (event.isPressed(KeyCode.RIGHT)) { 
    146                         arrowKeyHandler.onPressRight(); 
    147                         return true; 
    148                 } 
    149                  
     178                        boolean handled = arrowKeyHandler.onPressRight(); 
     179                        if (!handled) { 
     180                                if (increaseCursorPos()) 
     181                                        session.write(new MoveCode(MoveCode.Direction.Right, 1)); 
     182                        } 
     183                        return true; 
     184                } else if (event.isPressed(KeyCode.HOME)) { 
     185                        setCursorPos(0); 
     186                        session.write(new MoveToCode(ConsoleHandler.KRAKEN_PROMPT.length() + 1)); 
     187                        return true; 
     188                } else if (event.isPressed(KeyCode.END)) { 
     189                        setCursorPos(dataList.size()); 
     190                        session.write(new MoveToCode(ConsoleHandler.KRAKEN_PROMPT.length() + 1 + dataList.size())); 
     191                        return true; 
     192                } 
     193 
    150194                return false; 
    151195        } 
     
    158202 
    159203                        String character = dataList.pop(); 
     204                        decreaseCursorPos(); 
    160205                        if (character == null) 
    161206                                break; 
     
    177222        public void setLine(String line) { 
    178223                dataList = new LinkedList<String>(); 
     224                setCursorPos(0); 
    179225                for (int i = 0; i < line.length(); ++i) { 
    180                         dataList.add(new String(new char[] { line.charAt(i) })); 
     226                        dataList.add(cursorPos, new String(new char[] { line.charAt(i) })); 
     227                        increaseCursorPos(); 
    181228                } 
    182229 
    183230                revertLine(); 
    184                 if(line.length() > 0) 
     231                if (line.length() > 0) 
    185232                        session.write(line); 
    186233        } 
    187234 
    188         public void eraseCharacter(String character) { 
     235        public void eraseCharacter(String character, boolean isDelete) { 
    189236                if (dataList.isEmpty()) 
    190237                        return; 
    191238 
    192                 session.write("\r"); 
    193                 dataList.removeLast(); 
    194  
    195                 session.write(new EraseLineCode(Option.EntireLine)); 
    196                 session.write("kraken> "); 
    197  
    198                 String rewrite = peekLine(); 
    199                 if (rewrite.length() > 0) 
    200                         session.write(rewrite); 
     239                if (isDelete) { 
     240                        if (cursorPos == dataList.size()) 
     241                                return; 
     242                        dataList.remove(cursorPos); 
     243                } else { 
     244                        if (cursorPos == 0) 
     245                                return; 
     246                        dataList.remove(cursorPos - 1); 
     247                        decreaseCursorPos(); 
     248                        session.write(new MoveCode(MoveCode.Direction.Left, 1)); 
     249                } 
     250 
     251                 
     252                session.write(new EraseLineCode(Option.CursorToEnd)); 
     253                session.write(new CursorPosCode(CursorPosCode.Option.Save)); 
     254                Iterator<String> i = dataList.listIterator(cursorPos); 
     255                while (i.hasNext()) 
     256                        session.write(i.next()); 
     257                session.write(new CursorPosCode(CursorPosCode.Option.Restore)); 
    201258        } 
    202259 
     
    220277                this.arrowKeyHandler = arrowKeyHandler; 
    221278        } 
    222          
     279 
    223280        public TelnetArrowKeyHandler getArrowKeyHandler() { 
    224281                return this.arrowKeyHandler; 
    225282        } 
     283 
     284        private void setCursorPos(int newPos) { 
     285                cursorPos = newPos; 
     286        } 
     287 
     288        private boolean increaseCursorPos() { 
     289                if (cursorPos + 1 <= dataList.size()) { 
     290                        cursorPos++; 
     291                        return true; 
     292                } else 
     293                        return false; 
     294        } 
     295 
     296        private boolean decreaseCursorPos() { 
     297                if (cursorPos - 1 >= 0) { 
     298                        cursorPos--; 
     299                        return true; 
     300                } else 
     301                        return false; 
     302        } 
    226303} 
  • kraken-core/src/main/java/org/krakenapps/console/ConsoleHandler.java

    r513 r533  
    120120                                        controller.setLine(""); 
    121121                                        break; 
     122                                case DELETE: 
     123                                        controller.eraseCharacter("", true); 
     124                                        break; 
     125                                case BACKSPACE: 
     126                                        controller.eraseCharacter("", false); 
     127                                        break; 
    122128                                } 
    123129                        } 
  • kraken-core/src/main/java/org/krakenapps/console/ConsoleHistoryManager.java

    r513 r533  
    4343                Up, Down, Right, Left 
    4444        } 
    45  
     45         
    4646        @Override 
    47         public void onPressUp() { 
     47        public boolean onPressUp() { 
    4848                boolean hasBeenEditing = index == -1; 
    4949                String line = previousLine(); 
    5050                if (line == null) 
    51                         return; 
     51                        return true; 
    5252 
    5353                if (hasBeenEditing) { 
     
    5959                } 
    6060 
     61                setLine(line); 
     62                return true; 
     63        } 
     64 
     65        private void setLine(String line) { 
    6166                consoleController.setLine(line); 
    6267        } 
    6368 
    6469        @Override 
    65         public void onPressDown() { 
     70        public boolean onPressDown() { 
    6671                boolean hasBeenEditing = index == -1; 
    6772                if (hasBeenEditing) 
    68                         return; 
     73                        return true; 
    6974 
    7075                String line = nextLine(); 
    7176                if (line == null) 
    72                         return; 
     77                        return true; 
    7378 
    74                 consoleController.setLine(line); 
     79                setLine(line); 
     80                return true; 
    7581        } 
    7682 
    7783        @Override 
    78         public void onPressLeft() { 
     84        public boolean onPressLeft() { 
     85                return false; 
    7986        } 
    8087 
    8188        @Override 
    82         public void onPressRight() { 
     89        public boolean onPressRight() { 
     90                return false; 
    8391        } 
    8492 
    8593        @Override 
    86         public void OnPressOtherKeys() { 
     94        public boolean OnPressOtherKeys() { 
    8795                resetIndex(); 
     96                return true; 
    8897        } 
    8998 
  • kraken-core/src/main/java/org/krakenapps/console/TelnetArrowKeyHandler.java

    r464 r533  
    1717 
    1818public interface TelnetArrowKeyHandler { 
    19         public void onPressUp(); 
    20         public void onPressDown(); 
    21         public void onPressLeft(); 
    22         public void onPressRight(); 
    23         public void OnPressOtherKeys(); 
     19        public boolean onPressUp(); 
     20        public boolean onPressDown(); 
     21        public boolean onPressLeft(); 
     22        public boolean onPressRight(); 
     23        public boolean OnPressOtherKeys(); 
    2424} 
  • kraken-core/src/main/java/org/krakenapps/console/TelnetStateMachine.java

    r464 r533  
    3333        private ProtocolDecoderOutput out; 
    3434        private byte lastByte; 
     35        private byte ansiPriorChar; 
    3536 
    3637        private enum State { 
     
    8283                case 'D': 
    8384                        out.write(new FunctionKeyEvent(KeyCode.LEFT)); 
     85                        state = State.Data; 
     86                        break; 
     87                case '3': 
     88                case '1': 
     89                case '4': 
     90                        ansiPriorChar = b; 
     91                        state = State.AnsiEscape; 
     92                        break; 
     93                case '~': 
     94                        switch (ansiPriorChar) { 
     95                        case '3': 
     96                                out.write(new FunctionKeyEvent(KeyCode.DELETE)); 
     97                                break; 
     98                        case '1': 
     99                                out.write(new FunctionKeyEvent(KeyCode.HOME)); 
     100                                break; 
     101                        case '4': 
     102                                out.write(new FunctionKeyEvent(KeyCode.END)); 
     103                                break; 
     104                        }                                
     105                        ansiPriorChar = '\0'; 
    84106                        state = State.Data; 
    85107                        break; 
     
    157179                else if (ch == (char) 21) 
    158180                        out.write(new FunctionKeyEvent(KeyCode.CTRL_U)); 
     181                else if (ch == (char) 127 || ch == (char) 8) 
     182                        out.write(new FunctionKeyEvent(KeyCode.BACKSPACE)); 
    159183                else 
    160184                        out.write(character); 
  • kraken-core/src/main/java/org/krakenapps/script/batch/BatchScript.java

    r506 r533  
    117117                        manager.execute(context, args[0], stopOnFail); 
    118118                } catch (Exception e) { 
    119                         context.println("batch failed: ", e.toString()); 
     119                        context.println("batch failed: %s", e.toString()); 
    120120                } 
    121121        }