]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetListings.cpp
Rewrite the label numbering code.
[lyx.git] / src / insets / InsetListings.cpp
index bd338d46612ae2a74f9d7f5adc8f75a0e0ce1c74..e756d4fb7b5c462890aad16e0fa9709ca1a6d929 100644 (file)
@@ -14,6 +14,9 @@
 #include "InsetListings.h"
 #include "InsetCaption.h"
 
+#include "Buffer.h"
+#include "BufferParams.h"
+#include "Counters.h"
 #include "Language.h"
 #include "gettext.h"
 #include "DispatchResult.h"
@@ -28,6 +31,8 @@
 namespace lyx {
 
 using support::token;
+using support::contains;
+using support::subst;
 
 using std::auto_ptr;
 using std::istringstream;
@@ -35,6 +40,7 @@ using std::ostream;
 using std::ostringstream;
 using std::string;
 
+char const lstinline_delimiters[] = "!*()-=+|;:'\"`,<.>/?QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
 
 void InsetListings::init()
 {
@@ -81,6 +87,21 @@ Inset::DisplayType InsetListings::display() const
 }
 
 
+void InsetListings::updateLabels(Buffer const & buf, ParIterator const & it)
+{
+       Counters & cnts = buf.params().getTextClass().counters();
+       string const saveflt = cnts.current_float();
+
+       // Tell to captions what the current float is
+       cnts.current_float("listing");
+
+       InsetCollapsable::updateLabels(buf, it);
+
+       //reset afterwards
+       cnts.current_float(saveflt);
+}
+
+
 void InsetListings::write(Buffer const & buf, ostream & os) const
 {
        os << "listings" << "\n";
@@ -121,38 +142,21 @@ void InsetListings::read(Buffer const & buf, Lexer & lex)
 
 docstring const InsetListings::editMessage() const
 {
-       return _("Opened Listings Inset");
+       return _("Opened Listing Inset");
 }
 
 
 int InsetListings::latex(Buffer const & buf, odocstream & os,
                    OutputParams const & runparams) const
 {
-       string param_string = params().encodedString();
+       string param_string = params().params();
        // NOTE: I use {} to quote text, which is an experimental feature
        // of the listings package (see page 25 of the manual)
        int lines = 0;
-       bool lstinline = params().isInline();
-       if (lstinline) {
-               if (param_string.empty())
-                       os << "\\lstinline{";
-               else
-                       os << "\\lstinline[" << from_ascii(param_string) << "]{";
-       } else {
-               docstring const caption = getCaption(buf, runparams);
-               if (param_string.empty() && caption.empty())
-                       os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}\n";
-               else {
-                       os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}[";
-                       if (!caption.empty()) {
-                               os << "caption={" << caption << '}';
-                               if (!param_string.empty())
-                                       os << ',';
-                       }
-                       os << from_ascii(param_string) << "]\n";
-               }
-               lines += 4;
-       }
+       bool isInline = params().isInline();
+       // get the paragraphs. We can not output them directly to given odocstream
+       // because we can not yet determine the delimiter character of \lstinline
+       docstring code;
        ParagraphList::const_iterator par = paragraphs().begin();
        ParagraphList::const_iterator end = paragraphs().end();
 
@@ -165,20 +169,49 @@ int InsetListings::latex(Buffer const & buf, odocstream & os,
                        // ignore all struck out text and (caption) insets
                        if (par->isDeleted(i) || par->isInset(i))
                                continue;
-                       os.put(par->getChar(i));
+                       code += par->getChar(i);
                }
                ++par;
                // for the inline case, if there are multiple paragraphs
                // they are simply joined. Otherwise, expect latex errors.
-               if (par != end && !lstinline && !captionline) {
-                       os << "\n";
+               if (par != end && !isInline && !captionline) {
+                       code += "\n";
                        ++lines;
                }
        }
-       if (lstinline)
-               os << "}";              
-       else {
-               os << "\n\\end{lstlisting}\n\\endgroup\n";
+       if (isInline) {
+                char const * delimiter = lstinline_delimiters;
+               for (; delimiter != '\0'; ++delimiter)
+                       if (!contains(code, *delimiter))
+                               break;
+               // This code piece contains all possible special character? !!!
+               // Replace ! with a warning message and use ! as delimiter.
+               if (*delimiter == '\0') {
+                       code = subst(code, from_ascii("!"), from_ascii(" WARNING: no lstline delimiter can be used "));
+                       delimiter = lstinline_delimiters;
+               }
+               if (param_string.empty())
+                       os << "\\lstinline" << *delimiter;
+               else
+                       os << "\\lstinline[" << from_ascii(param_string) << "]" << *delimiter;
+                os << code
+                   << *delimiter;
+       } else {
+               docstring const caption = getCaption(buf, runparams);
+               if (param_string.empty() && caption.empty())
+                       os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}\n";
+               else {
+                       os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}[";
+                       if (!caption.empty()) {
+                               os << "caption={" << caption << '}';
+                               if (!param_string.empty())
+                                       os << ',';
+                       }
+                       os << from_utf8(param_string) << "]\n";
+               }
+               lines += 4;
+                os << code
+                   << "\n\\end{lstlisting}\n\\endgroup\n";
                lines += 3;
        }
 
@@ -196,7 +229,7 @@ void InsetListings::doDispatch(Cursor & cur, FuncRequest & cmd)
        }
        case LFUN_INSET_DIALOG_UPDATE:
                InsetListingsMailer(*this).updateDialog(&cur.bv());
-               break;  
+               break;
        case LFUN_MOUSE_RELEASE: {
                if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
                        InsetListingsMailer(*this).showDialog(&cur.bv());
@@ -231,7 +264,7 @@ bool InsetListings::getStatus(Cursor & cur, FuncRequest const & cmd,
 void InsetListings::setButtonLabel()
 {
        // FIXME UNICODE
-       setLabel(isOpen() ?  _("Listings") : getNewLabel(_("Listings")));
+       setLabel(isOpen() ?  _("Listing") : getNewLabel(_("Listing")));
 }