What do you need?

I am attaching what I have right now. Many parts are missing but the
main points are there:

What I have got:

1. add InsetListings in file InsetListings.h and InsetListings.cpp,
this is a slightly modified copy of InsetERT. It already works in the
sense that you can insert -> program code, enter code in the box and
compile.

2. add InsetListingsParams, with all listings options roughly there.

3. add a dialog (ControlListings, QListings, ListingsUi) that allow
user to alter listings options. This dialog will display all listings
parameters (default values) and allow users to change their values.
Abdel may have some better idea.

What are missing:

1. lyx2lyx support for InsetListings.

2. The Qt part is largely missing. I guess Abdel can get the idea of
the dialog and add the missing parts rather quickly.

3. If this dialog can be put or copied to insert->include (lstinclude
?) and file->settings (global settings) without much difficulty, the
listings feature will be complete. The list-of-string option is less
userfriendly than Herbert's large dialog, but it is a good way to
provide *all* options to users.

4. autotools and cmake support are missing (should be easy to add files).

Cheers,
Bo
Index: src/LyXAction.cpp
===================================================================
--- src/LyXAction.cpp	(revision 18187)
+++ src/LyXAction.cpp	(working copy)
@@ -371,6 +371,7 @@
 		{ 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 }
 	};
Index: src/insets/Inset.cpp
===================================================================
--- src/insets/Inset.cpp	(revision 18187)
+++ src/insets/Inset.cpp	(working copy)
@@ -76,6 +76,7 @@
 		InsetName("bibtex", Inset::BIBTEX_CODE),
 		InsetName("text", Inset::TEXT_CODE),
 		InsetName("ert", Inset::ERT_CODE),
+		InsetName("listings", Inset::ERT_CODE),
 		InsetName("foot", Inset::FOOT_CODE),
 		InsetName("margin", Inset::MARGIN_CODE),
 		InsetName("float", Inset::FLOAT_CODE),
