Dear all,

Attached is the second patch of the view-source feature, with changes
according to Lars' and Georg's suggestions.

The most significant change is the dialog now updates itself with any
update event. This means, at any mouse click, selection, key entry,
the opened view-source dialog will be refreshed. This makes the dialog
much more useful (?) than before (try to enter math mode (see $ $),
\alpha (see $\alpha$ ). but is more demanding on computer speed.
Fortunately, users with less optimal configuration can choose not to
use this feature.

Other changes concern more dryrun detection. This becomes very
important when the dialog updates so often.

OK to apply?
Bo
Index: src/insets/insetbibtex.C
===================================================================
--- src/insets/insetbibtex.C	(revision 13615)
+++ src/insets/insetbibtex.C	(working copy)
@@ -161,7 +161,7 @@
 			normalize_name(buffer, runparams, input, ".bib");
 		string const in_file = database + ".bib";
 
-		if (!runparams.inComment && !runparams.nice &&
+		if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
 		    isFileReadable(in_file)) {
 
 			// mangledFilename() needs the extension
@@ -216,7 +216,7 @@
 		// exporting to .tex copy it to the tmp directory.
 		// This prevents problems with spaces and 8bit charcaters
 		// in the file name.
-		if (!runparams.inComment && !runparams.nice &&
+		if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
 		    isFileReadable(in_file)) {
 			// use new style name
 			base = removeExtension(
Index: src/insets/insetexternal.C
===================================================================
--- src/insets/insetexternal.C	(revision 13615)
+++ src/insets/insetexternal.C	(working copy)
@@ -688,7 +688,7 @@
 	// run through the LaTeX compiler.
 	// If we're running through the LaTeX compiler, we should write the
 	// generated files in the bufer's temporary directory.
-	bool const external_in_tmpdir = !runparams.nice;
+	bool const external_in_tmpdir = !runparams.nice && !runparams.dryrun;
 
 	// If the template has specified a PDFLaTeX output, then we try and
 	// use that.
Index: src/insets/insetinclude.C
===================================================================
--- src/insets/insetinclude.C	(revision 13615)
+++ src/insets/insetinclude.C	(working copy)
@@ -359,7 +359,7 @@
 	lyxerr[Debug::LATEX] << "exportfile:" << exportfile << endl;
 	lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
 
-	if (runparams.inComment)
+	if (runparams.inComment || runparams.dryrun)
 		// Don't try to load or copy the file
 		;
 	else if (loadIfNeeded(buffer, params_)) {
Index: src/buffer.C
===================================================================
--- src/buffer.C	(revision 13615)
+++ src/buffer.C	(working copy)
@@ -1576,7 +1576,7 @@
 }
 
 
-void Buffer::getSourceCode(ostream& os, lyx::pit_type par_begin, lyx::pit_type par_end)
+void Buffer::getSourceCode(ostream & os, lyx::pit_type par_begin, lyx::pit_type par_end)
 {
 	OutputParams runparams;
 	runparams.nice = true;
@@ -1587,16 +1587,6 @@
 	// No side effect of file copying and image conversion
 	runparams.dryrun = true;
 
-	// set source type for the view-source dialog
-	if (isLatex())
-		os << "%LaTeX\n";
-	else if (isLinuxDoc())
-		os << "%LinuxDoc\n";
-	else if (isDocBook())
-		os << "%DocBook\n";
-	else
-		BOOST_ASSERT(false);
-	// start text
 	if (par_begin + 1 == par_end)
 		os << "% Preview source code for paragraph " << par_begin << "\n\n";
 	else
Index: src/lyxfunc.C
===================================================================
--- src/lyxfunc.C	(revision 13615)
+++ src/lyxfunc.C	(working copy)
@@ -1186,25 +1186,6 @@
 					owner->buffer()->lyxvc().getLogFile();
 				owner->getDialogs().show("log", data);
 			}
-			else if (name == "view-source") {
-				// get the *top* level paragraphs that contain the cursor, 
-				// or the selected text
-				lyx::pit_type par_begin;
-				lyx::pit_type par_end;
-				if (!view()->cursor().selection()) {
-					par_begin = view()->cursor().bottom().pit();
-					par_end = par_begin;
-				} else {
-					par_begin = view()->cursor().selectionBegin().bottom().pit();
-					par_end = view()->cursor().selectionEnd().bottom().pit();
-				}
-				if (par_begin > par_end)
-					std::swap(par_begin, par_end);
-				ostringstream ostr;
-				view()->buffer()->getSourceCode(ostr, par_begin, par_end + 1);
-				// display the dialog and show source code
-				owner->getDialogs().show("view-source", ostr.str());
-			}
 			else
 				owner->getDialogs().show(name, data);
 			break;
Index: src/frontends/qt2/QViewSource.C
===================================================================
--- src/frontends/qt2/QViewSource.C	(revision 13615)
+++ src/frontends/qt2/QViewSource.C	(working copy)
@@ -14,6 +14,7 @@
 #include "QViewSource.h"
 #include "QViewSourceDialog.h"
 #include "qt_helpers.h"
+#include "lyx_gui.h"
 
 #include "controllers/ControlViewSource.h"
 
@@ -38,7 +39,7 @@
 	dialog_->viewSourceTV->setReadOnly(true);
 	dialog_->viewSourceTV->setTextFormat(Qt::PlainText);
 	// this is personal. I think source code should be in fixed-size font
-	QFont font("Courier New");
+	QFont font(lyx_gui::typewriter_font_name().c_str());
 	font.setFixedPitch(true);
 	font.setStyleHint(QFont::TypeWriter);
 	dialog_->viewSourceTV->setFont(font);
@@ -50,8 +51,7 @@
 void QViewSource::update_contents()
 {
 	setTitle(controller().title());
-
-	dialog_->viewSourceTV->setText(toqstr(controller().str()));
+	dialog_->viewSourceTV->setText(toqstr(controller().updateContent()));
 }
 
 } // namespace frontend
Index: src/frontends/controllers/ControlViewSource.C
===================================================================
--- src/frontends/controllers/ControlViewSource.C	(revision 13615)
+++ src/frontends/controllers/ControlViewSource.C	(working copy)
@@ -14,8 +14,14 @@
 
 #include "ControlViewSource.h"
 #include "gettext.h"
+#include "support/types.h"
+#include "BufferView.h"
+#include "buffer.h"
+#include "cursor.h"
+#include <sstream>
 
 using std::string;
+using std::ostringstream;
 
 namespace lyx {
 namespace frontend {
@@ -27,39 +33,58 @@
 
 bool ControlViewSource::initialiseParams(string const & source)
 {
-	string sourcetype = source.substr(1, 5);
-	if (sourcetype == "LaTeX") {
-		type_ = LatexSource;
-		source_ = source.substr(7);
-	} else if (sourcetype == "Linux") {
-		type_ = LinuxDocSource;
-		source_ = source.substr(10);
-	} else if (sourcetype == "DocBo") {
-		type_ = DocBookSource;
-		source_ = source.substr(9);
-	} else
-		return false;
-	
 	return true;
 }
 
+string const ControlViewSource::updateContent()
+{	
+	// get the *top* level paragraphs that contain the cursor, 
+	// or the selected text
+	lyx::pit_type par_begin;
+	lyx::pit_type par_end;
 
+	BufferView * view = kernel().bufferview();
+	if (!view->cursor().selection()) {
+		par_begin = view->cursor().bottom().pit();
+		par_end = par_begin;
+	} else {
+		par_begin = view->cursor().selectionBegin().bottom().pit();
+		par_end = view->cursor().selectionEnd().bottom().pit();
+	}
+	if (par_begin > par_end)
+		std::swap(par_begin, par_end);
+	ostringstream ostr;
+	view->buffer()->getSourceCode(ostr, par_begin, par_end + 1);
+	return ostr.str();
+}
+
+
 void ControlViewSource::clearParams()
 {
-	source_.erase();
 }
 
 
 string const ControlViewSource::title() const
 {
-	switch (type_) {
-	case LatexSource:
-		return _("LaTeX Source");
-	case LinuxDocSource:
-		return _("LinuxDoc Source");
-	case DocBookSource:
-		return _("DocBook Source");
+	string source_type;
+	
+	Kernel::DocType doctype = kernel().docType();
+	switch (doctype) {
+	case Kernel::LATEX:
+		source_type = "LaTeX";
+		break;
+	case Kernel::LINUXDOC:
+		source_type = "LinuxDoc";
+		break;
+	case Kernel::DOCBOOK:
+		source_type = "DocBook";
+		break;
+	case Kernel::LITERATE:
+		source_type = "Literate";
+	default:
+		BOOST_ASSERT(false);
 	}
+	return _(source_type + " Source");
 }
 
 } // namespace frontend
Index: src/frontends/controllers/ControlViewSource.h
===================================================================
--- src/frontends/controllers/ControlViewSource.h	(revision 13615)
+++ src/frontends/controllers/ControlViewSource.h	(working copy)
@@ -36,22 +36,11 @@
 	///
 	virtual bool isBufferDependent() const { return true; }
 
-	/// The title displayed by the dialog reflects the \c VIEWSOURCETYPE
+	/// The title displayed by the dialog reflects source type. 
 	std::string const title() const;
 
-	/// get the source code
-	std::string const str() const { return source_; }
-	
-private:
-	/// Recognized source code type
-	enum SOURCETYPE {
-		LatexSource,
-		LinuxDocSource,
-		DocBookSource
-	};
-
-	SOURCETYPE type_;
-	std::string source_;
+	/// get the source code of selected paragraphs
+	std::string const updateContent();
 };
 
 } // namespace frontend
Index: src/text3.C
===================================================================
--- src/text3.C	(revision 13615)
+++ src/text3.C	(working copy)
@@ -1108,21 +1108,6 @@
 		bv->switchKeyMap();
 		bv->owner()->updateMenubar();
 		bv->owner()->updateToolbars();
-
-		// if view-source dialog is visible, send source code of selected
-		// text to the dialog
-		if (cmd.button() == mouse_button::button1 && cur.selection() 
-			&& bv->owner()->getDialogs().visible("view-source")) {
-			// get *top* level paragraphs that contain the selection
-			lyx::pit_type par_begin = bv->cursor().selectionBegin().bottom().pit();
-			lyx::pit_type par_end = bv->cursor().selectionEnd().bottom().pit();
-			if (par_begin > par_end)
-				std::swap(par_begin, par_end);
-			ostringstream ostr;
-			bv->buffer()->getSourceCode(ostr, par_begin, par_end + 1);
-			// display the dialog and show source code
-			bv->owner()->getDialogs().update("view-source", ostr.str());
-		}
 		break;
 	}
 

Reply via email to