From: Jean-Marc Lasgouttes [lasgout...@lyx.org]
Sent: Sunday, July 15, 2012 5:14 PM
>Moreover, this code should not be in GuiView, but in
>GuiApplication, since the function is at application level.
Attached is my attempt to move the code to GuiApplication. I am having trouble
instantiating a GuiWorkArea. Here are the errors I get:
GuiApplication.cpp: In member function ‘virtual void
lyx::frontend::GuiApplication::dispatch(const lyx::FuncRequest&,
lyx::DispatchResult&)’:
GuiApplication.cpp:1633:8: error: invalid use of incomplete type ‘class
lyx::frontend::GuiWorkArea’
In file included from GuiApplication.cpp:15:0:
GuiApplication.h:41:7: error: forward declaration of ‘class
lyx::frontend::GuiWorkArea’
I think that this patch also addresses the other points you raised.
Thanks,
Scott
diff --git a/src/FuncCode.h b/src/FuncCode.h
index 9a7b06e..2c99432 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -452,6 +452,7 @@ enum FuncCode
// 350
LFUN_CLIPBOARD_PASTE_SIMPLE, // tommaso, 20111028
LFUN_IPA_INSERT, // spitz, 20120305
+ LFUN_BUFFER_FORALL, // scottkostyshak, 20120715
LFUN_LASTACTION // end of the table
};
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 39018ce..ff3f7fe 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -3127,6 +3127,26 @@ void LyXAction::init()
*/
{ LFUN_BUFFER_WRITE_AS, "buffer-write-as", ReadOnly, Buffer },
/*!
+ * \var lyx::FuncCode lyx::LFUN_BUFFER_FORALL
+ * \li Action: Applies a command to all visible, hidden, or both types of buffers.
+ * \li Syntax: buffer-forall [<BUFFER-TYPE>] <LFUN-COMMAND>
+ * \li Params: <BUFFER-TYPE>: <visible|hidden|both default:> default: visible
+ <LFUN-COMMAND>: The command that is to be applied to the buffers.
+ * \li Sample: Close all Notes in all visible documents: \n
+ buffer-forall inset-forall Note inset-toggle close \n
+ Toggle change tracking on all documents: \n
+ buffer-forall both changes-track \n
+ Toggle read-only for all visible documents: \n
+ buffer-forall buffer-toggle-read-only \n
+ Show statistics for each document: \n
+ buffer-forall both statistics \n
+ Activate the branch named "Solutions" in all visible documents: \n
+ buffer-forall branch-activate Solutions \n
+ * \li Origin: scottkostyshak, 15 Jul 2012
+ * \endvar
+ */
+ { LFUN_BUFFER_FORALL, "buffer-forall", ReadOnly | Argument, Buffer },
+/*!
* \var lyx::FuncCode lyx::LFUN_BUFFER_WRITE_ALL
* \li Action: Save all changed documents.
* \li Syntax: buffer-write-all
diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp
index b855067..fe37b81 100644
--- a/src/frontends/qt4/GuiApplication.cpp
+++ b/src/frontends/qt4/GuiApplication.cpp
@@ -1074,6 +1074,7 @@ bool GuiApplication::getStatus(FuncRequest const & cmd, FuncStatus & flag) const
case LFUN_RECONFIGURE:
case LFUN_SERVER_GET_FILENAME:
case LFUN_SERVER_NOTIFY:
+ case LFUN_BUFFER_FORALL:
enable = true;
break;
@@ -1592,6 +1593,64 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
break;
}
+ case LFUN_BUFFER_FORALL: {
+ GuiView * cv = currentView();
+ Buffer * const buf = &cv->currentBufferView()->buffer();
+
+ bool processVisible = true;
+ bool processHidden = false;
+ docstring msg = _("Applied the following command to all visible buffers: ");
+ string commandToRun = argument;
+ if (cmd.getArg(0) == "both") {
+ processHidden = true;
+ msg = _("Applied the following command to all visible and hidden buffers: ");
+ commandToRun = cmd.getLongArg(1);
+ } else if (cmd.getArg(0) == "visible") {
+ commandToRun = cmd.getLongArg(1);
+ } else if (cmd.getArg(0) == "hidden") {
+ processHidden = true;
+ processVisible = false;
+ commandToRun = cmd.getLongArg(1);
+ msg = _("Applied the following command to all hidden buffers: ");
+ }
+ FuncRequest FuncToRun = lyxaction.lookupFunc(commandToRun);
+ dr.setMessage(bformat(_("%1$s%2$s"), msg, from_utf8(commandToRun)));
+
+ Buffer * const last = theBufferList().last();
+ Buffer * b = theBufferList().first();
+ Buffer * nextBuf = 0;
+ // We cannot use a for loop as the buffer list cycles.
+ while (true) {
+ if (b != last)
+ nextBuf = theBufferList().next(b); //get next now bc LFUN might close current
+
+ bool const hidden = !(guiApp->currentView() && guiApp->currentView()->workArea(*b));
+ if (hidden) {
+ if (processHidden) {
+ cv->setBuffer(b);
+ lyx::dispatch(FuncToRun);
+ GuiWorkArea * const wa = cv->currentWorkArea();
+ wa->view().hideWorkArea(wa);
+ }
+ }
+
+ else {
+ if (processVisible) {
+ cv->setBuffer(b);
+ lyx::dispatch(FuncToRun);
+ }
+ }
+
+ if (b == last)
+ break;
+ b = nextBuf;
+ }
+
+ if (theBufferList().isLoaded(buf)) //the LFUN might have closed buf
+ cv->setBuffer(buf);
+ break;
+ }
+
case LFUN_COMMAND_ALTERNATIVES: {
// argument contains ';'-terminated commands
string arg = argument;