Index: src/insets/InsetListings.h
===================================================================
--- src/insets/InsetListings.h	(revision 0)
+++ src/insets/InsetListings.h	(revision 0)
@@ -0,0 +1,116 @@
+// -*- C++ -*-
+/**
+ * \file InsetListings.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Vigna
+ * \author Lars Gullik Bjønnes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef INSETLISTINGS_H
+#define INSETLISTINGS_H
+
+#include "LaTeXFeatures.h"
+#include "InsetCollapsable.h"
+#include "InsetListingsParams.h"
+#include "Length.h"
+#include "MailInset.h"
+
+
+namespace lyx {
+
+/** A collapsable text inset for program listings.
+*/
+
+
+class InsetListings : public InsetCollapsable {
+public:
+	///
+	InsetListings(BufferParams const &, CollapseStatus status = Open);
+	///
+	~InsetListings();
+	///
+	Inset::Code lyxCode() const { return Inset::ERT_CODE; }
+	///
+	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;
+	///
+	bool insetAllowed(Inset::Code code) const;
+	///
+	int latex(Buffer const &, odocstream &,
+		  OutputParams const &) const;
+	///
+	int plaintext(Buffer const &, odocstream &,
+	              OutputParams const &) const;
+	///
+	int docbook(Buffer const &, odocstream &,
+		    OutputParams const &) const;
+	///
+	void validate(LaTeXFeatures &) const;
+	///
+	bool metrics(MetricsInfo &, Dimension &) const;
+	///
+	void draw(PainterInfo & pi, int x, int y) const;
+	///
+	bool showInsetDialog(BufferView *) const;
+	///
+	void getDrawFont(Font &) const;
+	///
+	bool forceDefaultParagraphs(idx_type) const { return true; }
+	/// should paragraph indendation be ommitted in any case?
+	bool neverIndent(Buffer const &) const { return true; }
+	///
+	InsetListingsParams const & params() const { 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();
+	///
+	bool allowSpellCheck() const { return false; }
+	///
+	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
Index: src/insets/InsetListings.cpp
===================================================================
--- src/insets/InsetListings.cpp	(revision 0)
+++ src/insets/InsetListings.cpp	(revision 0)
@@ -0,0 +1,475 @@
+/**
+ * \file InsetListings.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Vigna
+ * \author Lars Gullik Bjønnes
+ * \author Bo Peng
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "InsetListings.h"
+
+#include "Buffer.h"
+#include "BufferParams.h"
+#include "BufferView.h"
+#include "Cursor.h"
+#include "debug.h"
+#include "DispatchResult.h"
+#include "FuncRequest.h"
+#include "FuncStatus.h"
+#include "gettext.h"
+#include "Language.h"
+#include "Color.h"
+#include "LyXAction.h"
+#include "Lexer.h"
+#include "TextClass.h"
+#include "MetricsInfo.h"
+#include "ParagraphParameters.h"
+#include "Paragraph.h"
+
+#include "frontends/alert.h"
+
+#include <sstream>
+
+
+namespace lyx {
+
+using support::token;
+
+using std::endl;
+using std::min;
+
+using std::auto_ptr;
+using std::istringstream;
+using std::ostream;
+using std::ostringstream;
+using std::string;
+
+
+void InsetListings::init()
+{
+	setButtonLabel();
+	Font font(Font::ALL_SANE);
+	font.decSize();
+	font.decSize();
+	font.setColor(Color::foreground);
+	setLabelFont(font);
+	text_.current_font.setLanguage(english_language);
+	text_.real_current_font.setLanguage(english_language);
+}
+
+
+InsetListings::InsetListings(BufferParams const & bp, CollapseStatus status)
+	: InsetCollapsable(bp, status)
+{
+	init();
+}
+
+
+InsetListings::InsetListings(InsetListings const & in)
+	: InsetCollapsable(in)
+{
+	init();
+}
+
+
+auto_ptr<Inset> InsetListings::doClone() const
+{
+	return auto_ptr<Inset>(new InsetListings(*this));
+}
+
+
+InsetListings::~InsetListings()
+{
+	InsetListingsMailer(*this).hideDialog();
+}
+
+
+void InsetListings::write(Buffer const & buf, ostream & os) const
+{
+	os << "Listings" << "\n";
+	InsetCollapsable::write(buf, os);
+}
+
+
+void InsetListings::read(Buffer const & buf, Lexer & lex)
+{
+	InsetCollapsable::read(buf, lex);
+
+	// Force default font
+	// This avoids paragraphs in buffer language that would have a
+	// foreign language after a document langauge change, and it ensures
+	// that all new text in Listings gets the "english" language, since new text
+	// inherits the language from the last position of the existing text.
+	// As a side effect this makes us also robust against bugs in LyX
+	// that might lead to font changes in Listings in .lyx files.
+	Font font(Font::ALL_INHERIT, english_language);
+	ParagraphList::iterator par = paragraphs().begin();
+	ParagraphList::iterator const end = paragraphs().end();
+	while (par != end) {
+		pos_type siz = par->size();
+		for (pos_type i = 0; i <= siz; ++i) {
+			par->setFont(i, font);
+		}
+		++par;
+	}
+}
+
+
+
+docstring const InsetListings::editMessage() const
+{
+	return _("Opened Listings Inset");
+}
+
+
+int InsetListings::latex(Buffer const &, odocstream & os,
+		    OutputParams const &) const
+{
+	// FIXME: add params to the environment
+	string param_string = params().paramString();
+	if (param_string.empty())
+		os << "\n\\begin{lstlisting}\n";
+	else
+		os << "\n\\begin{lstlisting}[" << param_string << "]\n";
+	ParagraphList::const_iterator par = paragraphs().begin();
+	ParagraphList::const_iterator end = paragraphs().end();
+
+	int lines = 2;
+	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;
+		if (par != end) {
+			os << "\n";
+			++lines;
+		}
+	}
+	os << "\n\\end{lstlisting}\n";
+	lines += 2;
+
+	return lines;
+}
+
+
+int InsetListings::plaintext(Buffer const &, odocstream &,
+                        OutputParams const &) const
+{
+	// FIXME
+	return 0; 
+}
+
+/// FIXME
+int InsetListings::docbook(Buffer const &, odocstream & os,
+		      OutputParams const &) const
+{
+	ParagraphList::const_iterator par = paragraphs().begin();
+	ParagraphList::const_iterator end = paragraphs().end();
+
+	int lines = 0;
+	while (par != end) {
+		pos_type siz = par->size();
+		for (pos_type i = 0; i < siz; ++i)
+			os.put(par->getChar(i));
+		++par;
+		if (par != end) {
+			os << "\n";
+			++lines;
+		}
+	}
+
+	return lines;
+}
+
+
+void InsetListings::doDispatch(Cursor & cur, FuncRequest & cmd)
+{
+	//lyxerr << "\nInsetListings::doDispatch (begin): cmd: " << cmd << endl;
+	switch (cmd.action) {
+
+	case LFUN_QUOTE_INSERT: {
+		// We need to bypass the fancy quotes in Text
+		FuncRequest f(LFUN_SELF_INSERT, "\"");
+		dispatch(cur, f);
+		break;
+	}
+	case LFUN_INSET_MODIFY: {
+		InsetListingsParams params;
+		InsetListingsMailer::string2params(to_utf8(cmd.argument()), params);
+		break;
+	}
+	case LFUN_INSET_DIALOG_UPDATE:
+		InsetListingsMailer(*this).updateDialog(&cur.bv());
+		break;	
+	case LFUN_PASTE:
+	case LFUN_CLIPBOARD_PASTE:
+	case LFUN_PRIMARY_SELECTION_PASTE: {
+		InsetCollapsable::doDispatch(cur, cmd);
+
+		// Since we can only store plain text, we must reset all
+		// attributes.
+		// FIXME: Change only the pasted paragraphs
+
+		BufferParams const & bp = cur.buffer().params();
+		Layout_ptr const layout =
+			bp.getTextClass().defaultLayout();
+		Font font = layout->font;
+		// ERT contents has always english_language
+		font.setLanguage(english_language);
+		ParagraphList::iterator const end = paragraphs().end();
+		for (ParagraphList::iterator par = paragraphs().begin();
+		     par != end; ++par) {
+			// in case par had a manual label
+			par->setBeginOfBody();
+			pos_type const siz = par->size();
+			for (pos_type i = 0; i < siz; ++i) {
+				par->setFont(i, font);
+			}
+			par->params().clear();
+		}
+		break;
+	}
+	case LFUN_MOUSE_RELEASE: {
+		if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
+			InsetListingsMailer(*this).showDialog(&cur.bv());
+			break;
+		}
+		InsetCollapsable::doDispatch(cur, cmd);
+		break;
+	}
+	default:
+		InsetCollapsable::doDispatch(cur, cmd);
+		break;
+	}
+}
+
+
+bool InsetListings::getStatus(Cursor & cur, FuncRequest const & cmd,
+	FuncStatus & status) const
+{
+	switch (cmd.action) {
+		// suppress these
+		case LFUN_ACCENT_ACUTE:
+		case LFUN_ACCENT_BREVE:
+		case LFUN_ACCENT_CARON:
+		case LFUN_ACCENT_CEDILLA:
+		case LFUN_ACCENT_CIRCLE:
+		case LFUN_ACCENT_CIRCUMFLEX:
+		case LFUN_ACCENT_DOT:
+		case LFUN_ACCENT_GRAVE:
+		case LFUN_ACCENT_HUNGARIAN_UMLAUT:
+		case LFUN_ACCENT_MACRON:
+		case LFUN_ACCENT_OGONEK:
+		case LFUN_ACCENT_SPECIAL_CARON:
+		case LFUN_ACCENT_TIE:
+		case LFUN_ACCENT_TILDE:
+		case LFUN_ACCENT_UMLAUT:
+		case LFUN_ACCENT_UNDERBAR:
+		case LFUN_ACCENT_UNDERDOT:
+		case LFUN_APPENDIX:
+		case LFUN_BREAK_LINE:
+		case LFUN_CAPTION_INSERT:
+		case LFUN_DEPTH_DECREMENT:
+		case LFUN_DEPTH_INCREMENT:
+		case LFUN_DOTS_INSERT:
+		case LFUN_END_OF_SENTENCE_PERIOD_INSERT:
+		case LFUN_ENVIRONMENT_INSERT:
+		case LFUN_ERT_INSERT:
+		case LFUN_LISTING_INSERT:
+		case LFUN_FILE_INSERT:
+		case LFUN_FLOAT_INSERT:
+		case LFUN_FLOAT_WIDE_INSERT:
+		case LFUN_WRAP_INSERT:
+		case LFUN_FONT_BOLD:
+		case LFUN_FONT_CODE:
+		case LFUN_FONT_DEFAULT:
+		case LFUN_FONT_EMPH:
+		case LFUN_FONT_FREE_APPLY:
+		case LFUN_FONT_FREE_UPDATE:
+		case LFUN_FONT_NOUN:
+		case LFUN_FONT_ROMAN:
+		case LFUN_FONT_SANS:
+		case LFUN_FONT_FRAK:
+		case LFUN_FONT_ITAL:
+		case LFUN_FONT_SIZE:
+		case LFUN_FONT_STATE:
+		case LFUN_FONT_UNDERLINE:
+		case LFUN_FOOTNOTE_INSERT:
+		case LFUN_HFILL_INSERT:
+		case LFUN_HTML_INSERT:
+		case LFUN_HYPHENATION_POINT_INSERT:
+		case LFUN_LIGATURE_BREAK_INSERT:
+		case LFUN_INDEX_INSERT:
+		case LFUN_INDEX_PRINT:
+		case LFUN_LABEL_INSERT:
+		case LFUN_OPTIONAL_INSERT:
+		case LFUN_BIBITEM_INSERT:
+		case LFUN_LINE_INSERT:
+		case LFUN_PAGEBREAK_INSERT:
+		case LFUN_CLEARPAGE_INSERT:
+		case LFUN_CLEARDOUBLEPAGE_INSERT:
+		case LFUN_LANGUAGE:
+		case LFUN_LAYOUT:
+		case LFUN_LAYOUT_PARAGRAPH:
+		case LFUN_LAYOUT_TABULAR:
+		case LFUN_MARGINALNOTE_INSERT:
+		case LFUN_MATH_DISPLAY:
+		case LFUN_MATH_INSERT:
+		case LFUN_MATH_MATRIX:
+		case LFUN_MATH_MODE:
+		case LFUN_MENU_OPEN:
+		case LFUN_MENU_SEPARATOR_INSERT:
+		case LFUN_BRANCH_INSERT:
+		case LFUN_CHARSTYLE_INSERT:
+		case LFUN_NOTE_INSERT:
+		case LFUN_BOX_INSERT:
+		case LFUN_NOTE_NEXT:
+		case LFUN_PARAGRAPH_SPACING:
+		case LFUN_LABEL_GOTO:
+		case LFUN_REFERENCE_NEXT:
+		case LFUN_SPACE_INSERT:
+		case LFUN_SERVER_GOTO_FILE_ROW:
+		case LFUN_SERVER_NOTIFY:
+		case LFUN_SERVER_SET_XY:
+		case LFUN_TABULAR_INSERT:
+		case LFUN_TOC_INSERT:
+		case LFUN_URL_INSERT:
+		case LFUN_FLOAT_LIST:
+		case LFUN_INSET_INSERT:
+		case LFUN_PARAGRAPH_PARAMS_APPLY:
+		case LFUN_PARAGRAPH_UPDATE:
+		case LFUN_NOMENCL_INSERT:
+		case LFUN_NOMENCL_PRINT:
+		case LFUN_NOACTION:
+			status.enabled(false);
+			return true;
+
+		case LFUN_QUOTE_INSERT:
+		case LFUN_INSET_MODIFY:
+		case LFUN_PASTE:
+		case LFUN_CLIPBOARD_PASTE:
+		case LFUN_PRIMARY_SELECTION_PASTE:
+			status.enabled(true);
+			return true;
+
+		// this one is difficult to get right. As a half-baked
+		// solution, we consider only the first action of the sequence
+		case LFUN_COMMAND_SEQUENCE: {
+			// argument contains ';'-terminated commands
+			string const firstcmd = token(to_utf8(cmd.argument()), ';', 0);
+			FuncRequest func(lyxaction.lookupFunc(firstcmd));
+			func.origin = cmd.origin;
+			return getStatus(cur, func, status);
+		}
+
+		default:
+			return InsetCollapsable::getStatus(cur, cmd, status);
+	}
+}
+
+
+void InsetListings::setButtonLabel()
+{
+	// FIXME UNICODE
+	setLabel(isOpen() ?  _("Listings") : getNewLabel(_("Listings")));
+}
+
+
+bool InsetListings::insetAllowed(Inset::Code /* code */) const
+{
+	return false;
+}
+
+
+void InsetListings::validate(LaTeXFeatures & features) const
+{
+	features.require("listings");
+	InsetCollapsable::validate(features);
+}
+
+
+bool InsetListings::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+	Font tmpfont = mi.base.font;
+	getDrawFont(mi.base.font);
+	mi.base.font.realize(tmpfont);
+	InsetCollapsable::metrics(mi, dim);
+	mi.base.font = tmpfont;
+	bool const changed = dim_ != dim;
+	dim_ = dim;
+	return changed;
+}
+
+
+void InsetListings::draw(PainterInfo & pi, int x, int y) const
+{
+	Font tmpfont = pi.base.font;
+	getDrawFont(pi.base.font);
+	pi.base.font.realize(tmpfont);
+	InsetCollapsable::draw(pi, x, y);
+	pi.base.font = tmpfont;
+}
+
+
+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);
+	params.read(lex);
+}
+
+
+string const
+InsetListingsMailer::params2string(InsetListingsParams const & params)
+{
+	ostringstream data;
+	params.write(data);
+	return data.str();
+}
+
+
+} // namespace lyx
Index: src/frontends/qt4/QListings.h
===================================================================
--- src/frontends/qt4/QListings.h	(revision 0)
+++ src/frontends/qt4/QListings.h	(revision 0)
@@ -0,0 +1,58 @@
+// -*- C++ -*-
+/**
+ * \file QListings.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * 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();
+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
Index: src/frontends/qt4/ui/ListingsUi.ui
===================================================================
--- src/frontends/qt4/ui/ListingsUi.ui	(revision 0)
+++ src/frontends/qt4/ui/ListingsUi.ui	(revision 0)
@@ -0,0 +1,163 @@
+<ui version="4.0" >
+ <class>QListingsUi</class>
+ <widget class="QDialog" name="QListingsUi" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>379</width>
+    <height>259</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Listing</string>
+  </property>
+  <property name="sizeGripEnabled" >
+   <bool>true</bool>
+  </property>
+  <widget class="QGroupBox" name="paramsGB" >
+   <property name="geometry" >
+    <rect>
+     <x>9</x>
+     <y>9</y>
+     <width>361</width>
+     <height>206</height>
+    </rect>
+   </property>
+   <property name="title" >
+    <string>StringList</string>
+   </property>
+   <layout class="QGridLayout" >
+    <property name="margin" >
+     <number>9</number>
+    </property>
+    <property name="spacing" >
+     <number>6</number>
+    </property>
+    <item row="1" column="0" colspan="2" >
+     <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>
+       </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="valueLabel" >
+          <property name="text" >
+           <string>&amp;Value:</string>
+          </property>
+          <property name="buddy" >
+           <cstring>valueLE</cstring>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLineEdit" name="valueLE" />
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+    <item row="0" column="0" colspan="2" >
+     <widget class="QListWidget" name="paramsLW" >
+      <property name="uniformItemSizes" >
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWidget" name="" >
+   <property name="geometry" >
+    <rect>
+     <x>10</x>
+     <y>220</y>
+     <width>361</width>
+     <height>29</height>
+    </rect>
+   </property>
+   <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="restorePB" >
+      <property name="contextMenuPolicy" >
+       <enum>Qt::CustomContextMenu</enum>
+      </property>
+      <property name="text" >
+       <string>Restore</string>
+      </property>
+      <property name="default" >
+       <bool>true</bool>
+      </property>
+     </widget>
+    </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>
+  </widget>
+ </widget>
+ <tabstops>
+  <tabstop>okPB</tabstop>
+  <tabstop>closePB</tabstop>
+ </tabstops>
+ <includes>
+  <include location="local" >qt_helpers.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>
Index: src/frontends/qt4/QListings.cpp
===================================================================
--- src/frontends/qt4/QListings.cpp	(revision 0)
+++ src/frontends/qt4/QListings.cpp	(revision 0)
@@ -0,0 +1,115 @@
+/**
+ * \file QListings.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * 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 "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(restorePB, SIGNAL(clicked()), form, SLOT(slotRestore()));
+	connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
+	connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
+
+	// FIXME: connect listview selection to valueedit
+	// FIXME: connect valieedit modification to listview update
+}
+
+
+void QListingsDialog::closeEvent(QCloseEvent * e)
+{
+	form_->slotWMHide();
+	e->accept();
+}
+
+
+void QListingsDialog::change_adaptor()
+{
+	form_->changed();
+}
+
+
+/////////////////////////////////////////////////////////////////////
+//
+// 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);
+	// add params to listview
+	InsetListingsParams params = controller().params();
+	
+	for (size_t i = 0; i < params.size(); ++i) {
+		dialog_->paramsLW->addItem(toqstr(params[i].name));
+	}
+}
+
+
+void QListings::apply()
+{
+	// FIXME
+	// update params with listview items
+}
+
+
+void QListings::update_contents()
+{
+	// add params to listview
+	InsetListingsParams params = controller().params();
+	// update listview
+	dialog_->paramsLW->clear();
+}
+
+
+} // namespace frontend
+} // namespace lyx
+
+
+#include "QListings_moc.cpp"
Index: src/frontends/qt4/Dialogs.cpp
===================================================================
--- src/frontends/qt4/Dialogs.cpp	(revision 18187)
+++ src/frontends/qt4/Dialogs.cpp	(working copy)
@@ -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 @@
 "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 @@
 		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;
Index: src/frontends/controllers/ControlListings.h
===================================================================
--- src/frontends/controllers/ControlListings.h	(revision 0)
+++ src/frontends/controllers/ControlListings.h	(revision 0)
@@ -0,0 +1,48 @@
+// -*- C++ -*-
+/**
+ * \file ControlListings.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef CONTROLLISTINGS_H
+#define CONTROLLISTINGS_H
+
+#include "Dialog.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_.get(); }
+	///
+	InsetListingsParams const & params() const { return *params_.get(); }
+private:
+	///
+	boost::scoped_ptr<InsetListingsParams> params_;
+};
+
+} // namespace frontend
+} // namespace lyx
+
+#endif
Index: src/frontends/controllers/ControlListings.cpp
===================================================================
--- src/frontends/controllers/ControlListings.cpp	(revision 0)
+++ src/frontends/controllers/ControlListings.cpp	(revision 0)
@@ -0,0 +1,63 @@
+/**
+ * \file ControlListings.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "ControlListings.h"
+#include "FuncRequest.h"
+#include "insets/InsetListings.h"
+
+/*
+string const 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";
+string const frames = "none\nleftline\ntopline\nlines\nsingle\nshadowbox";
+string const fontsizes = "default\ntiny\nscriptsize\nfootnotesize\nsmall\n"
+	"normalsize\nlarge\nLarge";
+string const fontstyles = "default\nrmfamily\nttfamily\nsffamily";
+*/
+
+using std::string;
+
+namespace lyx {
+namespace frontend {
+
+ControlListings::ControlListings(Dialog & parent)
+	: Dialog::Controller(parent)
+{}
+
+
+bool ControlListings::initialiseParams(string const & data)
+{
+	InsetListingsParams params;
+	InsetListingsMailer::string2params(data, params);
+	params_.reset(new InsetListingsParams(params));
+	return true;
+}
+
+
+void ControlListings::clearParams()
+{
+	params_.reset();
+}
+
+
+void ControlListings::dispatchParams()
+{
+	string const lfun = InsetListingsMailer::params2string(params());
+	kernel().dispatch(FuncRequest(getLfun(), lfun));
+}
+
+} // namespace frontend
+} // namespace lyx
Index: src/LyXFunc.cpp
===================================================================
--- src/LyXFunc.cpp	(revision 18187)
+++ src/LyXFunc.cpp	(working copy)
@@ -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"
@@ -1317,6 +1318,9 @@
 			} 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();
