Add support for listings package. Two listings command \lstinline, \lstinputlisting and an environment \lstlisting are supported, along with preamble \lstset. \lstinputlisting is implemented through Include dialog, and the other two are implemented with a new inset listings, along with its dialog.

* src/LyXAction.cpp: listing-insert action
	* src/insets/Inset.h,cpp: LISTINGS_CODE
	* src/insets/InsetInclude.cpp: handle \lstinputlisting
	* src/insets/InsetListings.h,cpp: new listings inset
	* src/insets/InsetListingsParams.h,cpp: parameters from listings package
	* src/insets/InsetCommandParams.h,cpp: handle lstinputlisting option
	* src/Bidi.cpp: handle LISTINGS_CODE
	* src/frontends/qt4/ui/TextLayoutUi.ui: update UI
	* src/frontends/qt4/ui/ListingsUi.ui: new dialog
	* src/frontends/qt4/ui/IncludeUi.ui: update UI
	* src/frontends/qt4/QInclude.h,cpp: add lstinputlisting
	* src/frontends/qt4/QDocument.h,cpp: add textedit for preamble listings_params
	* src/frontends/qt4/QListings.h,cpp: new listings inset
	* src/frontends/qt4/Dialogs.cpp: new listings dialog
	* src/frontends/controllers/ControlInclude.h,cpp: add lstinputlisting
	* src/frontends/controllers/ControlListings.h,cpp: new listings inset
	* src/LyXFunc.cpp: handle LISTING_CODE
	* src/Paragraph.cpp: handle LISTING_CODE
	* src/factory.cpp: new listings inset
	* src/CutAndPaste.cpp: handle LISTINGS_CODE
	* src/LaTeXFeatures.cpp: require listings
	* src/Text3.cpp: Handle LISTINGS_CODE
	* src/lfuns.h: add LFUN_LISTING_INSERT
	* src/Buffer.cpp: change lyx file format to 269
	* src/BufferParams.h,cpp: add listings_params to preamble
	* lib/lyx2lyx/LyX.py: lyx2lyx 
	* lib/lyx2lyx/lyx_1_5.py: lyx2lyx
	* lib/ui/stdmenus.inc: new menu item (no shortcut!)
	* src/insets/Makefile.am: update autotools
	* src/frontends/controllers/Makefile.am
	* src/frontends/qt4/Makefile.dialogs
	* src/frontends/qt4/Makefile.am
	* po/POTFILES.in: a few more translatable files.
	* development/scons/scons_manifest.py: scons build system
	* development/FORMAT: document format changes


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18243 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2007-05-09 19:11:42 +00:00
parent 1bb709af80
commit 4ce743a0a7
45 changed files with 2487 additions and 395 deletions

View File

@ -1,6 +1,16 @@
LyX file-format changes
-----------------------
2007-05-08 Bo Peng <ben.bob@gmail.com>
* format incremented to 269: add listings support
- add preamble flag \listings_params, e.g. \listings_params "language=Python,float"
- add inset listings, with options lstparams and inline, e.g.
\begin_inset listings
lstparams "xleftmargin=50pt,language=Python"
inline false
- add \lstinputlisting Include type. e.g.
\begin_inset Include \lstinputlisting{newfile1.lyx}[firstline=10,lastline=15]
2007-05-06 Uwe Stöhr <uwestoehr@web.de>
* format incremented to 268: add support for the CJK encodings

View File

