Console: Improve the rendering and fix bugs 6408, 6819 and 7815 48/4948/5
Calixte DENIZET [Wed, 14 Sep 2011 16:23:08 +0000 (18:23 +0200)]
Change-Id: I6da12c07be5b5ebeb7c5f4b821df7370b2fe6258

scilab/CHANGES_5.4.X
scilab/modules/console/src/java/org/scilab/modules/console/SciConsole.java
scilab/modules/console/src/java/org/scilab/modules/console/SciInputCommandView.java
scilab/modules/console/src/java/org/scilab/modules/console/SciOutputView.java
scilab/modules/console/src/java/org/scilab/modules/console/SciPromptView.java
scilab/modules/console/tests/nonreg_tests/bug_6408.tst [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_6819.tst [new file with mode: 0644]
scilab/modules/console/tests/nonreg_tests/bug_7815.tst [new file with mode: 0644]
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/console/SwingScilabConsole.java

index 908d699..f1d2491 100644 (file)
@@ -738,6 +738,10 @@ Bug fixes:
 * bug 5696 fixed - When SE Linux is enable, disable the error messages for
                    Scilab in the Scilab binary distribution.
 
+* bug 6408 fixed - prompt() removed trailing whites.
+
+* bug 6819 fixed - prompt() interpreted '<...>' as html.
+
 * bug 6875 fixed - test_run() could not run at once on the +3000 tests of
                    Scilab.
 
@@ -757,6 +761,8 @@ Bug fixes:
 
 * bug 7745 fixed - add_demo moved in demo_tools module.
 
+* bug 7815 fixed - tohome() worked too much.
+
 * bug 8086 fixed - Some functions displayed a wrong error message when called
                    without input argument.
 
index 5386437..84ec827 100644 (file)
@@ -83,11 +83,6 @@ public abstract class SciConsole extends JPanel {
     private Console sciConsole;
 
     /**
-     * Flag indicating if the input command vieaw size has been forced to a value by a call to toHome
-     */
-    private boolean inputCommandViewSizeForced;
-
-    /**
      * Value used to get one char from user input (when using [more y or n ?])
      */
     private int userInputValue;
@@ -104,6 +99,8 @@ public abstract class SciConsole extends JPanel {
 
     private boolean atBottom;
 
+    private boolean isToHome;
+
     /**
      * Constructor
      * @param configFilePath the configuration file to use
@@ -200,6 +197,9 @@ public abstract class SciConsole extends JPanel {
                         });
                 }
             });
+
+        sciConsole.invalidate();
+        sciConsole.doLayout();
     }
 
     /**
@@ -224,7 +224,7 @@ public abstract class SciConsole extends JPanel {
      */
     public void scilabLinesUpdate() {
         // Size of the console
-        int outputViewWidth = jSP.getWidth();
+        int outputViewWidth = jSP.getViewport().getExtentSize().width;
 
         // Size of a char
         OutputView outputView = this.getConfiguration().getOutputView();
@@ -254,7 +254,7 @@ public abstract class SciConsole extends JPanel {
      */
     public int getNumberOfLines() {
         // Size of the console
-        int outputViewHeight = jSP.getHeight();
+        int outputViewHeight = jSP.getViewport().getExtentSize().height;
 
         // Size of a char
         OutputView outputView = this.getConfiguration().getOutputView();
@@ -290,6 +290,12 @@ public abstract class SciConsole extends JPanel {
      * Clears the console and the output view
      */
     public void clear() {
+        if (sciConsole.isPreferredSizeSet()) {
+            sciConsole.setPreferredSize(null);
+            sciConsole.invalidate();
+            sciConsole.doLayout();
+        }
+
         try {
             config.getInputCommandViewStyledDocument().remove(0, config.getInputCommandViewStyledDocument().getLength());
         } catch (BadLocationException e) {
@@ -309,6 +315,12 @@ public abstract class SciConsole extends JPanel {
      * @param nbLines the number of lines to be deleted
      */
     public void clear(int nbLines) {
+        if (sciConsole.isPreferredSizeSet()) {
+            sciConsole.setPreferredSize(null);
+            sciConsole.invalidate();
+            sciConsole.doLayout();
+        }
+
         if (nbLines == 0) {
             // Clear the prompt
             config.getInputCommandView().reset();
@@ -347,28 +359,32 @@ public abstract class SciConsole extends JPanel {
      * Puts the prompt in the top left corner of the console
      */
     public void toHome() {
-        Dimension jSPExtSize = jSP.getViewport().getExtentSize();
-        Dimension newDim = new Dimension(jSPExtSize.width - jSP.getVerticalScrollBar().getPreferredSize().width, jSPExtSize.height);
-        ((JTextPane) config.getInputCommandView()).setPreferredSize(newDim);
-        ((JTextPane) config.getInputCommandView()).invalidate();
-        ((JTextPane) config.getInputCommandView()).doLayout();
-        inputCommandViewSizeForced = true;
+        isToHome = true;
     }
 
-    /**
-     * Sets the flags indicating if the input command view has been resize by calling toHome()
-     * @param status the new status
-     */
-    public void setInputCommandViewSizeForced(boolean status) {
-        inputCommandViewSizeForced = status;
-    }
+    public void setToHome() {
+        if (isToHome) {
+            Dimension jSPExtSize = jSP.getViewport().getExtentSize();
+            int caretH = ((SciInputCommandView) config.getInputCommandView()).getCaretHeight();
+            int height = jSPExtSize.height + ((SciPromptView) config.getPromptView()).getParent().getBounds().y - caretH;
+            Dimension newDim = new Dimension(sciConsole.getSize().width, height);
+            sciConsole.setPreferredSize(newDim);
+            sciConsole.invalidate();
+            sciConsole.doLayout();
+            ((SciOutputView) config.getOutputView()).addComponentListener(new ComponentAdapter() {
+                    public void componentResized(ComponentEvent evt) {
+                        if (evt.getComponent().getSize().height >= sciConsole.getSize().height) {
+                            evt.getComponent().removeComponentListener(this);
+                            sciConsole.setPreferredSize(null);
+                            sciConsole.invalidate();
+                            sciConsole.doLayout();
+                        }
+                    }
+                });
 
-    /**
-     * Gets the flags indicating if the input command view has been resize by calling toHome()
-     * @return true if a toHome() call is still affecting the size of the input command view
-     */
-    public boolean getInputCommandViewSizeForced() {
-        return inputCommandViewSizeForced;
+            isToHome = false;
+            jSP.getVerticalScrollBar().getModel().setValue(jSP.getVerticalScrollBar().getModel().getMaximum() - jSP.getVerticalScrollBar().getModel().getExtent());
+        }
     }
 
     /**
@@ -412,8 +428,6 @@ public abstract class SciConsole extends JPanel {
         int nbStatements = 0;
 
         atBottom = true;
-
-        // Display Cursor to show Scilab is busy
         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
         while (nbStatements < linesToExec.length) {
@@ -423,7 +437,6 @@ public abstract class SciConsole extends JPanel {
 
             // Reset command line
             inputParsingManager.reset();
-            promptView.updatePrompt();
 
             // Reset history settings
             config.getHistoryManager().setInHistory(false);
@@ -431,6 +444,7 @@ public abstract class SciConsole extends JPanel {
             // Hide the prompt and command line
             config.getInputCommandView().setEditable(false);
             ((SciInputCommandView) config.getInputCommandView()).getCaret().setVisible(false);
+
             config.getPromptView().setVisible(false);
 
             // Remove the prompt if present at the beginning of the text to execute
index 33fc88e..0437278 100644 (file)
@@ -13,7 +13,9 @@
 
 package org.scilab.modules.console;
 
+import java.awt.Color;
 import java.awt.Component;
+import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.EventQueue;
 import java.awt.FontMetrics;
@@ -36,6 +38,12 @@ import javax.swing.event.CaretListener;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultCaret;
+import javax.swing.text.Element;
+import javax.swing.text.PlainView;
+import javax.swing.text.StyledEditorKit;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
 
 import org.scilab.modules.commons.gui.ScilabCaret;
 import org.scilab.modules.console.utils.ScilabLaTeXViewer;
@@ -51,7 +59,7 @@ import com.artenum.rosetta.util.StringConstants;
  * @author Vincent COUVERT
  * @author Calixte DENIZET
  */
-public class SciInputCommandView extends ConsoleTextPane implements InputCommandView, CaretListener {
+public class SciInputCommandView extends ConsoleTextPane implements InputCommandView, CaretListener, ViewFactory {
 
     private static final long serialVersionUID = 1L;
     private static final String END_LINE = "\n";
@@ -72,11 +80,20 @@ public class SciInputCommandView extends ConsoleTextPane implements InputCommand
     private int width = -1;
     private boolean isLatex;
 
+    private PlainView plainView;
+
     /**
      * Constructor
      */
     public SciInputCommandView() {
         super();
+
+        setEditorKit(new StyledEditorKit() {
+                public ViewFactory getViewFactory() {
+                    return SciInputCommandView.this;
+                }
+            });
+
         setBorder(BorderFactory.createEmptyBorder(TOP_BORDER, 0, BOTTOM_BORDER, 0));
 
         // Input command line is not editable when created
@@ -198,11 +215,10 @@ public class SciInputCommandView extends ConsoleTextPane implements InputCommand
 
                 public void insertUpdate(DocumentEvent e) {
                     // Validates commands if followed by a carriage return
-                    String wholeTxt = console.getConfiguration().getInputParsingManager().getCommandLine();
+                    final String wholeTxt = console.getConfiguration().getInputParsingManager().getCommandLine();
                     if ((e.getLength()) > 1 && (wholeTxt.lastIndexOf(StringConstants.NEW_LINE) == (wholeTxt.length() - 1))) {
                         EventQueue.invokeLater(new Runnable() {
                                 public void run() {
-                                    String wholeTxt = console.getConfiguration().getInputParsingManager().getCommandLine();
                                     console.sendCommandsToScilab(wholeTxt, true, true);
                                 };
                             });
@@ -282,6 +298,10 @@ public class SciInputCommandView extends ConsoleTextPane implements InputCommand
         }
     }
 
+    public int getCaretHeight() {
+        return ((ScilabCaret) getCaret()).height;
+    }
+
     /**
      * Set the height of this text component.
      * @param height the height, -1 to have the natural preferred height
@@ -319,4 +339,18 @@ public class SciInputCommandView extends ConsoleTextPane implements InputCommand
         }
         return dim;
     }
+
+    public void setForeground(Color fg) {
+        super.setForeground(fg);
+        setCaretColor(fg);
+        repaint();
+    }
+
+    public View create(Element e) {
+        return new PlainView(e) {
+            public Container getContainer() {
+                return SciInputCommandView.this;
+            }
+        };
+    }
 }
index cd2254d..01a2393 100644 (file)
@@ -12,6 +12,7 @@
 
 package org.scilab.modules.console;
 
+import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.Toolkit;
 import java.awt.datatransfer.Clipboard;
@@ -36,10 +37,15 @@ import javax.swing.JScrollPane;
 import javax.swing.JTextPane;
 import javax.swing.SwingUtilities;
 import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.Element;
 import javax.swing.text.JTextComponent;
 import javax.swing.text.PlainDocument;
 import javax.swing.text.StyleContext;
 import javax.swing.text.StyledDocument;
+import javax.swing.text.PlainView;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
 
 import org.scilab.modules.commons.gui.ScilabCaret;
 
@@ -52,7 +58,7 @@ import com.artenum.rosetta.util.StringConstants;
  *
  * @author Vincent COUVERT
  */
-public class SciOutputView extends JEditorPane implements OutputView {
+public class SciOutputView extends JEditorPane implements OutputView, ViewFactory {
     private static final long serialVersionUID = 1L;
 
     private static final int TOP_BORDER = 0;
@@ -83,12 +89,20 @@ public class SciOutputView extends JEditorPane implements OutputView {
 
     private int maxNumberOfLines;
 
+    private boolean lastEOL;
+
     /**
      * Constructor
      */
     public SciOutputView() {
         super();
 
+        setEditorKit(new DefaultEditorKit() {
+                public ViewFactory getViewFactory() {
+                    return SciOutputView.this;
+                }
+            });
+
         /* A PlainDocument contains only "box" for lines not for all characters (as in a StyledDocument)
            so there are less boxes to explore in a PlainDocument... */
         setDocument(new PlainDocument());
@@ -159,7 +173,6 @@ public class SciOutputView extends JEditorPane implements OutputView {
                 super.mousePressed(e);
             }
         }
-
         // Set the caret
         setCaret(new FixedCaret());
         // Selection is forced to be visible because the component is not editable
@@ -186,6 +199,10 @@ public class SciOutputView extends JEditorPane implements OutputView {
      */
     public void setStyledDocument(StyledDocument styledDocument) { }
 
+    public void resetLastEOL() {
+        lastEOL = false;
+    }
+
     /**
      * Display a buffer entry in the console
      * @param buff the string  to write
@@ -225,11 +242,23 @@ public class SciOutputView extends JEditorPane implements OutputView {
             }
         }
 
+        boolean slastEOL = lastEOL;
+        lastEOL = !buff.isEmpty() && buff.charAt(buff.length() - 1) == '\n';
+        String str = buff;
+        if (lastEOL) {
+            str = buff.substring(0, buff.length() - 1);
+        }
+
+        if (slastEOL) {
+            str = "\n" + str;
+        }
+
         try {
-            getDocument().insertString(sDocLength, buff, null);
+            getDocument().insertString(sDocLength, str, null);
+
             /* Move insertPosition to the end of last inserted data */
             if (insertPosition != 0) {
-                insertPosition += buff.length();
+                insertPosition += str.length();
             }
         } catch (BadLocationException e) {
             // TODO Auto-generated catch block
@@ -247,64 +276,6 @@ public class SciOutputView extends JEditorPane implements OutputView {
                 e.printStackTrace();
             }
         }
-
-        /* Special case for Scilab when clc or tohome have been used */
-        String[] lines = buff.split(StringConstants.NEW_LINE);
-
-        /* Change the size of the input command view if necessary */
-        /* - if the console size has been forced to a value */
-        /* - if a carriage return has been appended */
-        if (console != null && console.getInputCommandViewSizeForced() && lines.length > 0) {
-            JEditorPane outputView = ((JEditorPane) console.getConfiguration().getOutputView());
-
-            // Get JScrollPane viewport size to adapt input command
-            // view size
-            JScrollPane jSP = console.getJScrollPane();
-            Dimension jSPExtSize = jSP.getViewport().getExtentSize();
-
-            /* Height of a text line in the ouput view */
-            int charHeight = outputView.getFontMetrics(outputView.getFont()).getHeight();
-            JPanel promptView = ((JPanel) console.getConfiguration().getPromptView());
-
-            /* Input command view dimensions */
-            JTextPane inputCmdView = ((JTextPane) console.getConfiguration().getInputCommandView());
-            int height = inputCmdView.getPreferredSize().height;
-            int width = inputCmdView.getPreferredSize().width - jSPExtSize.width;
-
-            int promptViewHeight = promptView.getPreferredSize().height;
-
-            /* New dimension for the input command view */
-            /*
-             * -1 because last EOL removed in
-             * SwingScilabConsole.readline
-             */
-            int newHeight = height - (lines.length - 1) * charHeight;
-            Dimension newDim = null;
-
-            if (newHeight > promptViewHeight) {
-                /*
-                 * If the input command view is bigger than the
-                 * promptUI
-                 */
-                /*
-                 * It's height is descreased according to line
-                 * number of lines added to output view
-                 */
-                newDim = new Dimension(width, newHeight);
-            } else {
-                /*
-                 * If the input command view is smaller than the
-                 * promptUI
-                 */
-                /* It's height adapted to the promptUI height */
-                newDim = new Dimension(width, promptViewHeight);
-                console.setInputCommandViewSizeForced(false);
-            }
-            /* Change the input command view size */
-            ((JTextPane) console.getConfiguration().getInputCommandView()).setPreferredSize(newDim);
-            ((JTextPane) console.getConfiguration().getInputCommandView()).invalidate();
-            ((JTextPane) console.getConfiguration().getInputCommandView()).doLayout();
-        }
     }
 
     /**
@@ -374,6 +345,7 @@ public class SciOutputView extends JEditorPane implements OutputView {
     public void reset() {
         setText("");
         setCaretPosition(0);
+        lastEOL = false;
     }
 
     /**
@@ -450,4 +422,11 @@ public class SciOutputView extends JEditorPane implements OutputView {
         maxNumberOfLines = Math.max(1, number);
     }
 
+    public View create(Element e) {
+        return new PlainView(e) {
+            public Container getContainer() {
+                return SciOutputView.this;
+            }
+        };
+    }
 }
index f596e2d..a720dac 100644 (file)
@@ -30,208 +30,154 @@ import com.artenum.rosetta.interfaces.ui.PromptView;
  */
 public class SciPromptView extends JPanel implements PromptView {
 
-       private static final long serialVersionUID = 1L;
-
-       private static final String DEFAULT_PROMPT = "-->";
-       private static final String DEFAULT_IN_BLOCK_PROMPT = DEFAULT_PROMPT;
-       private static final String HTML_START = "<html>";
-       private static final String HTML_NEW_LINE = "<br/>";
-       private static final String HTML_END = "</html>";
-       private static final String SEMI_COLON = ";";
-       private static final String PARAGRAPH_END = "</P>";
-       private static final String ZERO_STRING = "0";
-       private static final int LEFT_BORDER = 0;
-       private static final int BOTTOM_BORDER = 2;
-
-       private String defaultPrompt;
-       private String inBlockPrompt;
-       private InputParsingManager inputParsingManager;
-
-       // Working vars
-       private StringBuffer promptTextContent;
-       private JLabel promptUI;
-
-       /**
-        * Constructor
-        */
-       public SciPromptView() {
-               // Internal part
-               promptTextContent = new StringBuffer();
-               defaultPrompt = DEFAULT_PROMPT;
-               inBlockPrompt = DEFAULT_IN_BLOCK_PROMPT;
-
-               // Gui part
-               promptUI = new JLabel();
-               promptUI.setBorder(BorderFactory.createEmptyBorder(0, LEFT_BORDER, BOTTOM_BORDER, 0));
-               promptUI.setOpaque(true);
-               setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
-               add(promptUI);
-               add(Box.createVerticalGlue());
-               // Prompt is invisible when created
-               setVisible(false);
-       }
-
-       /**
-        * Sets the default prompt symbol
-        * @param defaultPrompt the default prompt as a string
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#setDefaultPrompt(java.lang.String)
-        */
-       public void setDefaultPrompt(String defaultPrompt) {
-               this.defaultPrompt = defaultPrompt;
-               updatePrompt();
-       }
-
-       /**
-        * Sets the block prompt symbol (prompt displayed when editing a block)
-        * @param inBlockPrompt the default prompt as a string
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#setInBlockPrompt(java.lang.String)
-        */
-       public void setInBlockPrompt(String inBlockPrompt) {
-               this.inBlockPrompt = inBlockPrompt;
-               updatePrompt();
-       }
-
-       /**
-        * Sets the parsing manager associated to this prompt
-        * @param inputParsingManager the parsing manager
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#setInputParsingManager(com.artenum.rosetta.interfaces.core.InputParsingManager)
-        */
-       public void setInputParsingManager(InputParsingManager inputParsingManager) {
-               this.inputParsingManager = inputParsingManager;
-       }
-
-       /**
-        * Updates the prompt object contents according to the current state (in a block or not)
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#updatePrompt()
-        */
-       public void updatePrompt() {
-               promptTextContent.setLength(0);
-               promptTextContent.append(HTML_START);
-
-               // Text Color
-               String textStyle = "<P style=\"padding:1px;color:" + colorToString(promptUI.getForeground()) + SEMI_COLON;
-
-               // Text Font
-               if (promptUI.isFontSet()) {
-                       textStyle += "font-size:" + promptUI.getFont().getSize() + "pt;";
-                       textStyle += "font-family:" + promptUI.getFont().getName() + SEMI_COLON;
-                       if (promptUI.getFont().isBold()) {
-                               textStyle += "font-weight:bold;";
-                       }
-
-                       if (promptUI.getFont().isItalic()) {
-                               textStyle += "font-style:italic;";
-                       }
-               }
-               textStyle += "\">";
-
-               promptTextContent.append(textStyle + defaultPrompt.replaceAll(">", "&gt;") + PARAGRAPH_END);
-
-               int nbLineToShow = inputParsingManager.getNumberOfLines();
-               while (nbLineToShow-- > 1) {
-                       promptTextContent.append(HTML_NEW_LINE);
-                       promptTextContent.append(textStyle + inBlockPrompt + PARAGRAPH_END);
-               }
-               promptTextContent.append(HTML_END);
-               promptUI.setText(promptTextContent.toString());
-       }
-
-       /**
-        * Sets the background of the prompt
-        * @param bgColor the color to set
-        * @see javax.swing.JComponent#setBackground(java.awt.Color)
-        */
-       public void setBackground(Color bgColor) {
-               super.setBackground(bgColor);
-               if (promptUI != null) {
-                       promptUI.setBackground(bgColor);
-               }
-       }
-
-       /**
-        * Sets the foreground of the prompt
-        * @param fgColor the color to set
-        * @see javax.swing.JComponent#setForeground(java.awt.Color)
-        */
-       public void setForeground(Color fgColor) {
-               super.setForeground(fgColor);
-               if (promptUI != null) {
-                       promptUI.setForeground(fgColor);
-               }
-       }
-
-       /**
-        * Sets the font of the prompt
-        * @param font the font to set
-        * @see javax.swing.JComponent#setBackground(java.awt.font)
-        */
-       public void setFont(Font font) {
-               super.setFont(font);
-               if (promptUI != null) {
-                       promptUI.setFont(font);
-               }
-       }
-
-       /**
-        * Gets the default prompt symbol
-        * @return the default prompt symbol
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#getDefaultPrompt()
-        */
-       public String getDefaultPrompt() {
-               return defaultPrompt;
-       }
-
-       /**
-        * Gets the block prompt symbol
-        * @return the block prompt symbol
-        * @see com.artenum.rosetta.interfaces.ui.PromptView#getInBlockPrompt()
-        */
-       public String getInBlockPrompt() {
-               return inBlockPrompt;
-       }
-
-       /**
-        * Sets the visibility status of the prompt view
-        * @param status new visibility status
-        * @see javax.swing.JComponent#setVisible(boolean)
-        */
-       public void setVisible(boolean status) {
-               super.setVisible(status);
-       }
-
-       /**
-        * Convert a color into an hexadecimal string
-        * @param c the color to convert
-        * @return the corresponding hexadecimal string
-        */
-       private static String colorToString(Color c) {
-               String strColor = "#";
-               String s = Integer.toHexString(c.getRed());
-               if (s.length() == 1) {
-                       strColor += ZERO_STRING + s;
-               } else {
-                       strColor += s;
-               }
-               s = Integer.toHexString(c.getGreen());
-               if (s.length() == 1) {
-                       strColor += ZERO_STRING + s;
-               } else {
-                       strColor += s;
-               }
-               s = Integer.toHexString(c.getBlue());
-               if (s.length() == 1) {
-                       strColor += ZERO_STRING + s;
-               } else {
-                       strColor += s;
-               }
-               return strColor;
-       }
-
-       /**
-        * @return the prompt JLabel
-        */
-       public JLabel getPromptUI() {
-               return promptUI;
-       }
+    private static final long serialVersionUID = 1L;
+
+    private static final String DEFAULT_PROMPT = "-->";
+    private static final String DEFAULT_IN_BLOCK_PROMPT = DEFAULT_PROMPT;
+    private static final String HTML_START = "<html>";
+    private static final String HTML_NEW_LINE = "<br/>";
+    private static final String HTML_END = "</html>";
+    private static final String SEMI_COLON = ";";
+    private static final String PARAGRAPH_END = "</P>";
+    private static final String ZERO_STRING = "0";
+    private static final int LEFT_BORDER = 0;
+    private static final int BOTTOM_BORDER = 2;
+
+    private String defaultPrompt;
+    private String inBlockPrompt;
+    private InputParsingManager inputParsingManager;
+
+    // Working vars
+    private StringBuffer promptTextContent;
+    private JLabel promptUI;
+
+    /**
+     * Constructor
+     */
+    public SciPromptView() {
+        // Internal part
+        promptTextContent = new StringBuffer();
+        defaultPrompt = DEFAULT_PROMPT;
+        inBlockPrompt = DEFAULT_IN_BLOCK_PROMPT;
+
+        // Gui part
+        promptUI = new JLabel();
+        promptUI.setBorder(BorderFactory.createEmptyBorder(0, LEFT_BORDER, BOTTOM_BORDER, 0));
+        promptUI.setOpaque(true);
+        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+        add(promptUI);
+        add(Box.createVerticalGlue());
+        // Prompt is invisible when created
+        setVisible(false);
+    }
+
+    /**
+     * Sets the default prompt symbol
+     * @param defaultPrompt the default prompt as a string
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#setDefaultPrompt(java.lang.String)
+     */
+    public void setDefaultPrompt(String defaultPrompt) {
+        this.defaultPrompt = defaultPrompt;
+        updatePrompt();
+    }
+
+    /**
+     * Sets the block prompt symbol (prompt displayed when editing a block)
+     * @param inBlockPrompt the default prompt as a string
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#setInBlockPrompt(java.lang.String)
+     */
+    public void setInBlockPrompt(String inBlockPrompt) {
+        this.inBlockPrompt = inBlockPrompt;
+        updatePrompt();
+    }
+
+    /**
+     * Sets the parsing manager associated to this prompt
+     * @param inputParsingManager the parsing manager
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#setInputParsingManager(com.artenum.rosetta.interfaces.core.InputParsingManager)
+     */
+    public void setInputParsingManager(InputParsingManager inputParsingManager) {
+        this.inputParsingManager = inputParsingManager;
+    }
+
+    /**
+     * Updates the prompt object contents according to the current state (in a block or not)
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#updatePrompt()
+     */
+    public void updatePrompt() {
+        if (!promptUI.getText().equals(defaultPrompt)) {
+            promptUI.setText(defaultPrompt);
+        }
+    }
+
+    /**
+     * Sets the background of the prompt
+     * @param bgColor the color to set
+     * @see javax.swing.JComponent#setBackground(java.awt.Color)
+     */
+    public void setBackground(Color bgColor) {
+        super.setBackground(bgColor);
+        if (promptUI != null) {
+            promptUI.setBackground(bgColor);
+        }
+    }
+
+    /**
+     * Sets the foreground of the prompt
+     * @param fgColor the color to set
+     * @see javax.swing.JComponent#setForeground(java.awt.Color)
+     */
+    public void setForeground(Color fgColor) {
+        super.setForeground(fgColor);
+        if (promptUI != null) {
+            promptUI.setForeground(fgColor);
+        }
+    }
+
+    /**
+     * Sets the font of the prompt
+     * @param font the font to set
+     * @see javax.swing.JComponent#setBackground(java.awt.font)
+     */
+    public void setFont(Font font) {
+        super.setFont(font);
+        if (promptUI != null) {
+            promptUI.setFont(font);
+        }
+    }
+
+    /**
+     * Gets the default prompt symbol
+     * @return the default prompt symbol
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#getDefaultPrompt()
+     */
+    public String getDefaultPrompt() {
+        return defaultPrompt;
+    }
+
+    /**
+     * Gets the block prompt symbol
+     * @return the block prompt symbol
+     * @see com.artenum.rosetta.interfaces.ui.PromptView#getInBlockPrompt()
+     */
+    public String getInBlockPrompt() {
+        return inBlockPrompt;
+    }
+
+    /**
+     * Sets the visibility status of the prompt view
+     * @param status new visibility status
+     * @see javax.swing.JComponent#setVisible(boolean)
+     */
+    public void setVisible(boolean status) {
+        super.setVisible(status);
+    }
+
+    /**
+     * @return the prompt JLabel
+     */
+    public JLabel getPromptUI() {
+        return promptUI;
+    }
 
 }
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_6408.tst b/scilab/modules/console/tests/nonreg_tests/bug_6408.tst
new file mode 100644 (file)
index 0000000..74d4c5e
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- INTERACTIVE TEST -->
+// <-- TEST WITH CONSOLE -->
+//
+// <-- Non-regression test for bug 6408 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/6408
+//
+// <-- Short Description -->
+// prompt() removed trailing whites.
+
+prompt('abcd               ')
+
+// the whites must not be removed
\ No newline at end of file
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_6819.tst b/scilab/modules/console/tests/nonreg_tests/bug_6819.tst
new file mode 100644 (file)
index 0000000..7c9be6d
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- INTERACTIVE TEST -->
+// <-- TEST WITH CONSOLE -->
+//
+// <-- Non-regression test for bug 6819 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/6819
+//
+// <-- Short Description -->
+// prompt() interpreted '<...>' as html
+
+prompt('<1>')
+
+// must display <1> !
\ No newline at end of file
diff --git a/scilab/modules/console/tests/nonreg_tests/bug_7815.tst b/scilab/modules/console/tests/nonreg_tests/bug_7815.tst
new file mode 100644 (file)
index 0000000..f6f2067
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- INTERACTIVE TEST -->
+// <-- TEST WITH CONSOLE -->
+//
+// <-- Non-regression test for bug 7815 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/7815
+//
+// <-- Short Description -->
+// tohome() worked too much
+
+tohome()
+
+// enter what you want, all should be as expected
\ No newline at end of file
index 5ccb867..cb11b79 100644 (file)
@@ -218,21 +218,11 @@ public class SwingScilabConsole extends SciConsole implements SimpleConsole {
                     inputCmdView.setEditable(true);
                     ((JTextPane) inputCmdView).setCaretColor(((JTextPane) inputCmdView).getForeground());
                     ((JTextPane) inputCmdView).getCaret().setVisible(true);
+                    setToHome();
                 }
             });
 
-        // Remove last line returned given by Scilab (carriage return)
-        try {
-            Document doc = ((JEditorPane) this.getConfiguration().getOutputView()).getDocument();
-            int lastEOL = doc.getText(0, doc.getLength()).lastIndexOf(StringConstants.NEW_LINE);
-
-            // Condition added to avoid a "javax.swing.text.BadLocationException: Invalid remove" exception
-            if (lastEOL > 1 && (doc.getLength() - lastEOL) == 1) {
-                doc.remove(lastEOL, doc.getLength() - lastEOL);
-            }
-        } catch (BadLocationException e) {
-            e.printStackTrace();
-        }
+        ((SciOutputView) this.getConfiguration().getOutputView()).resetLastEOL();
 
         updateScrollPosition();
     }