Index: src/factory.cpp
===================================================================
--- src/factory.cpp	(revision 18187)
+++ src/factory.cpp	(working copy)
@@ -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 @@
 		case LFUN_ERT_INSERT:
 			return new InsetERT(params);
 
+		case LFUN_LISTING_INSERT:
+			return new InsetListings(params);
+
 		case LFUN_FOOTNOTE_INSERT:
 			return new InsetFoot(params);
 
@@ -486,6 +490,8 @@
 			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") {
Index: src/LaTeXFeatures.cpp
===================================================================
--- src/LaTeXFeatures.cpp	(revision 18187)
+++ src/LaTeXFeatures.cpp	(working copy)
@@ -544,6 +544,9 @@
 	                    "\\providecommand{\\makenomenclature}{\\makeglossary}\n"
 		            "\\makenomenclature\n";
 	}
+
+	if (mustProvide("listings"))
+		packages << "\\usepackage{listings}\n";
  
 	return packages.str();
 }
Index: src/Text3.cpp
===================================================================
--- src/Text3.cpp	(revision 18187)
+++ src/Text3.cpp	(working copy)
@@ -1198,6 +1198,7 @@
 	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:
@@ -1700,6 +1701,9 @@
 	case LFUN_ERT_INSERT:
 		code = Inset::ERT_CODE;
 		break;