@ -726,6 +726,7 @@ src_frontends_controllers_header_files = Split('''
ControlFloat.h
ControlGraphics.h
ControlInclude.h
ControlListings.h
ControlLog.h
ControlMath.h
ControlNote.h
@ -771,6 +772,7 @@ src_frontends_controllers_files = Split('''
ControlFloat.cpp
ControlGraphics.cpp
ControlInclude.cpp
ControlListings.cpp
ControlLog.cpp
ControlMath.cpp
ControlNote.cpp
@ -866,6 +868,7 @@ src_frontends_qt4_header_files = Split('''
QInclude.h
QIndex.h
QKeySymbol.h
QListings.h
QLImage.h
QLMenubar.h
QLPainter.h
@ -955,6 +958,7 @@ src_frontends_qt4_files = Split('''
QInclude.cpp
QIndex.cpp
QKeySymbol.cpp
QListings.cpp
QLImage.cpp
QLMenubar.cpp
QLPainter.cpp
@ -1030,6 +1034,7 @@ src_frontends_qt4_moc_files = Split('''
QGraphicsDialog.cpp
QInclude.cpp
QIndex.cpp
QListings.cpp
QLMenubar.cpp
QLPopupMenu.cpp
QLPrintDialog.cpp
@ -1101,6 +1106,7 @@ src_frontends_qt4_ui_files = Split('''
IndexUi.ui
LaTeXUi.ui
LanguageUi.ui
ListingsUi.ui
LogUi.ui
MarginsUi.ui
MathMatrixUi.ui
@ -1183,6 +1189,8 @@ src_insets_header_files = Split('''
InsetIndex.h
InsetLabel.h
InsetLine.h
InsetListings.h
InsetListingsParams.h
InsetMarginal.h
InsetNewline.h
InsetNomencl.h
@ -1236,6 +1244,8 @@ src_insets_files = Split('''
InsetIndex.cpp
InsetLabel.cpp
InsetLine.cpp
InsetListings.cpp
InsetListingsParams.cpp
InsetMarginal.cpp
InsetNewline.cpp
InsetNomencl.cpp

View File

@ -74,7 +74,7 @@ format_relation = [("0_06", [200], generate_minor_versions("0.6" , 4)),
("1_2", [220], generate_minor_versions("1.2" , 4)),
("1_3", [221], generate_minor_versions("1.3" , 7)),
("1_4", range(222,246), generate_minor_versions("1.4" , 4)),
("1_5", range(246,269), generate_minor_versions("1.5" , 0))]
("1_5", range(246,270), generate_minor_versions("1.5" , 0))]
def formats_list():

View File

@ -1347,6 +1347,140 @@ def revert_CJK(document):
document.header[i] = "\\language english"
def revert_preamble_listings_params(document):
" Revert preamble option \listings_params "
i = find_token(document.header, "\\listings_params", 0)
if i != -1:
document.preamble.append('\\usepackage{listings}')
document.preamble.append('\\lstset{%s}' % document.header[i].split()[1].strip('"'))
document.header.pop(i);
def revert_listings_inset(document):
r''' Revert listings inset to \lstinline or \begin, \end lstlisting, translate
FROM
\begin_inset
lstparams "language=Delphi"
inline true
status open
\begin_layout Standard
var i = 10;
\end_layout
\end_inset
TO
\begin_inset ERT
status open
\begin_layout Standard
\backslash
lstinline[language=Delphi]{var i = 10;}
\end_layout
\end_inset
'''
i = 0
while True:
i = find_token(document.body, '\\begin_inset listings', i)
if i == -1:
break
j = find_end_of_inset(document.body, i + 1)
if j == -1:
# this should not happen
break
inline = 'false'
params = ''
status = 'open'
inlinecode = ''
# first three lines
for line in range(i + 1, i + 4):
if document.body[line].startswith('inline'):
inline = document.body[line].split()[1]
if document.body[line].startswith('lstparams'):
params = document.body[line].split()[1].strip('"')
if document.body[line].startswith('status'):
status = document.body[line].split()[1].strip()
k = line + 1
# looking for the oneline code for lstinline
for line in range(i + 2, j + 1):
if document.body[line].startswith(r'\begin_layout'):
inlinecode = document.body[line+1]
break
if inline == 'true':
document.body[i:(j+1)] = [r'\begin_inset ERT'
'status %s' % status,
r'\begin_layout Standard',
'',
'',
r'\backslash',
'lstinline[%s]{%s}' % (params, inlinecode),
r'\end_layout',
'',
r'\end_inset']
else:
document.body[i: k] = [r'\begin_inset ERT',
'status %s' % status,
'',
r'\begin_layout Standard',
'',
'',
r'\backslash',
r'lstlisting[%s]{' % params,
r'\end_layout'
]
def revert_include_listings(document):
r''' Revert lstinputlisting Include option , translate
\begin_inset Include \lstinputlisting{file}[opt]
preview false
\end_inset
TO
\begin_inset ERT
status open
\begin_layout Standard
\backslash
lstinputlisting{file}[opt]
\end_layout
\end_inset
'''
i = 0
while True:
i = find_token(document.body, r'\begin_inset Include \lstinputlisting', i)
if i == -1:
break
j = find_end_of_inset(document.body, i + 1)
if j == -1:
# this should not happen
break
# find command line
cmd = document.body[i].split()[2]
document.body[i : j + 1] = [r'\begin_inset ERT',
'status open',
'',
r'\begin_layout Standard',
'',
'',
r'\backslash',
'%s' % cmd[1:],
r'\end_layout',
'',
r'\end_inset']
##
# Conversion hub
#
@ -1374,9 +1508,12 @@ convert = [[246, []],
[265, [convert_tableborder]],
[266, []],
[267, []],
[268, []]]
[268, []],
[269, []]]
revert = [[267, [revert_CJK]],
revert = [
[268, [revert_preamble_listings_params, revert_listings_inset, revert_include_listings]],
[267, [revert_CJK]],
[266, [revert_utf8plain]],
[265, [revert_armenian]],
[264, [revert_tableborder]],

View File

@ -311,6 +311,7 @@ Menuset
Item "Marginal Note|M" "marginalnote-insert"
Item "Short Title|S" "optional-insert"
Item "TeX Code|X" "ert-insert"
Item "Program Listing" "listing-insert"
Item "Date" "date-insert"
End

View File

@ -67,6 +67,7 @@ src/frontends/qt4/QExternal.cpp
src/frontends/qt4/QFloat.cpp
src/frontends/qt4/QGraphics.cpp
src/frontends/qt4/QInclude.cpp
src/frontends/qt4/QListings.cpp
src/frontends/qt4/QMathMatrixDialog.cpp
src/frontends/qt4/QNote.cpp
src/frontends/qt4/QParagraph.cpp
@ -106,6 +107,7 @@ src/insets/InsetGraphics.cpp
src/insets/InsetHFill.cpp
src/insets/InsetInclude.cpp
src/insets/InsetIndex.cpp
src/insets/InsetListings.cpp
src/insets/InsetMarginal.cpp
src/insets/InsetNomencl.cpp
src/insets/InsetNote.cpp
@ -115,6 +117,7 @@ src/insets/InsetRef.cpp
src/insets/InsetTOC.cpp
src/insets/InsetTabular.cpp
src/insets/InsetText.cpp
src/insets/InsetTheorem.cpp
src/insets/InsetUrl.cpp
src/insets/InsetVSpace.cpp
src/insets/InsetWrap.cpp
@ -122,6 +125,7 @@ src/insets/RenderGraphic.cpp
src/insets/RenderPreview.cpp
src/lengthcommon.cpp
src/lyxfind.cpp
src/mathed/InsetFormulaMacro.cpp
src/mathed/InsetMathAMSArray.cpp
src/mathed/InsetMathCases.cpp
src/mathed/InsetMathGrid.cpp

View File

@ -59,7 +59,7 @@ void Bidi::computeTables(Paragraph const & par,
return;
}
if (par.ownerCode() == Inset::ERT_CODE) {
if (par.ownerCode() == Inset::ERT_CODE || par.ownerCode() == Inset::LISTINGS_CODE) {
start_ = -1;
return;
}

View File

@ -141,7 +141,7 @@ using std::string;
namespace {
int const LYX_FORMAT = 268;
int const LYX_FORMAT = 269;
} // namespace anon

View File

@ -37,6 +37,7 @@
#include "VSpace.h"
#include "frontends/alert.h"
#include "insets/InsetListingsParams.h"
#include "support/lyxalgo.h" // for lyx::count
#include "support/convert.h"
@ -351,6 +352,7 @@ BufferParams::BufferParams()
graphicsDriver = "default";
sides = TextClass::OneSide;
columns = 1;
listings_params = string();
pagestyle = "default";
compressed = false;
for (int iter = 0; iter < 4; ++iter) {
@ -603,6 +605,17 @@ string const BufferParams::readToken(Lexer & lex, string const & token)
lex >> fontsize;
} else if (token == "\\papercolumns") {
lex >> columns;
} else if (token == "\\listings_params") {
string par;
lex >> par;
// validate par and produce a valid listings parameter string
try {
listings_params = InsetListingsParams(par).params();
} catch (invalidParam & e) {
lyxerr << "Invalid parameter string " << par << endl;
lyxerr << e.what() << endl;
listings_params = string();
}
} else if (token == "\\papersides") {
int psides;
lex >> psides;
@ -734,6 +747,9 @@ void BufferParams::writeFile(ostream & os) const
<< "\n\\papercolumns " << columns
<< "\n\\papersides " << sides
<< "\n\\paperpagestyle " << pagestyle << '\n';
if (!listings_params.empty())
os << "\\listings_params \"" <<
InsetListingsParams(listings_params).encodedString() << "\"\n";
for (int i = 0; i < 4; ++i) {
if (user_defined_bullet(i) != ITEMIZE_DEFAULTS[i]) {
if (user_defined_bullet(i).getFont() != -1) {
@ -946,6 +962,20 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
texrow.newline();
}
if (!listings_params.empty()) {
os << "\\usepackage{listings}\n";
texrow.newline();
os << "\\lstset{";
// do not test validity because listings_params is supposed to be valid
string par = InsetListingsParams(listings_params).separatedParams(true);
os << from_ascii(par);
// count the number of newlines
for (size_t i = 0; i < par.size(); ++i)
if (par[i] == '\n')
texrow.newline();
os << "}\n";
texrow.newline();
}
if (use_geometry || nonstandard_papersize) {
os << "\\usepackage{geometry}\n";
texrow.newline();

View File

@ -189,6 +189,8 @@ public:
std::string float_placement;
///
unsigned int columns;
/// parameters for the listings package
std::string listings_params;
///
TextClass::PageSides sides;
///

View File

@ -128,7 +128,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist,
// Convert newline to paragraph break in ERT inset.
// This should not be here!
if (pars[pit].inInset() &&
pars[pit].inInset()->lyxCode() == Inset::ERT_CODE) {
(pars[pit].inInset()->lyxCode() == Inset::ERT_CODE ||
pars[pit].inInset()->lyxCode() == Inset::LISTINGS_CODE)) {
for (ParagraphList::size_type i = 0; i < insertion.size(); ++i) {
for (pos_type j = 0; j < insertion[i].size(); ++j) {
if (insertion[i].isNewline(j)) {
@ -374,7 +375,7 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars,
// ERT paragraphs have the Language latex_language.
// This is invalid outside of ERT, so we need to change it
// to the buffer language.
if (it->ownerCode() == Inset::ERT_CODE) {
if (it->ownerCode() == Inset::ERT_CODE || it->ownerCode() == Inset::LISTINGS_CODE) {
it->changeLanguage(buf.params(), latex_language,
buf.getLanguage());
}

View File

@ -568,6 +568,9 @@ string const LaTeXFeatures::getPackages() const
"\\providecommand{\\makenomenclature}{\\makeglossary}\n"
"\\makenomenclature\n";
}
if (mustProvide("listings"))
packages << "\\usepackage{listings}\n";
return packages.str();
}

View File

@ -371,6 +371,7 @@ void LyXAction::init()
{ LFUN_NOMENCL_PRINT, "nomencl-print", Noop },
{ LFUN_CLEARPAGE_INSERT, "clearpage-insert", Noop },
{ LFUN_CLEARDOUBLEPAGE_INSERT, "cleardoublepage-insert", Noop },
{ LFUN_LISTING_INSERT, "listing-insert", Noop },
{ LFUN_NOACTION, "", Noop }
};

View File

@ -67,6 +67,7 @@
#include "insets/InsetERT.h"
#include "insets/InsetExternal.h"
#include "insets/InsetFloat.h"
#include "insets/InsetListings.h"
#include "insets/InsetGraphics.h"
#include "insets/InsetInclude.h"
#include "insets/InsetNote.h"
@ -519,6 +520,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
case Inset::BOX_CODE:
enable = cmd.argument() == "box";
break;
case Inset::LISTINGS_CODE:
enable = cmd.argument() == "listings";
break;
default:
break;
}
@ -558,7 +562,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
enable = Exporter::isExportable(*buf, "dvi")
&& lyxrc.print_command != "none";
else if (name == "character")
enable = cur.inset().lyxCode() != Inset::ERT_CODE;
enable = cur.inset().lyxCode() != Inset::ERT_CODE &&
cur.inset().lyxCode() != Inset::LISTINGS_CODE;
else if (name == "latexlog")
enable = isFileReadable(FileName(buf->getLogName().second));
else if (name == "spellchecker")
@ -573,7 +578,8 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
}
case LFUN_DIALOG_SHOW_NEW_INSET:
enable = cur.inset().lyxCode() != Inset::ERT_CODE;
enable = cur.inset().lyxCode() != Inset::ERT_CODE &&
cur.inset().lyxCode() != Inset::LISTINGS_CODE;
if (cur.inset().lyxCode() == Inset::CAPTION_CODE) {
FuncStatus flag;
if (cur.inset().getStatus(cur, cmd, flag))
@ -1317,6 +1323,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
} else if (name == "float") {
InsetFloatParams p;
data = InsetFloatMailer::params2string(p);
} else if (name == "listings") {
InsetListingsParams p;
data = InsetListingsMailer::params2string(p);
} else if (name == "graphics") {
InsetGraphicsParams p;
Buffer const & buffer = *lyx_view_->buffer();

View File

@ -2176,6 +2176,7 @@ bool Paragraph::emptyTag() const
lyx_code != Inset::INCLUDE_CODE &&
lyx_code != Inset::GRAPHICS_CODE &&
lyx_code != Inset::ERT_CODE &&
lyx_code != Inset::LISTINGS_CODE &&
lyx_code != Inset::FLOAT_CODE &&
lyx_code != Inset::TABULAR_CODE) {
return false;
@ -2341,7 +2342,8 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const
{
return lyxrc.rtl_support
&& getParLanguage(bparams)->rightToLeft()
&& ownerCode() != Inset::ERT_CODE;
&& ownerCode() != Inset::ERT_CODE
&& ownerCode() != Inset::LISTINGS_CODE;
}
@ -2502,7 +2504,7 @@ bool Paragraph::isFreeSpacing() const
// for now we just need this, later should we need this in some
// other way we can always add a function to Inset too.
return ownerCode() == Inset::ERT_CODE;
return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE;
}
@ -2510,7 +2512,7 @@ bool Paragraph::allowEmpty() const
{
if (layout()->keepempty)
return true;
return ownerCode() == Inset::ERT_CODE;
return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE;
}

View File

@ -1198,6 +1198,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
case LFUN_BRANCH_INSERT:
case LFUN_BIBITEM_INSERT:
case LFUN_ERT_INSERT:
case LFUN_LISTING_INSERT:
case LFUN_FOOTNOTE_INSERT:
case LFUN_MARGINALNOTE_INSERT:
case LFUN_OPTIONAL_INSERT:
@ -1695,11 +1696,16 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
code = Inset::VSPACE_CODE;
else if (cmd.argument() == "wrap")
code = Inset::WRAP_CODE;
else if (cmd.argument() == "listings")
code = Inset::LISTINGS_CODE;
break;
case LFUN_ERT_INSERT:
code = Inset::ERT_CODE;
break;
case LFUN_LISTING_INSERT:
code = Inset::LISTINGS_CODE;
break;
case LFUN_FOOTNOTE_INSERT:
code = Inset::FOOT_CODE;
break;

View File

@ -30,6 +30,7 @@
#include "insets/InsetCharStyle.h"
#include "insets/InsetEnvironment.h"
#include "insets/InsetERT.h"
#include "insets/InsetListings.h"
#include "insets/InsetExternal.h"
#include "insets/InsetFloat.h"
#include "insets/InsetFloatList.h"
@ -136,6 +137,9 @@ Inset * createInset(BufferView * bv, FuncRequest const & cmd)
case LFUN_ERT_INSERT:
return new InsetERT(params);
case LFUN_LISTING_INSERT:
return new InsetListings(params);
case LFUN_FOOTNOTE_INSERT:
return new InsetFoot(params);
@ -260,6 +264,11 @@ Inset * createInset(BufferView * bv, FuncRequest const & cmd)
InsetCollapsable::CollapseStatus st;
InsetERTMailer::string2params(to_utf8(cmd.argument()), st);
return new InsetERT(params, st);
} else if (name == "listings") {
InsetListingsParams par;
InsetListingsMailer::string2params(to_utf8(cmd.argument()), par);
return new InsetListings(params, par);
} else if (name == "external") {
Buffer const & buffer = *bv->buffer();
@ -486,6 +495,8 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
inset.reset(new InsetEnvironment(buf.params(), lex.getString()));
} else if (tmptok == "ERT") {
inset.reset(new InsetERT(buf.params()));
} else if (tmptok == "listings") {
inset.reset(new InsetListings(buf.params()));
} else if (tmptok == "InsetSpace") {
inset.reset(new InsetSpace);
} else if (tmptok == "Tabular") {

View File

@ -86,6 +86,8 @@ docstring const ControlInclude::browse(docstring const & in_name, Type in_type)
break;
case VERBATIM:
break;
case LISTINGS:
break;
}
pair<docstring, docstring> dir1(_("Documents|#o#O"),

View File

@ -34,7 +34,9 @@ public:
///
VERBATIM,
///
INCLUDE
INCLUDE,
///
LISTINGS,
};
///
ControlInclude(Dialog &);

View File

@ -0,0 +1,56 @@
/**
* \file ControlListings.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "ControlListings.h"
#include "FuncRequest.h"
#include "insets/InsetListings.h"
#include "debug.h"
using std::string;
namespace lyx {
namespace frontend {
ControlListings::ControlListings(Dialog & parent)
: Dialog::Controller(parent), params_()
{}
bool ControlListings::initialiseParams(string const & data)
{
InsetListingsMailer::string2params(data, params_);
return true;
}
void ControlListings::clearParams()
{
params_.clear();
}
void ControlListings::dispatchParams()
{
string const lfun = InsetListingsMailer::params2string(params());
kernel().dispatch(FuncRequest(getLfun(), lfun));
}
void ControlListings::setParams(InsetListingsParams const & params)
{
params_ = params;
}
} // namespace frontend
} // namespace lyx

View File

@ -0,0 +1,50 @@
// -*- C++ -*-
/**
* \file ControlListings.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#ifndef CONTROLLISTINGS_H
#define CONTROLLISTINGS_H
#include "Dialog.h"
#include "insets/InsetListingsParams.h"
namespace lyx {
class InsetListingsParams;
namespace frontend {
class ControlListings : public Dialog::Controller {
public:
///
ControlListings(Dialog &);
///
virtual bool initialiseParams(std::string const & data);
/// clean-up on hide.
virtual void clearParams();
/// clean-up on hide.
virtual void dispatchParams();
///
virtual bool isBufferDependent() const { return true; }
///
InsetListingsParams & params() { return params_; }
///
InsetListingsParams const & params() const { return params_; }
///
void setParams(InsetListingsParams const &);
private:
///
InsetListingsParams params_;
};
} // namespace frontend
} // namespace lyx
#endif

View File

@ -52,6 +52,8 @@ libcontrollers_la_SOURCES= \
ControlGraphics.cpp \
ControlGraphics.h \
ControlInclude.cpp \
ControlListings.h \
ControlListings.cpp \
ControlInclude.h \
ControlLog.cpp \
ControlLog.h \

View File

@ -25,6 +25,7 @@
#include "ControlFloat.h"
#include "ControlGraphics.h"
#include "ControlInclude.h"
#include "ControlListings.h"
#include "ControlLog.h"
#include "ControlViewSource.h"
#include "ControlMath.h"
@ -66,6 +67,7 @@
#include "QIndex.h"
#include "QMathMatrixDialog.h"
#include "QNomencl.h"
#include "QListings.h"
#include "QLog.h"
#include "QViewSource.h"
#include "QNote.h"
@ -112,7 +114,7 @@ char const * const dialognames[] = {
"thesaurus",
#endif
"texinfo", "toc", "url", "view-source", "vspace", "wrap" };
"texinfo", "toc", "url", "view-source", "vspace", "wrap", "listings" };
char const * const * const end_dialognames =
dialognames + (sizeof(dialognames) / sizeof(char *));
@ -318,6 +320,10 @@ Dialogs::DialogPtr Dialogs::build(string const & name)
dialog->setController(new ControlWrap(*dialog));
dialog->setView(new QWrap(*dialog));
dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
} else if (name == "listings") {
dialog->setController(new ControlListings(*dialog));
dialog->setView(new QListings(*dialog));
dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
}
return dialog;

View File

@ -47,6 +47,7 @@ libqt4_la_SOURCES = \
QDialogView.cpp QDialogView.h \
QFloat.cpp QFloat.h \
QGraphics.cpp QGraphics.h \
QListings.cpp QListings.h \
QLImage.cpp QLImage.h \
QViewSource.cpp QViewSource.h \
QLPainter.cpp QLPainter.h \

View File

@ -27,6 +27,7 @@ UIFILES = \
IndexUi.ui \
LanguageUi.ui \
LaTeXUi.ui \
ListingsUi.ui \
LogUi.ui \
MarginsUi.ui \
MathMatrixUi.ui \
@ -108,6 +109,7 @@ MOCFILES = \
QIndex.cpp QIndex.h \
QLog.cpp QLog.h \
QViewSource.cpp QViewSource.h \
QListings.cpp QListings.h \
QLMenubar.cpp QLMenubar.h \
QLPopupMenu.cpp QLPopupMenu.h \
QLPrintDialog.cpp QLPrintDialog.h \

View File

@ -36,6 +36,7 @@
#include "TextClassList.h"
#include "Spacing.h"
#include "insets/InsetListingsParams.h"
#include "controllers/ControlDocument.h"
#include "support/lstrings.h"
@ -143,6 +144,11 @@ QDocumentDialog::QDocumentDialog(QDocument * form)
this, SLOT(enableSkip(bool)));
connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
this, SLOT(change_adaptor()));
connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
this, SLOT(change_adaptor()));
connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
this, SLOT(validate_listings_params()));
textLayoutModule->listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
textLayoutModule->lspacingLE));
textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
@ -540,6 +546,26 @@ void QDocumentDialog::change_adaptor()
}
void QDocumentDialog::validate_listings_params()
{
static bool isOK = true;
try {
InsetListingsParams par(fromqstr(textLayoutModule->listingsED->toPlainText()));
if (!isOK) {
isOK = true;
// listingsTB->setTextColor("black");
textLayoutModule->listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
okPB->setEnabled(true);
}
} catch (invalidParam & e) {
isOK = false;
// listingsTB->setTextColor("red");
textLayoutModule->listingsTB->setPlainText(e.what());
okPB->setEnabled(false);
}
}
void QDocumentDialog::closeEvent(QCloseEvent * e)
{
form_->slotWMHide();
@ -864,6 +890,9 @@ void QDocumentDialog::apply(BufferParams & params)
else
params.columns = 1;
// text should have passed validation
params.listings_params = InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
if (textLayoutModule->indentRB->isChecked())
params.paragraph_separation = BufferParams::PARSEP_INDENT;
else
@ -1168,6 +1197,10 @@ void QDocumentDialog::updateParams(BufferParams const & params)
textLayoutModule->twoColumnCB->setChecked(
params.columns == 2);
// break listings_params to multiple lines
string lstparams = InsetListingsParams(params.listings_params).separatedParams();
textLayoutModule->listingsED->setText(toqstr(lstparams));
if (!params.options.empty()) {
latexModule->optionsLE->setText(

View File

@ -68,6 +68,7 @@ public:
public Q_SLOTS:
void updateNumbering();
void change_adaptor();
void validate_listings_params();
void saveDefaultClicked();
void useDefaultsClicked();

View File

@ -21,6 +21,7 @@
#include "LyXRC.h"
#include "insets/InsetListingsParams.h"
#include "controllers/ControlInclude.h"
#include <QPushButton>
@ -57,6 +58,8 @@ QIncludeDialog::QIncludeDialog(QInclude * form)
connect(typeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
connect(typeCO, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
connect(previewCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
connect(listingsED, SIGNAL(textChanged()), this, SLOT(validate_listings_params()));
filenameED->setValidator(new PathValidator(true, filenameED));
setFocusProxy(filenameED);
@ -75,6 +78,26 @@ void QIncludeDialog::change_adaptor()
}
void QIncludeDialog::validate_listings_params()
{
static bool isOK = true;
try {
InsetListingsParams par(fromqstr(listingsED->toPlainText()));
if (!isOK) {
isOK = true;
// listingsTB->setTextColor("black");
listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
okPB->setEnabled(true);
}
} catch (invalidParam & e) {
isOK = false;
// listingsTB->setTextColor("red");
listingsTB->setPlainText(e.what());
okPB->setEnabled(false);
}
}
void QIncludeDialog::closeEvent(QCloseEvent * e)
{
form_->slotWMHide();
@ -91,18 +114,32 @@ void QIncludeDialog::typeChanged(int v)
visiblespaceCB->setChecked(false);
previewCB->setEnabled(false);
previewCB->setChecked(false);
listingsGB->setEnabled(false);
listingsED->setEnabled(false);
break;
//case Input
case 1:
visiblespaceCB->setEnabled(false);
visiblespaceCB->setChecked(false);
previewCB->setEnabled(true);
listingsGB->setEnabled(false);
listingsED->setEnabled(false);
break;
//case listings
case 3:
visiblespaceCB->setEnabled(false);
visiblespaceCB->setChecked(false);
previewCB->setEnabled(false);
listingsGB->setEnabled(true);
listingsED->setEnabled(true);
break;
//case Verbatim
default:
visiblespaceCB->setEnabled(true);
previewCB->setEnabled(false);
previewCB->setChecked(false);
listingsGB->setEnabled(false);
listingsED->setEnabled(false);
break;
}
}
@ -145,6 +182,8 @@ void QInclude::build_dialog()
bcview().addReadOnly(dialog_->browsePB);
bcview().addReadOnly(dialog_->visiblespaceCB);
bcview().addReadOnly(dialog_->typeCO);
bcview().addReadOnly(dialog_->listingsED);
dialog_->listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
addCheckedLineEdit(bcview(), dialog_->filenameED, dialog_->filenameLA);
}
@ -164,11 +203,14 @@ void QInclude::update_contents()
dialog_->visiblespaceCB->setEnabled(false);
dialog_->previewCB->setChecked(false);
dialog_->previewCB->setEnabled(false);
dialog_->listingsGB->setEnabled(false);
dialog_->listingsED->setEnabled(false);
string cmdname = controller().params().getCmdName();
if (cmdname != "include" &&
cmdname != "verbatiminput" &&
cmdname != "verbatiminput*")
cmdname != "verbatiminput*" &&
cmdname != "lstinputlisting")
cmdname = "input";
if (cmdname == "include") {
@ -187,7 +229,14 @@ void QInclude::update_contents()
} else if (cmdname == "verbatiminput") {
dialog_->typeCO->setCurrentIndex(2);
dialog_->visiblespaceCB->setEnabled(true);
}
} else if (cmdname == "lstinputlisting") {
dialog_->typeCO->setCurrentIndex(3);
dialog_->listingsGB->setEnabled(true);
dialog_->listingsED->setEnabled(true);
InsetListingsParams par(params.getOptions());
dialog_->listingsED->setText(toqstr(par.separatedParams()));
}
}
@ -199,15 +248,22 @@ void QInclude::apply()
params.preview(dialog_->previewCB->isChecked());
int const item = dialog_->typeCO->currentIndex();
if (item == 0)
if (item == 0) {
params.setCmdName("include");
else if (item == 1)
params.setOptions(string());
} else if (item == 1) {
params.setCmdName("input");
else {
params.setOptions(string());
} else if (item == 3) {
params.setCmdName("lstinputlisting");
// the parameter string should have passed validation
params.setOptions(InsetListingsParams(fromqstr(dialog_->listingsED->toPlainText())).params());
} else {
if (dialog_->visiblespaceCB->isChecked())
params.setCmdName("verbatiminput*");
else
params.setCmdName("verbatiminput");
params.setOptions(string());
}
controller().setParams(params);
}
@ -222,8 +278,10 @@ void QInclude::browse()
type = ControlInclude::INCLUDE;
else if (item == 1)
type = ControlInclude::INPUT;
else
else if (item == 2)
type = ControlInclude::VERBATIM;
else
type = ControlInclude::LISTINGS;
docstring const & name =
controller().browse(qstring_to_ucs4(dialog_->filenameED->text()), type);

View File

@ -33,6 +33,7 @@ public:
virtual void show();
protected Q_SLOTS:
virtual void change_adaptor();
void validate_listings_params();
virtual void loadClicked();
virtual void browseClicked();
virtual void typeChanged(int v);

View File

@ -0,0 +1,137 @@
/**
* \file QListings.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "QListings.h"
#include "Qt2BC.h"
#include "qt_helpers.h"
#include "controllers/ControlListings.h"
#include "insets/InsetListingsParams.h"
#include "debug.h"
#include "support/convert.h"
#include "support/lstrings.h"
#include <QLineEdit>
#include <QCloseEvent>
#include <QPushButton>
using std::string;
namespace lyx {
namespace frontend {
/////////////////////////////////////////////////////////////////////
//
// QListingsDialog
//
/////////////////////////////////////////////////////////////////////
QListingsDialog::QListingsDialog(QListings * form)
: form_(form)
{
setupUi(this);
connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
connect(inlineCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
connect(listingsED, SIGNAL(textChanged()), this, SLOT(validate_listings_params()));
}
void QListingsDialog::closeEvent(QCloseEvent * e)
{
form_->slotWMHide();
e->accept();
}
void QListingsDialog::change_adaptor()
{
form_->changed();
}
void QListingsDialog::validate_listings_params()
{
static bool isOK = true;
try {
InsetListingsParams par(fromqstr(listingsED->toPlainText()));
if (!isOK) {
isOK = true;
// listingsTB->setTextColor("black");
listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
okPB->setEnabled(true);
}
} catch (invalidParam & e) {
isOK = false;
// listingsTB->setTextColor("red");
listingsTB->setPlainText(e.what());
okPB->setEnabled(false);
}
}
/////////////////////////////////////////////////////////////////////
//
// QListings
//
/////////////////////////////////////////////////////////////////////
typedef QController<ControlListings, QView<QListingsDialog> > wrap_base_class;
QListings::QListings(Dialog & parent)
: wrap_base_class(parent, _("Program Listings Settings"))
{
}
void QListings::build_dialog()
{
dialog_.reset(new QListingsDialog(this));
bcview().setOK(dialog_->okPB);
bcview().setCancel(dialog_->closePB);
dialog_->listingsTB->setPlainText("Input listings parameters below. Enter ? for a list of parameters.");
update_contents();
}
/// not used right now.
void QListings::apply()
{
InsetListingsParams & params = controller().params();
params.setInline(dialog_->inlineCB->isChecked());
params.setParams(fromqstr(dialog_->listingsED->toPlainText()));
controller().setParams(params);
}
void QListings::update_contents()
{
InsetListingsParams & params = controller().params();
dialog_->listingsED->setText(toqstr(params.separatedParams()));
if (params.isInline())
dialog_->inlineCB->setChecked(true);
else
dialog_->inlineCB->setChecked(false);
}
} // namespace frontend
} // namespace lyx
#include "QListings_moc.cpp"

View File

@ -0,0 +1,61 @@
// -*- C++ -*-
/**
* \file QListings.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#ifndef QLISTINGS_H
#define QLISTINGS_H
#include "QDialogView.h"
#include "ui/ListingsUi.h"
#include <QDialog>
#include <QCloseEvent>
namespace lyx {
namespace frontend {
class QListings;
class QListingsDialog : public QDialog, public Ui::QListingsUi {
Q_OBJECT
public:
QListingsDialog(QListings * form);
protected Q_SLOTS:
virtual void change_adaptor();
/// AFAIK, QValidator only works for QLineEdit so
/// I have to validate listingsED (QTextEdit) manually.
void validate_listings_params();
protected:
virtual void closeEvent(QCloseEvent * e);
private:
QListings * form_;
};
class ControlListings;
class QListings : public QController<ControlListings, QView<QListingsDialog> > {
public:
friend class QListingsDialog;
QListings(Dialog &);
private:
/// Apply changes
virtual void apply();
/// update
virtual void update_contents();
/// build the dialog
virtual void build_dialog();
};
} // namespace frontend
} // namespace lyx
#endif // QLISTINGS_H

View File

@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>386</width>
<height>171</height>
<width>416</width>
<height>373</height>
</rect>
</property>
<property name="windowTitle" >
@ -15,194 +15,325 @@
<property name="sizeGripEnabled" >
<bool>true</bool>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<number>9</number>
<widget class="QWidget" name="" >
<property name="geometry" >
<rect>
<x>9</x>
<y>9</y>
<width>401</width>
<height>361</height>
</rect>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item row="3" column="0" colspan="2" >
<widget class="QCheckBox" name="previewCB" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Show LaTeX preview</string>
</property>
<property name="text" >
<string>&amp;Show preview</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2" >
<widget class="QCheckBox" name="visiblespaceCB" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Underline spaces in generated output</string>
</property>
<property name="text" >
<string>&amp;Mark spaces in output</string>
</property>
</widget>
</item>
<item rowspan="2" row="2" column="2" colspan="3" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>130</width>
<height>50</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1" colspan="3" >
<widget class="QLineEdit" name="filenameED" >
<property name="toolTip" >
<string>File name to include</string>
</property>
</widget>
</item>
<item row="1" column="4" >
<widget class="QPushButton" name="loadPB" >
<property name="toolTip" >
<string>Load the file</string>
</property>
<property name="text" >
<string>&amp;Load</string>
</property>
</widget>
</item>
<item row="1" column="3" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>28</width>
<height>28</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1" colspan="2" >
<widget class="QComboBox" name="typeCO" >
<item>
<property name="text" >
<string>Include</string>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
</item>
<item>
<property name="text" >
<string>Input</string>
<property name="spacing" >
<number>6</number>
</property>
</item>
<item>
<property name="text" >
<string>Verbatim</string>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QLabel" name="filenameLA" >
<property name="toolTip" >
<string/>
</property>
<property name="text" >
<string>&amp;File:</string>
</property>
<property name="buddy" >
<cstring>filenameED</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="filenameED" >
<property name="toolTip" >
<string>File name to include</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QLabel" name="TextLabel1" >
<property name="text" >
<string>&amp;Include Type:</string>
</property>
<property name="buddy" >
<cstring>typeCO</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="typeCO" >
<item>
<property name="text" >
<string>Include</string>
</property>
</item>
<item>
<property name="text" >
<string>Input</string>
</property>
</item>
<item>
<property name="text" >
<string>Verbatim</string>
</property>
</item>
<item>
<property name="text" >
<string>Listings</string>
</property>
</item>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>28</width>
<height>28</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QPushButton" name="browsePB" >
<property name="toolTip" >
<string>Select a file</string>
</property>
<property name="text" >
<string>&amp;Browse...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="loadPB" >
<property name="toolTip" >
<string>Load the file</string>
</property>
<property name="text" >
<string>&amp;Load</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
</item>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="TextLabel1" >
<property name="text" >
<string>&amp;Include Type:</string>
</property>
<property name="buddy" >
<cstring>typeCO</cstring>
</property>
</widget>
</item>
<item row="0" column="4" >
<widget class="QPushButton" name="browsePB" >
<property name="toolTip" >
<string>Select a file</string>
</property>
<property name="text" >
<string>&amp;Browse...</string>
</property>
</widget>
</item>
<item row="0" column="0" >
<widget class="QLabel" name="filenameLA" >
<property name="toolTip" >
<string/>
</property>
<property name="text" >
<string>&amp;File:</string>
</property>
<property name="buddy" >
<cstring>filenameED</cstring>
</property>
</widget>
</item>
<item row="4" column="0" colspan="5" >
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okPB" >
<property name="text" >
<string>&amp;OK</string>
</property>
<property name="default" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="closePB" >
<property name="text" >
<string>&amp;Close</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QGroupBox" name="includeGB" >
<property name="title" >
<string/>
</property>
<widget class="QCheckBox" name="previewCB" >
<property name="geometry" >
<rect>
<x>10</x>
<y>20</y>
<width>100</width>
<height>23</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Show LaTeX preview</string>
</property>
<property name="text" >
<string>&amp;Show preview</string>
</property>
</widget>
<widget class="QCheckBox" name="visiblespaceCB" >
<property name="geometry" >
<rect>
<x>10</x>
<y>50</y>
<width>142</width>
<height>23</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Underline spaces in generated output</string>
</property>
<property name="text" >
<string>&amp;Mark spaces in output</string>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="listingsGB" >
<property name="title" >
<string>Listing Params</string>
</property>
<widget class="QTextEdit" name="listingsED" >
<property name="geometry" >
<rect>
<x>10</x>
<y>100</y>
<width>171</width>
<height>121</height>
</rect>
</property>
</widget>
<widget class="QTextBrowser" name="listingsTB" >
<property name="geometry" >
<rect>
<x>10</x>
<y>20</y>
<width>171</width>
<height>71</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>4</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="cursor" >
<cursor>14</cursor>
</property>
<property name="acceptDrops" >
<bool>false</bool>
</property>
<property name="frameShape" >
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow" >
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth" >
<number>0</number>
</property>
<property name="acceptRichText" >
<bool>false</bool>
</property>
</widget>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okPB" >
<property name="text" >
<string>&amp;OK</string>
</property>
<property name="default" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="closePB" >
<property name="text" >
<string>&amp;Close</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<tabstops>
<tabstop>filenameED</tabstop>

View File

@ -0,0 +1,160 @@
<ui version="4.0" >
<class>QListingsUi</class>
<widget class="QDialog" name="QListingsUi" >
<property name="windowModality" >
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>451</width>
<height>392</height>
</rect>
</property>
<property name="windowTitle" >
<string>Listing</string>
</property>
<property name="sizeGripEnabled" >
<bool>true</bool>
</property>
<widget class="QWidget" name="layoutWidget" >
<property name="geometry" >
<rect>
<x>10</x>
<y>10</y>
<width>431</width>
<height>371</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QCheckBox" name="inlineCB" >
<property name="text" >
<string>Inlined listing (\lstinline)</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="listingsGB" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>7</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title" >
<string>Parameters</string>
</property>
<widget class="QTextEdit" name="listingsED" >
<property name="geometry" >
<rect>
<x>10</x>
<y>100</y>
<width>411</width>
<height>171</height>
</rect>
</property>
</widget>
<widget class="QTextBrowser" name="listingsTB" >
<property name="geometry" >
<rect>
<x>10</x>
<y>20</y>
<width>411</width>
<height>71</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>4</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="cursor" >
<cursor>14</cursor>
</property>
<property name="acceptDrops" >
<bool>false</bool>
</property>
<property name="frameShape" >
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow" >
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth" >
<number>0</number>
</property>
<property name="acceptRichText" >
<bool>false</bool>
</property>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>101</width>
<height>27</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okPB" >
<property name="text" >
<string>OK</string>
</property>
<property name="default" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="closePB" >
<property name="text" >
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<tabstops>
<tabstop>okPB</tabstop>
<tabstop>closePB</tabstop>
</tabstops>
<includes>
<include location="local" >qt_helpers.h</include>
</includes>
<resources/>
<connections/>
</ui>

View File

@ -1,202 +1,316 @@
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>TextLayoutUi</class>
<widget class="QWidget" name="TextLayoutUi" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>287</width>
<height>208</height>
<width>449</width>
<height>517</height>
</rect>
</property>
<property name="windowTitle" >
<string/>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<number>9</number>
<widget class="QWidget" name="" >
<property name="geometry" >
<rect>
<x>9</x>
<y>10</y>
<width>399</width>
<height>511</height>
</rect>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item row="1" column="2" >
<widget class="QLineEdit" name="lspacingLE" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QComboBox" name="lspacingCO" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="duplicatesEnabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="lspacingL" >
<property name="text" >
<string>&amp;Line spacing:</string>
</property>
<property name="buddy" >
<cstring>lspacingCO</cstring>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3" >
<widget class="QGroupBox" name="ButtonGroup6" >
<property name="title" >
<string>Separate Paragraphs With</string>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<number>9</number>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QGroupBox" name="ButtonGroup6" >
<property name="title" >
<string>Separate Paragraphs With</string>
</property>
<property name="spacing" >
<number>6</number>
<layout class="QGridLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item row="2" column="1" >
<widget class="QComboBox" name="skipCO" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="2" colspan="2" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>178</width>
<height>22</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="3" >
<widget class="LengthCombo" native="1" name="skipLengthCO" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2" >
<widget class="QLineEdit" name="skipLE" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item rowspan="2" row="2" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<size>
<width>31</width>
<height>58</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="4" >
<widget class="QRadioButton" name="skipRB" >
<property name="toolTip" >
<string/>
</property>
<property name="text" >
<string>&amp;Vertical space</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="4" >
<widget class="QRadioButton" name="indentRB" >
<property name="toolTip" >
<string>Indent consecutive paragraphs</string>
</property>
<property name="text" >
<string>&amp;Indentation</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<string>Spacing</string>
</property>
<item row="2" column="1" >
<widget class="QComboBox" name="skipCO" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="2" colspan="2" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>178</width>
<height>22</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="3" >
<widget class="LengthCombo" name="skipLengthCO" >
<property name="enabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2" >
<widget class="QLineEdit" name="skipLE" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item rowspan="2" row="2" column="0" >
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<size>
<width>31</width>
<height>58</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="4" >
<widget class="QRadioButton" name="skipRB" >
<property name="toolTip" >
<string/>
</property>
<property name="text" >
<string>&amp;Vertical space</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="4" >
<widget class="QRadioButton" name="indentRB" >
<property name="toolTip" >
<string>Indent consecutive paragraphs</string>
</property>
<property name="text" >
<string>&amp;Indentation</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="3" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="3" >
<widget class="QCheckBox" name="twoColumnCB" >
<property name="toolTip" >
<string>Format text into two columns</string>
</property>
<property name="text" >
<string>Two-&amp;column document</string>
</property>
</widget>
</item>
</layout>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QLabel" name="lspacingL" >
<property name="text" >
<string>&amp;Line spacing:</string>
</property>
<property name="buddy" >
<cstring>lspacingCO</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="lspacingCO" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="duplicatesEnabled" >
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lspacingLE" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="twoColumnCB" >
<property name="toolTip" >
<string>Format text into two columns</string>
</property>
<property name="text" >
<string>Two-&amp;column document</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="listingsGB" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>0</width>
<height>150</height>
</size>
</property>
<property name="layoutDirection" >
<enum>Qt::LeftToRight</enum>
</property>
<property name="title" >
<string>Listings settings</string>
</property>
<widget class="QTextBrowser" name="listingsTB" >
<property name="geometry" >
<rect>
<x>10</x>
<y>70</y>
<width>371</width>
<height>71</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>4</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="cursor" >
<cursor>14</cursor>
</property>
<property name="acceptDrops" >
<bool>false</bool>
</property>
<property name="frameShape" >
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow" >
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth" >
<number>0</number>
</property>
<property name="acceptRichText" >
<bool>false</bool>
</property>
</widget>
<widget class="QTextEdit" name="listingsED" >
<property name="geometry" >
<rect>
<x>10</x>
<y>20</y>
<width>371</width>
<height>75</height>
</rect>
</property>
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>397</width>
<height>27</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
<pixmapfunction></pixmapfunction>
<includes>
<include location="local" >qt_helpers.h</include>
</includes>
<customwidgets>
<customwidget>
<class>LengthCombo</class>
<extends>QWidget</extends>
<header>LengthCombo.h</header>
<container>0</container>
<pixmap></pixmap>
</customwidget>
</customwidgets>
<tabstops>
@ -208,6 +322,9 @@
<tabstop>lspacingLE</tabstop>
<tabstop>twoColumnCB</tabstop>
</tabstops>
<includes>
<include location="local" >qt_helpers.h</include>
</includes>
<resources/>
<connections/>
</ui>

View File

@ -99,6 +99,7 @@ static TranslatorMap const build_translator()
InsetName("charstyle", Inset::CHARSTYLE_CODE),
InsetName("vspace", Inset::VSPACE_CODE),
InsetName("mathmacroarg", Inset::MATHMACROARG_CODE),
InsetName("listings", Inset::LISTINGS_CODE),
};
std::size_t const insetnames_size =

View File

@ -348,7 +348,9 @@ public:
///
NOMENCL_PRINT_CODE,
///
PAGEBREAK_CODE
PAGEBREAK_CODE,
///
LISTINGS_CODE
};
/** returns the Code corresponding to the \c name.

View File

@ -113,6 +113,13 @@ InsetCommandParams::findInfo(std::string const & name)
return &info;
}
if (name == "lstinputlisting") {
static const char * const paramnames[] = {"filename", "lstparams", ""};
static const bool isoptional[] = {false, true};
static const CommandInfo info = {2, paramnames, isoptional};
return &info;
}
// InsetIndex, InsetPrintIndex, InsetLabel
if (name == "index" || name == "printindex" || name == "label") {
static const char * const paramnames[] = {"name", ""};

View File

@ -38,9 +38,9 @@ public:
docstring const getCommand() const;
/// Return the command name
std::string const & getCmdName() const { return name_; }
private:
/// FIXME remove
/// this is used by listings package.
std::string const getOptions() const;
private:
/// FIXME remove
std::string const getSecOptions() const;
public:
@ -50,9 +50,9 @@ public:
/// are cleared except those that exist also in the new command.
/// What matters here is the parameter name, not position.
void setCmdName(std::string const & n);
private:
/// FIXME remove
/// this is used by the listings package
void setOptions(std::string const &);
private:
/// FIXME remove
void setSecOptions(std::string const &);
public:

View File

@ -39,6 +39,7 @@
#include "graphics/PreviewLoader.h"
#include "insets/RenderPreview.h"
#include "insets/InsetListingsParams.h"
#include "support/filetools.h"
#include "support/lstrings.h" // contains
@ -179,7 +180,8 @@ enum Types {
INCLUDE = 0,
VERB = 1,
INPUT = 2,
VERBAST = 3
VERBAST = 3,
LISTINGS = 4,
};
@ -193,6 +195,8 @@ Types type(InsetCommandParams const & params)
return VERB;
if (command_name == "verbatiminput*")
return VERBAST;
if (command_name == "lstinputlisting")
return LISTINGS;
return INCLUDE;
}
@ -205,6 +209,12 @@ bool isVerbatim(InsetCommandParams const & params)
}
bool isListings(InsetCommandParams const & params)
{
return params.getCmdName() == "lstinputlisting";
}
string const masterFilename(Buffer const & buffer)
{
return buffer.getMasterBuffer()->fileName();
@ -311,6 +321,9 @@ docstring const InsetInclude::getScreenLabel(Buffer const & buf) const
case INCLUDE:
temp += buf.B_("Include");
break;
case LISTINGS:
temp += buf.B_("Program Listing");
break;
}
temp += ": ";
@ -329,7 +342,7 @@ namespace {
/// return the child buffer if the file is a LyX doc and is loaded
Buffer * getChildBuffer(Buffer const & buffer, InsetCommandParams const & params)
{
if (isVerbatim(params))
if (isVerbatim(params) || isListings(params))
return 0;
string const included_file = includedFilename(buffer, params).absFilename();
@ -343,7 +356,7 @@ Buffer * getChildBuffer(Buffer const & buffer, InsetCommandParams const & params
/// return true if the file is or got loaded.
bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
{
if (isVerbatim(params))
if (isVerbatim(params) || isListings(params))
return false;
FileName const included_file = includedFilename(buffer, params);
@ -478,6 +491,14 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
os << '\\' << from_ascii(params_.getCmdName())
<< '{' << from_utf8(incfile) << '}';
}
} else if (type(params_) == LISTINGS) {
os << '\\' << from_ascii(params_.getCmdName());
string opt = params_.getOptions();
// opt is set in QInclude dialog and should have passed validation.
InsetListingsParams params(opt);
if (!params.params().empty())
os << "[" << from_utf8(params.encodedString()) << "]";
os << '{' << from_utf8(incfile) << '}';
} else {
runparams.exportdata->addExternalFile(tex_format, writefile,
exportfile);
@ -498,7 +519,7 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
int InsetInclude::plaintext(Buffer const & buffer, odocstream & os,
OutputParams const &) const
{
if (isVerbatim(params_)) {
if (isVerbatim(params_) || isListings(params_)) {
os << '[' << getScreenLabel(buffer) << '\n';
// FIXME: We don't know the encoding of the file
docstring const str =
@ -550,7 +571,7 @@ int InsetInclude::docbook(Buffer const & buffer, odocstream & os,
runparams.exportdata->addExternalFile("docbook-xml", writefile,
exportfile);
if (isVerbatim(params_)) {
if (isVerbatim(params_) || isListings(params_)) {
os << "<inlinegraphic fileref=\""
<< '&' << include_label << ';'
<< "\" format=\"linespecific\">";
@ -575,7 +596,7 @@ void InsetInclude::validate(LaTeXFeatures & features) const
else
writefile = included_file;
if (!features.runparams().nice && !isVerbatim(params_)) {
if (!features.runparams().nice && !isVerbatim(params_) && !isListings(params_)) {
incfile = DocFileName(writefile).mangledFilename();
writefile = makeAbsPath(incfile,
buffer.getMasterBuffer()->temppath()).absFilename();
@ -585,6 +606,8 @@ void InsetInclude::validate(LaTeXFeatures & features) const
if (isVerbatim(params_))
features.require("verbatim");
else if (isListings(params_))
features.require("listings");
// Here we must do the fun stuff...
// Load the file in the include if it needs

View File

@ -0,0 +1,285 @@
/**
* \file InsetListings.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "InsetListings.h"
#include "Language.h"
#include "gettext.h"
#include "DispatchResult.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
#include "Cursor.h"
#include "support/lstrings.h"
#include <sstream>
namespace lyx {
using support::token;
using std::auto_ptr;
using std::istringstream;
using std::ostream;
using std::ostringstream;
using std::string;
void InsetListings::init()
{
// FIXME: define Color::listing?
Font font(Font::ALL_SANE);
font.decSize();
font.decSize();
font.setColor(Color::foreground);
setLabelFont(font);
// FIXME: english_language?
text_.current_font.setLanguage(english_language);
text_.real_current_font.setLanguage(english_language);
// FIXME: why I can not make text of source code black with the following two lines?
text_.current_font.setColor(Color::foreground);
text_.real_current_font.setColor(Color::foreground);
}
InsetListings::InsetListings(BufferParams const & bp, InsetListingsParams const & par)
: InsetERT(bp, par.status())
{
init();
}
InsetListings::InsetListings(InsetListings const & in)
: InsetERT(in)
{
init();
}
auto_ptr<Inset> InsetListings::doClone() const
{
return auto_ptr<Inset>(new InsetListings(*this));
}
InsetListings::~InsetListings()
{
InsetListingsMailer(*this).hideDialog();
}
bool InsetListings::display() const
{
return !params().isInline();
}
void InsetListings::write(Buffer const & buf, ostream & os) const
{
os << "listings" << "\n";
InsetListingsParams const & par = params();
// parameter string is encoded to be a valid lyx token.
string opt = par.encodedString();
if (!opt.empty())
os << "lstparams \"" << opt << "\"\n";
if (par.isInline())
os << "inline true\n";
else
os << "inline false\n";
InsetCollapsable::write(buf, os);
}
void InsetListings::read(Buffer const & buf, Lexer & lex)
{
while (lex.isOK()) {
lex.next();
string const token = lex.getString();
if (token == "lstparams") {
lex.next();
string const value = lex.getString();
params().fromEncodedString(value);
} else if (token == "inline") {
lex.next();
params().setInline(lex.getBool());
} else {
// no special option, push back 'status' etc
lex.pushToken(token);
break;
}
}
InsetCollapsable::read(buf, lex);
}
docstring const InsetListings::editMessage() const
{
return _("Opened Listings Inset");
}
int InsetListings::latex(Buffer const &, odocstream & os,
OutputParams const &) const
{
string param_string = params().encodedString();
// 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 {
if (param_string.empty())
os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}\n";
else
os << "\n\\begingroup\n\\inputencoding{latin1}\n\\begin{lstlisting}[" << from_ascii(param_string) << "]\n";
lines += 4;
}
ParagraphList::const_iterator par = paragraphs().begin();
ParagraphList::const_iterator end = paragraphs().end();
while (par != end) {
pos_type siz = par->size();
for (pos_type i = 0; i < siz; ++i) {
// ignore all struck out text
if (par->isDeleted(i))
continue;
os.put(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) {
os << "\n";
++lines;
}
}
if (lstinline)
os << "}";
else {
os << "\n\\end{lstlisting}\n\\endgroup\n";
lines += 3;
}
return lines;
}
void InsetListings::doDispatch(Cursor & cur, FuncRequest & cmd)
{
switch (cmd.action) {
case LFUN_INSET_MODIFY: {
InsetListingsMailer::string2params(to_utf8(cmd.argument()), params());
break;
}
case LFUN_INSET_DIALOG_UPDATE:
InsetListingsMailer(*this).updateDialog(&cur.bv());
break;
case LFUN_MOUSE_RELEASE: {
if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
InsetListingsMailer(*this).showDialog(&cur.bv());
break;
}
InsetERT::doDispatch(cur, cmd);
break;
}
default:
InsetERT::doDispatch(cur, cmd);
break;
}
}
bool InsetListings::getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus & status) const
{
switch (cmd.action) {
case LFUN_INSET_DIALOG_UPDATE:
status.enabled(true);
return true;
default:
return InsetERT::getStatus(cur, cmd, status);
}
}
void InsetListings::setButtonLabel()
{
// FIXME UNICODE
setLabel(isOpen() ? _("Listings") : getNewLabel(_("Listings")));
}
void InsetListings::validate(LaTeXFeatures & features) const
{
features.require("listings");
InsetERT::validate(features);
}
bool InsetListings::showInsetDialog(BufferView * bv) const
{
InsetListingsMailer(const_cast<InsetListings &>(*this)).showDialog(bv);
return true;
}
void InsetListings::getDrawFont(Font & font) const
{
font = Font(Font::ALL_INHERIT, english_language);
font.setFamily(Font::TYPEWRITER_FAMILY);
font.setColor(Color::foreground);
}
string const InsetListingsMailer::name_("listings");
InsetListingsMailer::InsetListingsMailer(InsetListings & inset)
: inset_(inset)
{}
string const InsetListingsMailer::inset2string(Buffer const &) const
{
return params2string(inset_.params());
}
void InsetListingsMailer::string2params(string const & in,
InsetListingsParams & params)
{
params = InsetListingsParams();
if (in.empty())
return;
istringstream data(in);
Lexer lex(0, 0);
lex.setStream(data);
// discard "listings", which is only used to determine inset
lex.next();
params.read(lex);
}
string const
InsetListingsMailer::params2string(InsetListingsParams const & params)
{
ostringstream data;
data << name_ << " ";
params.write(data);
return data.str();
}
} // namespace lyx

View File

@ -0,0 +1,99 @@
// -*- C++ -*-
/**
* \file InsetListings.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#ifndef INSETLISTINGS_H
#define INSETLISTINGS_H
#include "LaTeXFeatures.h"
#include "InsetERT.h"
#include "InsetListingsParams.h"
#include "MailInset.h"
namespace lyx {
/** A collapsable text inset for program listings.
*/
class InsetListings : public InsetERT {
public:
///
InsetListings(BufferParams const &, InsetListingsParams const & par = InsetListingsParams());
///
~InsetListings();
///
Inset::Code lyxCode() const { return Inset::LISTINGS_CODE; }
/// lstinline is inlined, normal listing is displayed
virtual bool display() const;
///
docstring name() const { return from_ascii("Listings"); }
///
void write(Buffer const & buf, std::ostream & os) const;
///
void read(Buffer const & buf, Lexer & lex);
///
virtual docstring const editMessage() const;
///
int latex(Buffer const &, odocstream &, OutputParams const &) const;
///
void validate(LaTeXFeatures &) const;
///
bool showInsetDialog(BufferView *) const;
///
void getDrawFont(Font &) const;
///
InsetListingsParams const & params() const { return params_; }
///
InsetListingsParams & params() { return params_; }
protected:
InsetListings(InsetListings const &);
///
virtual void doDispatch(Cursor & cur, FuncRequest & cmd);
///
bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const;
private:
virtual std::auto_ptr<Inset> doClone() const;
///
void init();
///
void setButtonLabel();
///
InsetListingsParams params_;
};
class InsetListingsMailer : public MailInset {
public:
///
InsetListingsMailer(InsetListings & inset);
///
virtual Inset & inset() const { return inset_; }
///
virtual std::string const & name() const { return name_; }
///
virtual std::string const inset2string(Buffer const &) const;
///
static void string2params(std::string const &,
InsetListingsParams &);
///
static std::string const params2string(InsetListingsParams const &);
private:
///
static std::string const name_;
///
InsetListings & inset_;
};
} // namespace lyx
#endif

View File

@ -0,0 +1,523 @@
/**
* \file InsetListingsParams.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "Lexer.h"
#include "InsetListingsParams.h"
#include "gettext.h"
#include "Length.h"
#include <sstream>
#include <boost/assert.hpp>
#include "support/lstrings.h"
#include "support/convert.h"
using std::vector;
using std::ostream;
using std::string;
using std::exception;
using lyx::support::trim;
namespace lyx
{
enum param_type {
ALL,
TRUEFALSE,
INTEGER,
LENGTH,
ONEOF,
SUBSETOF,
};
/** Information about each parameter
*/
struct listings_param_info {
/// name of the parameter
char const * name;
/// default value
char const * value;
// for option with value "true", "false",
// if onoff is true,
// "true": option
// "false":
// "other": option="other"
// onoff is false,
// "true": option=true
// "false": option=false
bool onoff;
/// validator type
param_type type;
// ALL:
// TRUEFALSE:
// INTEGER:
// LENGTH:
// info is ignored.
// ONEOF
// info is a \n separated string with allowed values
// SUBSETOF
// info is a string from which par is composed of
// (e.g. floatplacement can be one or more of tbph)
char const * info;
//
char const * hint;
};
char const * allowed_languages =
"no language\nBAP\nACSL\nAda\nALGOL\nC\nC++\nCaml\nClean\nCobol\n"
"Comal 80\ncsh\nDelphi\nEiffel\nElan\nEuphoria\nFortran\nHaskell\n"
"HTML\nIDL\nJava\nLisp\nLogo\nmake\nMathematica\nMatlab\nMercury\n"
"Miranda\nML\nModula-2\nOberon-2\nOCL\nPascal\nPerl\nPHP\nPL/I\nPOV\n"
"Python\nProlog\nR\nS\nSAS\nSHELXL\nSimula\ntcl\nSQL\nTeX\nVBScript\n"
"VHDL\nXML";
char const * style_hint = "Use \\footnotessize, \\small, \\itshape, \\ttfamily or something like that";
char const * frame_hint = "none, leftline, topline, bottomline, lines, single, shadowbox or subset of trblTRBL";
char const * frameround_hint = "The foru letters (t or f) attached to top right, bottom right, bottom left and top left corner.";
char const * color_hint = "Enter something like \\color{white}";
/// options copied from page 26 of listings manual
// FIXME: add default parameters ... (which is not used now)
listings_param_info const listings_param_table[] = {
{ "float", "false", true, SUBSETOF, "tbph", "" },
{ "floatplacement", "tbp", false, SUBSETOF, "tbph", "" },
{ "aboveskip", "\\medskipamount", false, LENGTH, "", "" },
{ "belowskip", "\\medskipamount", false, LENGTH, "", "" },
{ "lineskip", "", false, LENGTH, "", "" },
{ "boxpos", "", false, SUBSETOF, "bct", "" },
{ "print", "", false, TRUEFALSE, "", "" },
{ "firstline", "", false, INTEGER, "", "" },
{ "lastline", "", false, INTEGER, "", "" },
{ "showlines", "", false, TRUEFALSE, "", "" },
{ "emptylines", "", false, ALL, "", "Expect a number with an optional * before it" },
{ "gobble", "", false, INTEGER, "", "" },
{ "style", "", false, ALL, "", "" },
{ "language", "", false, ONEOF, allowed_languages, "" },
{ "alsolanguage", "", false, ONEOF, allowed_languages, "" },
{ "defaultdialect", "", false, ONEOF, allowed_languages, "" },
{ "printpod", "", false, TRUEFALSE, "", "" },
{ "usekeywordsintag", "", false, TRUEFALSE, "", "" },
{ "tagstyle", "", false, ALL, "", style_hint },
{ "markfirstintag", "", false, ALL, "", style_hint },
{ "makemacrouse", "", false, TRUEFALSE, "", "" },
{ "basicstyle", "", false, ALL, "", style_hint },
{ "identifierstyle", "", false, ALL, "", style_hint },
{ "commentstyle", "", false, ALL, "", style_hint },
{ "stringstyle", "", false, ALL, "", style_hint },
{ "keywordstyle", "", false, ALL, "", style_hint },
{ "ndkeywordstyle", "", false, ALL, "", style_hint },
{ "classoffset", "", false, INTEGER, "", "" },
{ "texcsstyle", "", false, ALL, "", style_hint },
{ "directivestyle", "", false, ALL, "", style_hint },
{ "emph", "", false, ALL, "", "" },
{ "moreemph", "", false, ALL, "", "" },
{ "deleteemph", "", false, ALL, "", "" },
{ "emphstyle", "", false, ALL, "", "" },
{ "delim", "", false, ALL, "", "" },
{ "moredelim", "", false, ALL, "", "" },
{ "deletedelim", "", false, ALL, "", "" },
{ "extendedchars", "", false, TRUEFALSE, "", "" },
{ "inputencoding", "", false, ALL, "", "" },
{ "upquote", "", false, TRUEFALSE, "", "" },
{ "tabsize", "", false, INTEGER, "", "" },
{ "showtabs", "", false, ALL, "", "" },
{ "tab", "", false, ALL, "", "" },
{ "showspaces", "", false, TRUEFALSE, "", "" },
{ "showstringspaces", "", false, TRUEFALSE, "", "" },
{ "formfeed", "", false, ALL, "", "" },
{ "numbers", "", false, ONEOF, "none\nleft\nright", "" },
{ "stepnumber", "", false, INTEGER, "", "" },
{ "numberfirstline", "", false, TRUEFALSE, "", "" },
{ "numberstyle", "", false, ALL, "", style_hint },
{ "numbersep", "", false, LENGTH, "", "" },
{ "numberblanklines", "", false, ALL, "", "" },
{ "firstnumber", "", false, ALL, "", "auto, last or a number" },
{ "name", "", false, ALL, "", "" },
{ "thelstnumber", "", false, ALL, "", "" },
{ "title", "", false, ALL, "", "" },
{ "caption", "", false, ALL, "", "" },
{ "label", "", false, ALL, "", "" },
{ "nolol", "", false, TRUEFALSE, "", "" },
{ "captionpos", "", false, SUBSETOF, "tb", "" },
{ "abovecaptionskip", "", false, LENGTH, "", "" },
{ "belowcaptionskip", "", false, LENGTH, "", "" },
{ "linewidth", "", false, LENGTH, "", "" },
{ "xleftmargin", "", false, LENGTH, "", "" },
{ "xrightmargin", "", false, LENGTH, "", "" },
{ "resetmargin", "", false, TRUEFALSE, "", "" },
{ "breaklines", "", false, TRUEFALSE, "", "" },
{ "prebreak", "", false, ALL, "", "" },
{ "postbreak", "", false, ALL, "", "" },
{ "breakindent", "", false, LENGTH, "", "" },
{ "breakautoindent", "", false, TRUEFALSE, "", "" },
{ "frame", "", false, ALL, "", frame_hint },
{ "frameround", "", false, SUBSETOF, "tf", frameround_hint },
{ "framesep", "", false, LENGTH, "", "" },
{ "rulesep", "", false, LENGTH, "", "" },
{ "framerule", "", false, LENGTH, "", "" },
{ "framexleftmargin", "", false, LENGTH, "", "" },
{ "framexrightmargin", "", false, LENGTH, "", "" },
{ "framextopmargin", "", false, LENGTH, "", "" },
{ "framexbottommargin", "", false, LENGTH, "", "" },
{ "backgroundcolor", "", false, ALL, "", color_hint },
{ "rulecolor", "", false, ALL, "", color_hint },
{ "fillcolor", "", false, ALL, "", color_hint },
{ "rulesepcolor", "", false, ALL, "", color_hint },
{ "frameshape", "", false, ALL, "", "" },
{ "index", "", false, ALL, "", "" },
{ "moreindex", "", false, ALL, "", "" },
{ "deleteindex", "", false, ALL, "", "" },
{ "indexstyle", "", false, ALL, "", "" },
{ "columns", "", false, ALL, "", "" },
{ "flexiblecolumns", "", false, ALL, "", "" },
{ "keepspaces", "", false, TRUEFALSE, "", "" },
{ "basewidth", "", false, LENGTH, "", "" },
{ "fontadjust", "", true, TRUEFALSE, "", "" },
{ "texcl", "", false, TRUEFALSE, "", "" },
{ "mathescape", "", false, TRUEFALSE, "", "" },
{ "escapechar", "", false, ALL, "", "" },
{ "escapeinside", "", false, ALL, "", "" },
{ "escepeinside", "", false, ALL, "", "" },
{ "escepebegin", "", false, ALL, "", "" },
{ "escepeend", "", false, ALL, "", "" },
{ "fancyvrb", "", false, TRUEFALSE, "", "" },
{ "fvcmdparams", "", false, ALL, "", "" },
{ "morefvcmdparams", "", false, ALL, "", "" },
{ "keywordsprefix", "", false, ALL, "", "" },
{ "keywords", "", false, ALL, "", "" },
{ "morekeywords", "", false, ALL, "", "" },
{ "deletekeywords", "", false, ALL, "", "" },
{ "ndkeywords", "", false, ALL, "", "" },
{ "morendkeywords", "", false, ALL, "", "" },
{ "deletendkeywords", "", false, ALL, "", "" },
{ "texcs", "", false, ALL, "", "" },
{ "moretexcs", "", false, ALL, "", "" },
{ "deletetexcs", "", false, ALL, "", "" },
{ "directives", "", false, ALL, "", "" },
{ "moredirectives", "", false, ALL, "", "" },
{ "deletedirectives", "", false, ALL, "", "" },
{ "sensitive", "", false, ALL, "", "" },
{ "alsoletter", "", false, ALL, "", "" },
{ "alsodigit", "", false, ALL, "", "" },
{ "alsoother", "", false, ALL, "", "" },
{ "otherkeywords", "", false, ALL, "", "" },
{ "tag", "", false, ALL, "", "" },
{ "string", "", false, ALL, "", "" },
{ "morestring", "", false, ALL, "", "" },
{ "deletestring", "", false, ALL, "", "" },
{ "comment", "", false, ALL, "", "" },
{ "morecomment", "", false, ALL, "", "" },
{ "deletecomment", "", false, ALL, "", "" },
{ "keywordcomment", "", false, ALL, "", "" },
{ "morekeywordcomment", "", false, ALL, "", "" },
{ "deletekeywordcomment", "", false, ALL, "", "" },
{ "keywordcommentsemicolon", "", false, ALL, "", "" },
{ "podcomment", "", false, ALL, "", "" },
{ "", "", false, ALL, "", ""}
};
class parValidator
{
public:
parValidator(string const & name);
/// validate given parameter
/// invalidParam will be thrown if invalid
/// parameter is found.
void validate(std::string const & par) const;
private:
/// parameter name
string const & name;
///
listings_param_info const * info;
};
parValidator::parValidator(string const & n)
: name(n), info(0)
{
if (name.empty())
throw invalidParam("Invalid (empty) listings param name.");
else if (name == "?") {
string pars;
size_t idx = 0;
while (listings_param_table[idx].name != string()) {
if (!pars.empty())
pars += ", ";
pars += listings_param_table[idx].name;
++idx;
}
throw invalidParam("Available listings parameters are " + pars);
}
// locate name in parameter table
size_t idx = 0;
while (listings_param_table[idx].name != name && listings_param_table[idx].name != string())
++idx;
// found the name
if (listings_param_table[idx].name != "") {
info = &listings_param_table[idx];
return;
}
// otherwise, produce a meaningful error message.
string matching_names;
for (size_t i = 0; i < idx; ++i) {
string n(listings_param_table[i].name);
if (n.size() >= name.size() && n.substr(0, name.size()) == name) {
if (matching_names.empty())
matching_names += n;
else
matching_names += ", " + n;
}
}
if (matching_names.empty())
throw invalidParam("Unknown listings param name: " + name);
else
throw invalidParam("Parameters starting with '" + name +
"': " + matching_names);
}
void parValidator::validate(std::string const & par) const
{
switch (info->type) {
case ALL:
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("An value is expected");
}
return;
case TRUEFALSE: {
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("Please specify true or false");
}
if (par != "true" && par != "false")
throw invalidParam("Only true or false is allowed for parameter" + name);
return;
}
case INTEGER: {
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("Please specify an integer value");
}
if (convert<int>(par) == 0 && par[0] != '0')
throw invalidParam("An integer is expected for parameter " + name);
return;
}
case LENGTH: {
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("Please specify a latex length expression");
}
if (!isValidLength(par))
throw invalidParam("Invalid latex length expression for parameter " + name);
return;
}
case ONEOF: {
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("Please specify one of " + string(info->info));
}
// break value to allowed strings
vector<string> lists;
string v;
for (size_t i = 0; info->info[i] != '\0'; ++i) {
if (info->info[i] == '\n') {
lists.push_back(v);
v = string();
} else
v += info->info[i];
}
if (!v.empty())
lists.push_back(v);
// good, find the string
if (std::find(lists.begin(), lists.end(), par) != lists.end())
return;
// otherwise, produce a meaningful error message.
string matching_names;
for (vector<string>::iterator it = lists.begin();
it != lists.end(); ++it) {
if (it->size() >= par.size() && it->substr(0, par.size()) == par) {
if (matching_names.empty())
matching_names += *it;
else
matching_names += ", " + *it;
}
}
if (matching_names.empty())
throw invalidParam("Try one of " + string(info->info));
else
throw invalidParam("I guess you mean " + matching_names);
return;
}
case SUBSETOF: {
if (par.empty() && !info->onoff) {
if (info->hint != "")
throw invalidParam(info->hint);
else
throw invalidParam("Please specify one or more of " + string(info->info));
}
for (size_t i = 0; i < par.size(); ++i)
if (string(info->info).find(par[i], 0) == string::npos)
throw invalidParam("Parameter " + name +
" should be composed of one or more of " + info->info);
return;
}
}
}
InsetListingsParams::InsetListingsParams() :
inline_(false), status_(InsetCollapsable::Open), params_()
{
}
InsetListingsParams::InsetListingsParams(string const & par, bool in, InsetCollapsable::CollapseStatus s)
: inline_(in), status_(s)
{
// this will activate parameter validation.
fromEncodedString(par);
}
void InsetListingsParams::write(ostream & os) const
{
if (inline_)
os << "true ";
else
os << "false ";
os << status_ << " \"" << encodedString() << "\"";
}
void InsetListingsParams::read(Lexer & lex)
{
lex >> inline_;
int s;
lex >> s;
if (lex)
status_ = static_cast<InsetCollapsable::CollapseStatus>(s);
string par;
lex >> par;
fromEncodedString(par);
}
void InsetListingsParams::addParam(string const & key, string const & value)
{
if (key.empty())
return;
// exception may be thown.
parValidator(key.c_str()).validate(value);
if (!params_.empty())
params_ += ',';
if (value.empty())
params_ += key;
else {
// check onoff flag
size_t idx = 0;
while (listings_param_table[idx].name != key)
++idx;
BOOST_ASSERT(listings_param_table[idx].name == key);
if (listings_param_table[idx].onoff && value == "false")
params_ += key;
else
params_ += key + '=' + value;
}
}
void InsetListingsParams::setParams(string const & par)
{
string key;
string value;
bool isValue = false;
params_.clear();
for (size_t i = 0; i < par.size(); ++i) {
// end of par
if (par[i] == '\n' || par[i] == ',') {
addParam(trim(key), trim(value));
key = string();
value = string();
isValue = false;
} else if (par[i] == '=')
isValue = true;
else if (isValue)
value += par[i];
else
key += par[i];
}
if (!trim(key).empty())
addParam(trim(key), trim(value));
}
string InsetListingsParams::encodedString() const
{
// Encode string!
// FIXME:
// '"' should be handled differently because it will
// terminate a lyx token. Right now, it is silently ignored.
string par;
for (size_t i = 0; i < params_.size(); ++i) {
BOOST_ASSERT(params_[i] != '\n');
if (params_[i] != '"')
par += params_[i];
}
return par;
}
string InsetListingsParams::separatedParams(bool keepComma) const
{
// , might be used as regular parameter option so
// the prcess might be more complicated than what I am doing here
string opt;
for (size_t i = 0; i < params_.size(); ++i)
if (params_[i] == ',') {
if (keepComma)
opt += ",\n";
else
opt += "\n";
} else
opt += params_[i];
return opt;
}
void InsetListingsParams::fromEncodedString(string const & in)
{
// Decode string!
// Do nothing because " was silently ignored.
setParams(in);
}
} // namespace lyx

View File

@ -0,0 +1,100 @@
// -*- C++ -*-
/**
* \file InsetListingsParams.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#ifndef INSETLISTINGSPARAMS_H
#define INSETLISTINGSPARAMS_H
#include <vector>
#include <exception>
#include "Lexer.h"
#include "InsetCollapsable.h"
namespace lyx {
class InsetListingsParams {
public:
///
InsetListingsParams();
///
InsetListingsParams(std::string const &, bool in=false,
InsetCollapsable::CollapseStatus s = InsetCollapsable::Open);
/// write parameters to an ostream
void write(std::ostream &) const;
/// read parameters from an ostream
void read(Lexer &);
/// valid parameter string
std::string params() const { return params_; }
/// add key=value to params_
void addParam(std::string const & key, std::string const & value);
/// set params_ with par, throw an exception if par is valid
void setParams(std::string const & par);
/// generate a parameter string that can be safely save and restored
/// by lyx' lexer
std::string encodedString() const;
/// newline (\n) separated parameters. comma can be removed.
/// One possible complication is that , may appear in option value.
std::string separatedParams(bool keepComma = false) const;
/// get parameter from encoded string
void fromEncodedString(std::string const & par);
///
bool isInline() const { return inline_; }
///
InsetCollapsable::CollapseStatus status() const { return status_; }
///
void setInline(bool i) { inline_ = i; }
///
void clear() { params_.clear(); }
private:
/// inline or normal listings
bool inline_;
/// listing parameters, this will always be a *valid* string
/// that can be passed to listing packages.
std::string params_;
/// collapsable status
InsetCollapsable::CollapseStatus status_;
};
class invalidParam : public std::exception {
public:
invalidParam(std::string const & details) :
details_(details)
{}
virtual const char * what() const throw() {
return details_.c_str();
}
virtual ~invalidParam() throw() {}
private:
std::string const details_;
};
} // namespace lyx
#endif

View File

@ -77,6 +77,10 @@ libinsets_la_SOURCES = \
InsetLabel.h \
InsetLine.cpp \
InsetLine.h \
InsetListings.h \
InsetListings.cpp \
InsetListingsParams.h \
InsetListingsParams.cpp \
InsetMarginal.h \
InsetMarginal.cpp \
InsetNewline.cpp \

View File

@ -380,6 +380,7 @@ enum kb_action {
LFUN_CLEARPAGE_INSERT, // Ugras 20061125
LFUN_CLEARDOUBLEPAGE_INSERT, // Ugras 20061125
//290
LFUN_LISTING_INSERT, // Herbert 20011110, bpeng 20070502
LFUN_LASTACTION // end of the table
};