]> git.lyx.org Git - features.git/commitdiff
Introduce InsetPreview.
authorVincent van Ravesteijn <vfr@lyx.org>
Sun, 28 Mar 2010 13:47:50 +0000 (13:47 +0000)
committerVincent van Ravesteijn <vfr@lyx.org>
Sun, 28 Mar 2010 13:47:50 +0000 (13:47 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33890 a592a061-630c-0410-9148-cb99ea01b6c8

15 files changed:
development/scons/scons_manifest.py
lib/layouts/stdinsets.inc
lib/ui/stdcontext.inc
lib/ui/stdmenus.inc
src/Color.cpp
src/ColorCode.h
src/FuncCode.h
src/LyXAction.cpp
src/Makefile.am
src/Text3.cpp
src/factory.cpp
src/insets/InsetCode.h
src/insets/InsetPreview.cpp [new file with mode: 0644]
src/insets/InsetPreview.h [new file with mode: 0644]
src/insets/InsetTabular.cpp

index c7ebea6102269dc5272fae885c70801ab63bcafa..8b8eec6931937b1472391c306ce1fe062e7edff5 100644 (file)
@@ -1035,6 +1035,7 @@ src_insets_header_files = Split('''
     InsetNote.h
     InsetOptArg.h
     InsetPhantom.h
+    InsetPreview.h
     InsetQuotes.h
     InsetRef.h
     InsetSpace.h
@@ -1090,6 +1091,7 @@ src_insets_files = Split('''
     InsetNote.cpp
     InsetOptArg.cpp
     InsetPhantom.cpp
+    InsetPreview.cpp
     InsetQuotes.cpp
     InsetRef.cpp
     InsetSpace.cpp
index 368ef2183e64ba1d466a82ce0a173d0876d46fac..c44da78a50a1f6e36d49aed7ee08f1ab7e57d40d 100644 (file)
@@ -411,3 +411,9 @@ InsetLayout Caption
        EndHTMLStyle
 End
 
+
+InsetLayout Preview
+       LabelString           Preview   
+       Decoration            minimalistic
+       MultiPar              true
+End
\ No newline at end of file
index 8d95099a77d306da0e8c77098f35c8732483324d..583e49eb1608867f973e62efd7a747cc8fc1dba3 100644 (file)
@@ -592,6 +592,14 @@ Menuset
        End
 
 
+# InsetPreview context menu
+#
+
+       Menu "context-preview"
+               Item "Dissolve Inset|D" "inset-dissolve"
+       End
+
+
 #
 # Toc Changes context menu
 #
index df9e77d76afe2bbe443e244b6f9bfecfc2fb3d75..a73e103c31f977b84ad7ee6ce0a3f26e4c53d3dd 100644 (file)
@@ -70,13 +70,13 @@ Menuset
 
        Menu "file_vc"
                OptItem "Register...|R" "vc-register"
-               OptItem "Check In Changes...|I" "vc-check-in"
-               OptItem "Check Out for Edit|O" "vc-check-out"
+               OptItem "Check In Changes...|I" "vc-command DR \".\" \"TortoiseProc /command:commit /path:$$p\""
+               OptItem "Check Out for Edit|O" "vc-command DR \".\" \"TortoiseProc /command:update /path:$$p\""
                OptItem "Update Local Directory From Repository|d" "vc-repo-update"
-               OptItem "Revert to Repository Version|v" "vc-revert"
+               OptItem "Revert to Repository Version|v" "vc-command DR \".\" \"TortoiseProc /command:revert /path:$$p\""
                OptItem "Undo Last Check In|U" "vc-undo-last"
                OptItem "Compare with Older Revision|C" "vc-compare"
-               OptItem "Show History...|H" "dialog-show vclog"
+               OptItem "Show History...|H" "vc-command D \".\" \"TortoiseProc /command:log /path:$$p\""
                OptItem "Use Locking Property|L" "vc-locking-toggle"
        End
 
@@ -366,6 +366,7 @@ Menuset
                Item "TeX Code|X" "ert-insert"
                Item "Program Listing[[Menu]]" "listing-insert"
                Item "Date" "date-insert"
+               Item "Preview|w" "preview-insert"
        End
 
        Menu "insert_special"
index 8536991a300734ac1c79c3f8fba74d4b75af5ba1..f2b5965e18d8cbdfb90235e475004b96d629b4c4 100644 (file)
@@ -240,6 +240,7 @@ ColorSet::ColorSet()
        { Color_buttonbg, N_("button background"), "buttonbg", "#dcd2c8", "buttonbg" },
        { Color_buttonhoverbg, N_("button background under focus"), "buttonhoverbg", "#C7C7CA", "buttonhoverbg" },
        { Color_paragraphmarker, N_("paragraph marker"), "paragraphmarker", grey80, "paragraphmarker"},
+       { Color_previewframe, N_("preview frame"), "previewframe", "black", "previewframe"},
        { Color_inherit, N_("inherit"), "inherit", "black", "inherit" },
        { Color_regexpframe, N_("regexp frame"), "green", "green", "green" },
        { Color_ignore, N_("ignore"), "ignore", "black", "ignore" },
index fff1a54aed5e6da6d24e6e3c3ad050a60bd66baf..4b1b78cab2430529f3c267fb4a1c7739c14a2f87 100644 (file)
@@ -191,6 +191,8 @@ enum ColorCode
        Color_buttonhoverbg,
        /// Color used for the pilcrow sign to mark the end of a paragraph
        Color_paragraphmarker,
+       /// Preview frame color
+       Color_previewframe,
 
        // Logical attributes
 
index e137083bd42a4c5825c84263d413f871ea344632..8aa37890dd96b4c1830cc7205c823307d2ea3eae 100644 (file)
@@ -445,6 +445,7 @@ enum FuncCode
        LFUN_SPELLING_ADD,              // spitz 20100118
        // 345
        LFUN_SPELLING_IGNORE,           // spitz 20100118
+       LFUN_PREVIEW_INSERT,            // vfr, 20100328
 
        LFUN_LASTACTION                 // end of the table
 };
index 5d123b61fd2d7ee6bd3f0f757da9837cbb787504..af1f6041dea1bc9b0afe5c9c7dd491faca11c8bf 100644 (file)
@@ -368,6 +368,14 @@ void LyXAction::init()
  * \endvar
  */
                { LFUN_LISTING_INSERT, "listing-insert", Noop, Edit },
+/*!
+ * \var lyx::FuncCode lyx::LFUN_PREVIEW_INSERT
+ * \li Action: Inserts a new preview inset.
+ * \li Syntax: preview-insert
+ * \li Origin: vfr, 28 Mar 2010
+ * \endvar
+ */
+               { LFUN_PREVIEW_INSERT, "preview-insert", Noop, Edit },
 /*!
  * \var lyx::FuncCode lyx::LFUN_TAB_INSERT
  * \li Action: Insert a tab into a listings inset.
index f4a5701d0cba2739127bd6591913ad89807f57c8..e6c2dacf41e06c4a4b7252ba733300232db93e9d 100644 (file)
@@ -549,6 +549,7 @@ SOURCEFILESINSETS = \
        insets/InsetNote.cpp \
        insets/InsetOptArg.cpp \
        insets/InsetPhantom.cpp \
+       insets/InsetPreview.cpp \
        insets/InsetQuotes.cpp \
        insets/InsetRef.cpp \
        insets/InsetSpace.cpp \
@@ -591,6 +592,7 @@ HEADERFILESINSETS = \
        insets/InsetInclude.h \
        insets/InsetIndex.h \
        insets/InsetInfo.h \
+       insets/InsetPreview.h \
        insets/InsetLabel.h \
        insets/InsetLayout.h \
        insets/InsetLine.h \
index 699058cf88b62d070e26284e55fce3fa83bbd7e4..704adceac62febde4f794668ebcb5b3a94fd0360 100644 (file)
@@ -1571,6 +1571,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MARGINALNOTE_INSERT:
        case LFUN_OPTIONAL_INSERT:
        case LFUN_INDEX_INSERT:
+       case LFUN_PREVIEW_INSERT:
                // Open the inset, and move the current selection
                // inside it.
                doInsertInset(cur, this, cmd, true, true);
@@ -2388,6 +2389,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                if (cur.inTexted())
                        code = SPACE_CODE;
                break;
+       case LFUN_PREVIEW_INSERT:
+               code = PREVIEW_CODE;
+               break;
 
        case LFUN_MATH_INSERT:
        case LFUN_MATH_AMS_MATRIX:
index 3f1bf64267751f86f29a90e465667d2fed1d0b2f..bdad713932da2346b3b06ae605cc0a019c882712 100644 (file)
@@ -47,6 +47,7 @@
 #include "insets/InsetNote.h"
 #include "insets/InsetOptArg.h"
 #include "insets/InsetPhantom.h"
+#include "insets/InsetPreview.h"
 #include "insets/InsetRef.h"
 #include "insets/InsetSpace.h"
 #include "insets/InsetTabular.h"
@@ -211,6 +212,9 @@ Inset * createInsetHelper(Buffer * buf, FuncRequest const & cmd)
                        return inset;
                }
 
+               case LFUN_PREVIEW_INSERT:
+                       return new InsetPreview(buf);
+
                case LFUN_INSET_INSERT: {
                        string const name = cmd.getArg(0);
                        InsetCode code = insetCode(name);
@@ -323,6 +327,9 @@ Inset * createInsetHelper(Buffer * buf, FuncRequest const & cmd)
                                InsetVSpace::string2params(to_utf8(cmd.argument()), vspace);
                                return new InsetVSpace(vspace);
                        }
+
+                       case PREVIEW_CODE:
+                               return new InsetPreview(buf);
                        
                        default:
                                lyxerr << "Inset '" << name << "' not permitted with LFUN_INSET_INSERT."
@@ -571,6 +578,8 @@ Inset * readInset(Lexer & lex, Buffer * buf)
                        inset.reset(new InsetFloatList(buf));
                } else if (tmptok == "Info") {
                        inset.reset(new InsetInfo(buf));
+               } else if (tmptok == "Preview") {
+                       inset.reset(new InsetPreview(buf));
                } else {
                        lyxerr << "unknown Inset type '" << tmptok
                               << "'" << endl;
index cd2b38b863ed65b591ef32be5419818bb986f9ed..714d478ba62983a2b5d1128cd2ba244429044a95 100644 (file)
@@ -221,6 +221,8 @@ enum InsetCode {
        ///
        ARGUMENT_PROXY_CODE, // 100
        ///
+       PREVIEW_CODE,
+       ///
        INSET_CODE_SIZE,
 };
 
diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp
new file mode 100644 (file)
index 0000000..8b44b98
--- /dev/null
@@ -0,0 +1,164 @@
+/**\r
+ * \file InsetPreview.cpp\r
+ * This file is part of LyX, the document processor.\r
+ * Licence details can be found in the file COPYING.\r
+ *\r
+ * \author Vincent van Ravesteijn\r
+ *\r
+ * Full author contact details are available in file CREDITS.\r
+ */\r
+#include "config.h"\r
+\r
+#include "InsetPreview.h"\r
+\r
+#include "Buffer.h"\r
+#include "BufferParams.h"\r
+#include "BufferView.h"\r
+#include "Cursor.h"\r
+#include "Lexer.h"\r
+#include "LyXRC.h"\r
+#include "MetricsInfo.h"\r
+#include "OutputParams.h"\r
+\r
+#include "frontends/Painter.h"\r
+\r
+#include "graphics/PreviewImage.h"\r
+\r
+#include <sstream>\r
+\r
+using namespace std;\r
+\r
+namespace lyx {\r
+\r
+\r
+InsetPreview::InsetPreview(Buffer * buf) \r
+       : InsetText(buf),\r
+         preview_(new RenderPreview(this)), use_preview_(true)\r
+{\r
+       setAutoBreakRows(true);\r
+       setDrawFrame(true);\r
+       setFrameColor(Color_previewframe);\r
+}\r
+\r
+\r
+InsetPreview::~InsetPreview() \r
+{}\r
+\r
+\r
+InsetPreview::InsetPreview(InsetPreview const & other)\r
+       : InsetText(other)\r
+{\r
+       preview_.reset(new RenderPreview(*other.preview_, this));\r
+}\r
+\r
+\r
+void InsetPreview::write(ostream & os) const\r
+{\r
+       os << "Preview" << "\n";\r
+       text().write(os);\r
+}\r
+\r
+\r
+void InsetPreview::addPreview(DocIterator const & inset_pos,\r
+       graphics::PreviewLoader & ploader) const\r
+{\r
+       preparePreview(inset_pos);\r
+}\r
+\r
+\r
+void InsetPreview::preparePreview(DocIterator const & pos) const  \r
+{\r
+       odocstringstream str;  \r
+       OutputParams runparams(&pos.buffer()->params().encoding());\r
+       latex(str, runparams);\r
+       docstring const snippet = str.str();\r
+       preview_->addPreview(snippet, *pos.buffer());  \r
+}\r
+\r
+\r
+bool InsetPreview::previewState(BufferView * bv) const\r
+{\r
+       if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) {\r
+               graphics::PreviewImage const * pimage =\r
+                       preview_->getPreviewImage(bv->buffer());\r
+               return pimage && pimage->image();\r
+       }\r
+       return false;\r
+}\r
+\r
+\r
+void InsetPreview::reloadPreview(DocIterator const & pos) const\r
+{\r
+       preparePreview(pos);\r
+       preview_->startLoading(*pos.buffer());\r
+}\r
+\r
+\r
+void InsetPreview::draw(PainterInfo & pi, int x, int y) const\r
+{\r
+       use_preview_ = previewState(pi.base.bv);\r
+\r
+       if (use_preview_) {\r
+               // one pixel gap in front\r
+               preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);\r
+               setPosCache(pi, x, y);\r
+               return;\r
+       }\r
+       InsetText::draw(pi, x, y);\r
+}\r
+\r
+\r
+void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)\r
+{\r
+       cur.push(*this);\r
+       InsetText::edit(cur, front, entry_from);\r
+}\r
+\r
+\r
+Inset * InsetPreview::editXY(Cursor & cur, int x, int y)\r
+{\r
+       if (use_preview_) {\r
+               edit(cur, true, ENTRY_DIRECTION_IGNORE);\r
+               return this;\r
+       }\r
+       cur.push(*this);\r
+       return InsetText::editXY(cur, x, y);\r
+}\r
+\r
+\r
+void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const\r
+{\r
+       if (previewState(mi.base.bv)) {\r
+               preview_->metrics(mi, dim);\r
+               mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;\r
+               \r
+               dim.wid = max(dim.wid, 4);\r
+               dim.asc = max(dim.asc, 4);\r
+               \r
+               dim.asc += TEXT_TO_INSET_OFFSET;\r
+               dim.des += TEXT_TO_INSET_OFFSET;\r
+               dim.wid += TEXT_TO_INSET_OFFSET;\r
+               dim_ = dim;\r
+               dim.wid += TEXT_TO_INSET_OFFSET;\r
+               // insert a one pixel gap\r
+               dim.wid += 1;\r
+               // Cache the inset dimension.\r
+               setDimCache(mi, dim);\r
+               Dimension dim_dummy;\r
+               MetricsInfo mi_dummy = mi;\r
+               InsetText::metrics(mi_dummy, dim_dummy);\r
+               return;\r
+       }\r
+       InsetText::metrics(mi, dim);\r
+}\r
+\r
+\r
+bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)\r
+{\r
+       reloadPreview(old);\r
+       cur.updateFlags(Update::Force);\r
+       return InsetText::notifyCursorLeaves(old, cur);\r
+}\r
+\r
+\r
+} // namespace lyx\r
diff --git a/src/insets/InsetPreview.h b/src/insets/InsetPreview.h
new file mode 100644 (file)
index 0000000..3886d24
--- /dev/null
@@ -0,0 +1,92 @@
+// -*- C++ -*-\r
+/**\r
+ * \file InsetPreview.h\r
+ * This file is part of LyX, the document processor.\r
+ * Licence details can be found in the file COPYING.\r
+ *\r
+ * \author Vincent van Ravesteijn\r
+ *\r
+ * Full author contact details are available in file CREDITS.\r
+ */\r
+\r
+#ifndef INSETPREVIEW_H\r
+#define INSETPREVIEW_H\r
+\r
+#include "InsetText.h"\r
+\r
+#include "Dimension.h"\r
+#include "RenderPreview.h"\r
+\r
+#include "graphics/PreviewLoader.h"\r
+\r
+#include <boost/scoped_ptr.hpp>\r
+\r
+namespace lyx {\r
+\r
+/// An inset with an instant preview\r
+class InsetPreview : public InsetText {\r
+       \r
+public:\r
+       ///\r
+       InsetPreview(Buffer *);\r
+       ///\r
+       ~InsetPreview();\r
+       ///\r
+       InsetPreview(InsetPreview const & other);\r
+\r
+       /// \name Methods inherited from Inset class\r
+       //@{\r
+       Inset * clone() const { return new InsetPreview(*this); }\r
+\r
+       bool neverIndent() const { return true; }\r
+       \r
+       InsetCode lyxCode() const { return PREVIEW_CODE; }\r
+       \r
+       docstring name() const { return from_ascii("Preview"); }\r
+       \r
+       bool descendable(BufferView const & /*bv*/) const { return true; }\r
+\r
+       docstring contextMenu(BufferView const & bv, int x, int y) const\r
+               { return from_ascii("context-preview"); }\r
+\r
+       void metrics(MetricsInfo & mi, Dimension & dim) const;\r
+\r
+       Inset * editXY(Cursor & cur, int x, int y);\r
+\r
+       void draw(PainterInfo & pi, int x, int y) const;\r
+\r
+       void addPreview(DocIterator const & inset_pos,\r
+               graphics::PreviewLoader & ploader) const;\r
+\r
+       bool notifyCursorLeaves(Cursor const & old, Cursor & cur);\r
+\r
+       void write(std::ostream & os) const;\r
+\r
+       void edit(Cursor & cur, bool front, EntryDirection entry_from);\r
+       //@}\r
+       \r
+protected:\r
+       /// Retrieves the preview state. Returns true if preview\r
+       /// is enabled and the preview image is availabled.\r
+       bool previewState(BufferView * bv) const;\r
+       /// Recreates the preview if preview is enabled.\r
+       void reloadPreview(DocIterator const & pos) const;\r
+       /// Prepare the preview if preview is enabled.\r
+       void preparePreview(DocIterator const & pos) const;\r
+\r
+       ///\r
+       boost::scoped_ptr<RenderPreview> preview_;\r
+       ///\r
+       mutable bool use_preview_;\r
+\r
+private:\r
+       ///\r
+       mutable Dimension dim_;\r
+};\r
+\r
+\r
+} // namespace lyx\r
+\r
+\r
+#endif\r
+\r
index 99987196c9f6c025417db78379bf5fc490b04e0c..d398c87f4c40bffe1d332f733c0bf493e1fb4aa5 100644 (file)
@@ -4288,6 +4288,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_BRANCH_INSERT:
        case LFUN_PHANTOM_INSERT:
        case LFUN_WRAP_INSERT:
+       case LFUN_PREVIEW_INSERT:
        case LFUN_ERT_INSERT: {
                if (cur.selIsMultiCell()) {
                        status.setEnabled(false);