+	case LFUN_LISTING_INSERT:
+	    code = Inset::ERT_CODE;
+		break;
 	case LFUN_FOOTNOTE_INSERT:
 		code = Inset::FOOT_CODE;
 		break;
Index: src/lfuns.h
===================================================================
--- src/lfuns.h	(revision 18187)
+++ src/lfuns.h	(working copy)
@@ -380,6 +380,7 @@
 	LFUN_CLEARPAGE_INSERT,           // Ugras 20061125
 	LFUN_CLEARDOUBLEPAGE_INSERT,     // Ugras 20061125
 	//290
+	LFUN_LISTING_INSERT,             // Herbert 20011110, bpeng 20070502
 
 	LFUN_LASTACTION                  // end of the table
 };
Index: lib/ui/stdmenus.inc
===================================================================
--- lib/ui/stdmenus.inc	(revision 18187)
+++ lib/ui/stdmenus.inc	(working copy)
@@ -311,6 +311,7 @@
 		Item "Marginal Note|M" "marginalnote-insert"
 		Item "Short Title|S" "optional-insert"
 		Item "TeX Code|X" "ert-insert"
+		Item "Program Code" "listing-insert"
 		Item "Date" "date-insert"
 	End
 
Index: development/scons/scons_manifest.py
===================================================================
--- development/scons/scons_manifest.py	(revision 18187)
+++ development/scons/scons_manifest.py	(working copy)
@@ -726,6 +726,7 @@
     ControlFloat.h
     ControlGraphics.h
     ControlInclude.h
+    ControlListings.h
     ControlLog.h
     ControlMath.h
     ControlNote.h
@@ -771,6 +772,7 @@
     ControlFloat.cpp
     ControlGraphics.cpp
     ControlInclude.cpp
+    ControlListings.cpp
     ControlLog.cpp
     ControlMath.cpp
     ControlNote.cpp
@@ -866,6 +868,7 @@
     QInclude.h
     QIndex.h
     QKeySymbol.h
+    QListings.h
     QLImage.h
     QLMenubar.h
     QLPainter.h
@@ -955,6 +958,7 @@
     QInclude.cpp
     QIndex.cpp
     QKeySymbol.cpp
+    QListings.cpp
     QLImage.cpp
     QLMenubar.cpp
     QLPainter.cpp
@@ -1030,6 +1034,7 @@
     QGraphicsDialog.cpp
     QInclude.cpp
     QIndex.cpp
+    QListings.cpp
     QLMenubar.cpp
     QLPopupMenu.cpp
     QLPrintDialog.cpp
@@ -1101,6 +1106,7 @@
     IndexUi.ui
     LaTeXUi.ui
     LanguageUi.ui
+    ListingsUi.ui
     LogUi.ui
     MarginsUi.ui
     MathMatrixUi.ui
@@ -1183,6 +1189,8 @@
     InsetIndex.h
     InsetLabel.h
     InsetLine.h
+    InsetListings.h
+    InsetListingsParams.h
     InsetMarginal.h
     InsetNewline.h
     InsetNomencl.h
@@ -1236,6 +1244,8 @@
     InsetIndex.cpp
     InsetLabel.cpp
     InsetLine.cpp
+    InsetListings.cpp
+    InsetListingsParams.cpp
     InsetMarginal.cpp
     InsetNewline.cpp
     InsetNomencl.cpp

Reply via email to