mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-06 00:10:59 +00:00
make LyXView almost pure virtual. Merge implementation with GuiView
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21566 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
fec095e310
commit
309232d26b
@ -1,283 +0,0 @@
|
|||||||
/**
|
|
||||||
* \file LyXView.cpp
|
|
||||||
* This file is part of LyX, the document processor.
|
|
||||||
* Licence details can be found in the file COPYING.
|
|
||||||
*
|
|
||||||
* \author Lars Gullik Bjønnes
|
|
||||||
* \author John Levon
|
|
||||||
*
|
|
||||||
* Full author contact details are available in file CREDITS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "LyXView.h"
|
|
||||||
|
|
||||||
#include "Dialogs.h"
|
|
||||||
#include "WorkArea.h"
|
|
||||||
#include "Gui.h"
|
|
||||||
|
|
||||||
#include "Buffer.h"
|
|
||||||
#include "buffer_funcs.h"
|
|
||||||
#include "BufferList.h"
|
|
||||||
#include "BufferParams.h"
|
|
||||||
#include "BufferView.h"
|
|
||||||
#include "Cursor.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "ErrorList.h"
|
|
||||||
#include "FuncRequest.h"
|
|
||||||
#include "gettext.h"
|
|
||||||
#include "Intl.h"
|
|
||||||
#include "Layout.h"
|
|
||||||
#include "LyX.h"
|
|
||||||
#include "LyXFunc.h"
|
|
||||||
#include "LyXRC.h"
|
|
||||||
#include "MenuBackend.h"
|
|
||||||
#include "Paragraph.h"
|
|
||||||
#include "Session.h"
|
|
||||||
#include "Text.h"
|
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
|
||||||
#include "support/filetools.h" // OnlyFilename()
|
|
||||||
#include "support/Timeout.h"
|
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TIME_H
|
|
||||||
# include <sys/time.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using std::endl;
|
|
||||||
using std::string;
|
|
||||||
|
|
||||||
namespace lyx {
|
|
||||||
|
|
||||||
using support::bformat;
|
|
||||||
using support::FileName;
|
|
||||||
using support::makeDisplayPath;
|
|
||||||
using support::onlyFilename;
|
|
||||||
|
|
||||||
namespace frontend {
|
|
||||||
|
|
||||||
LyXView::LyXView(int id)
|
|
||||||
: autosave_timeout_(new Timeout(5000)),
|
|
||||||
dialogs_(new Dialogs(*this)),
|
|
||||||
id_(id)
|
|
||||||
{
|
|
||||||
// Start autosave timer
|
|
||||||
if (lyxrc.autosave) {
|
|
||||||
autosave_timeout_->timeout.connect(boost::bind(&LyXView::autoSave, this));
|
|
||||||
autosave_timeout_->setTimeout(lyxrc.autosave * 1000);
|
|
||||||
autosave_timeout_->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LyXView::~LyXView()
|
|
||||||
{
|
|
||||||
delete dialogs_;
|
|
||||||
delete autosave_timeout_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Buffer * LyXView::buffer()
|
|
||||||
{
|
|
||||||
WorkArea * work_area = currentWorkArea();
|
|
||||||
if (work_area)
|
|
||||||
return &work_area->bufferView().buffer();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Buffer const * LyXView::buffer() const
|
|
||||||
{
|
|
||||||
WorkArea const * work_area = currentWorkArea();
|
|
||||||
if (work_area)
|
|
||||||
return &work_area->bufferView().buffer();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::setBuffer(Buffer * newBuffer)
|
|
||||||
{
|
|
||||||
BOOST_ASSERT(newBuffer);
|
|
||||||
setBusy(true);
|
|
||||||
|
|
||||||
WorkArea * wa = workArea(*newBuffer);
|
|
||||||
if (wa == 0) {
|
|
||||||
updateLabels(*newBuffer->masterBuffer());
|
|
||||||
wa = addWorkArea(*newBuffer);
|
|
||||||
} else {
|
|
||||||
//Disconnect the old buffer...there's no new one.
|
|
||||||
disconnectBuffer();
|
|
||||||
}
|
|
||||||
connectBuffer(*newBuffer);
|
|
||||||
connectBufferView(wa->bufferView());
|
|
||||||
setCurrentWorkArea(wa);
|
|
||||||
|
|
||||||
setBusy(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Buffer * LyXView::loadLyXFile(FileName const & filename, bool tolastfiles)
|
|
||||||
{
|
|
||||||
setBusy(true);
|
|
||||||
|
|
||||||
Buffer * newBuffer = checkAndLoadLyXFile(filename);
|
|
||||||
|
|
||||||
if (!newBuffer) {
|
|
||||||
message(_("Document not loaded."));
|
|
||||||
updateStatusBar();
|
|
||||||
setBusy(false);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorkArea * wa = workArea(*newBuffer);
|
|
||||||
if (wa == 0)
|
|
||||||
wa = addWorkArea(*newBuffer);
|
|
||||||
|
|
||||||
// scroll to the position when the file was last closed
|
|
||||||
if (lyxrc.use_lastfilepos) {
|
|
||||||
LastFilePosSection::FilePos filepos =
|
|
||||||
LyX::ref().session().lastFilePos().load(filename);
|
|
||||||
// if successfully move to pit (returned par_id is not zero),
|
|
||||||
// update metrics and reset font
|
|
||||||
wa->bufferView().moveToPosition(filepos.pit, filepos.pos, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tolastfiles)
|
|
||||||
LyX::ref().session().lastFiles().add(filename);
|
|
||||||
|
|
||||||
setBusy(false);
|
|
||||||
return newBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::connectBuffer(Buffer & buf)
|
|
||||||
{
|
|
||||||
buf.setGuiDelegate(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::disconnectBuffer()
|
|
||||||
{
|
|
||||||
if (WorkArea * work_area = currentWorkArea())
|
|
||||||
work_area->bufferView().setGuiDelegate(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::connectBufferView(BufferView & bv)
|
|
||||||
{
|
|
||||||
bv.setGuiDelegate(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::disconnectBufferView()
|
|
||||||
{
|
|
||||||
if (WorkArea * work_area = currentWorkArea())
|
|
||||||
work_area->bufferView().setGuiDelegate(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::showErrorList(string const & error_type)
|
|
||||||
{
|
|
||||||
ErrorList & el = buffer()->errorList(error_type);
|
|
||||||
if (!el.empty())
|
|
||||||
getDialogs().show("errorlist", error_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::showDialog(string const & name)
|
|
||||||
{
|
|
||||||
getDialogs().show(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::showDialogWithData(string const & name, string const & data)
|
|
||||||
{
|
|
||||||
getDialogs().show(name, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::showInsetDialog(string const & name, string const & data,
|
|
||||||
Inset * inset)
|
|
||||||
{
|
|
||||||
getDialogs().show(name, data, inset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::updateDialog(string const & name, string const & data)
|
|
||||||
{
|
|
||||||
if (getDialogs().visible(name))
|
|
||||||
getDialogs().update(name, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BufferView * LyXView::view()
|
|
||||||
{
|
|
||||||
WorkArea * wa = currentWorkArea();
|
|
||||||
return wa? &wa->bufferView() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::updateToc()
|
|
||||||
{
|
|
||||||
updateDialog("toc", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::updateEmbeddedFiles()
|
|
||||||
{
|
|
||||||
updateDialog("embedding", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::autoSave()
|
|
||||||
{
|
|
||||||
LYXERR(Debug::INFO) << "Running autoSave()" << endl;
|
|
||||||
|
|
||||||
if (buffer())
|
|
||||||
view()->buffer().autoSave();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::resetAutosaveTimer()
|
|
||||||
{
|
|
||||||
if (lyxrc.autosave)
|
|
||||||
autosave_timeout_->restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LyXView::dispatch(FuncRequest const & cmd)
|
|
||||||
{
|
|
||||||
string const argument = to_utf8(cmd.argument());
|
|
||||||
switch(cmd.action) {
|
|
||||||
case LFUN_BUFFER_SWITCH:
|
|
||||||
setBuffer(theBufferList().getBuffer(to_utf8(cmd.argument())));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
theLyXFunc().setLyXView(this);
|
|
||||||
lyx::dispatch(cmd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Buffer const * LyXView::updateInset(Inset const * inset)
|
|
||||||
{
|
|
||||||
WorkArea * work_area = currentWorkArea();
|
|
||||||
if (!work_area)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (inset) {
|
|
||||||
BOOST_ASSERT(work_area);
|
|
||||||
work_area->scheduleRedraw();
|
|
||||||
}
|
|
||||||
return &work_area->bufferView().buffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace frontend
|
|
||||||
} // namespace lyx
|
|
@ -13,9 +13,8 @@
|
|||||||
#ifndef LYXVIEW_H
|
#ifndef LYXVIEW_H
|
||||||
#define LYXVIEW_H
|
#define LYXVIEW_H
|
||||||
|
|
||||||
#include "frontends/Application.h"
|
|
||||||
#include "frontends/Delegates.h"
|
#include "frontends/Delegates.h"
|
||||||
#include "support/docstring.h"
|
#include "support/strfwd.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -23,12 +22,10 @@ namespace lyx {
|
|||||||
|
|
||||||
namespace support { class FileName; }
|
namespace support { class FileName; }
|
||||||
|
|
||||||
class Font;
|
|
||||||
class Buffer;
|
class Buffer;
|
||||||
class BufferView;
|
class BufferView;
|
||||||
class FuncRequest;
|
class FuncRequest;
|
||||||
class Inset;
|
class Inset;
|
||||||
class Timeout;
|
|
||||||
class ToolbarInfo;
|
class ToolbarInfo;
|
||||||
|
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
@ -54,7 +51,7 @@ class LyXView
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
LyXView(int id);
|
LyXView(int id) : id_(id) {}
|
||||||
///
|
///
|
||||||
virtual ~LyXView();
|
virtual ~LyXView();
|
||||||
///
|
///
|
||||||
@ -110,11 +107,13 @@ public:
|
|||||||
//@{ generic accessor functions
|
//@{ generic accessor functions
|
||||||
|
|
||||||
/// \return the current buffer view.
|
/// \return the current buffer view.
|
||||||
BufferView * view();
|
virtual BufferView * view() = 0;
|
||||||
|
|
||||||
/// \return the buffer currently shown in this window
|
/// \return the buffer currently shown in this window
|
||||||
Buffer * buffer();
|
virtual Buffer * buffer() = 0;
|
||||||
Buffer const * buffer() const;
|
virtual Buffer const * buffer() const = 0;
|
||||||
|
/// set a buffer to the current workarea.
|
||||||
|
virtual void setBuffer(Buffer * b) = 0; ///< \c Buffer to set.
|
||||||
|
|
||||||
///
|
///
|
||||||
virtual void openLayoutList() = 0;
|
virtual void openLayoutList() = 0;
|
||||||
@ -125,18 +124,15 @@ public:
|
|||||||
virtual void openMenu(docstring const & name) = 0;
|
virtual void openMenu(docstring const & name) = 0;
|
||||||
|
|
||||||
/// get access to the dialogs
|
/// get access to the dialogs
|
||||||
Dialogs & getDialogs() { return *dialogs_; }
|
virtual Dialogs & getDialogs() = 0;
|
||||||
///
|
///
|
||||||
Dialogs const & getDialogs() const { return *dialogs_; }
|
virtual Dialogs const & getDialogs() const = 0;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/// load a buffer into the current workarea.
|
/// load a buffer into the current workarea.
|
||||||
Buffer * loadLyXFile(support::FileName const & name, ///< File to load.
|
virtual Buffer * loadLyXFile(support::FileName const & name, ///< File to load.
|
||||||
bool tolastfiles = true); ///< append to the "Open recent" menu?
|
bool tolastfiles = true) = 0; ///< append to the "Open recent" menu?
|
||||||
|
|
||||||
/// set a buffer to the current workarea.
|
|
||||||
void setBuffer(Buffer * b); ///< \c Buffer to set.
|
|
||||||
|
|
||||||
/// updates the possible layouts selectable
|
/// updates the possible layouts selectable
|
||||||
virtual void updateLayoutChoice(bool force) = 0;
|
virtual void updateLayoutChoice(bool force) = 0;
|
||||||
@ -157,72 +153,58 @@ public:
|
|||||||
virtual void clearMessage() = 0;
|
virtual void clearMessage() = 0;
|
||||||
|
|
||||||
/// reset autosave timer
|
/// reset autosave timer
|
||||||
void resetAutosaveTimer();
|
virtual void resetAutosaveTimer() = 0;
|
||||||
|
|
||||||
/// dispatch to current BufferView
|
/// dispatch to current BufferView
|
||||||
void dispatch(FuncRequest const & cmd);
|
virtual void dispatch(FuncRequest const & cmd) = 0;
|
||||||
|
|
||||||
/** redraw \c inset in all the BufferViews in which it is currently
|
/** redraw \c inset in all the BufferViews in which it is currently
|
||||||
* visible. If successful return a pointer to the owning Buffer.
|
* visible. If successful return a pointer to the owning Buffer.
|
||||||
*/
|
*/
|
||||||
Buffer const * updateInset(Inset const *);
|
virtual Buffer const * updateInset(Inset const *) = 0;
|
||||||
|
|
||||||
/// returns true if this view has the focus.
|
/// returns true if this view has the focus.
|
||||||
virtual bool hasFocus() const = 0;
|
virtual bool hasFocus() const = 0;
|
||||||
|
|
||||||
/// show the error list to the user
|
/// show the error list to the user
|
||||||
void showErrorList(std::string const &);
|
virtual void showErrorList(std::string const &) = 0;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// GuiBufferDelegate
|
// GuiBufferDelegate
|
||||||
//
|
//
|
||||||
/// This function is called when the buffer structure is changed.
|
/// This function is called when the buffer structure is changed.
|
||||||
void structureChanged() { updateToc(); }
|
virtual void structureChanged() = 0;
|
||||||
/// This function is called when some parsing error shows up.
|
/// This function is called when some parsing error shows up.
|
||||||
void errors(std::string const & err) { showErrorList(err); }
|
void errors(std::string const & err) { showErrorList(err); }
|
||||||
/// Reset autosave timers for all users.
|
/// Reset autosave timers for all users.
|
||||||
void resetAutosaveTimers() { resetAutosaveTimer(); }
|
void resetAutosaveTimers() { resetAutosaveTimer(); }
|
||||||
|
|
||||||
/// connect to signals in the given BufferView
|
/// connect to signals in the given BufferView
|
||||||
void connectBufferView(BufferView & bv);
|
virtual void connectBufferView(BufferView & bv) = 0;
|
||||||
/// disconnect from signals in the given BufferView
|
/// disconnect from signals in the given BufferView
|
||||||
void disconnectBufferView();
|
virtual void disconnectBufferView() = 0;
|
||||||
/// connect to signals in the given buffer
|
/// connect to signals in the given buffer
|
||||||
void connectBuffer(Buffer & buf);
|
virtual void connectBuffer(Buffer & buf) = 0;
|
||||||
/// disconnect from signals in the given buffer
|
/// disconnect from signals in the given buffer
|
||||||
void disconnectBuffer();
|
virtual void disconnectBuffer() = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// noncopyable
|
/// noncopyable
|
||||||
LyXView(LyXView const &);
|
LyXView(LyXView const &);
|
||||||
void operator=(LyXView const &);
|
void operator=(LyXView const &);
|
||||||
|
|
||||||
/// called on timeout
|
|
||||||
void autoSave();
|
|
||||||
|
|
||||||
/// auto-saving of buffers
|
|
||||||
Timeout * const autosave_timeout_;
|
|
||||||
/// dialogs for this view
|
|
||||||
Dialogs * dialogs_;
|
|
||||||
|
|
||||||
/// Bind methods for BufferView messages signal connection
|
/// Bind methods for BufferView messages signal connection
|
||||||
//@{
|
//@{
|
||||||
void showDialog(std::string const & name);
|
virtual void showDialog(std::string const & name) = 0;
|
||||||
void showDialogWithData(std::string const & name,
|
virtual void showDialogWithData(std::string const & name,
|
||||||
std::string const & data);
|
std::string const & data) = 0;
|
||||||
void showInsetDialog(std::string const & name,
|
virtual void showInsetDialog(std::string const & name,
|
||||||
std::string const & data, Inset * inset);
|
std::string const & data, Inset * inset) = 0;
|
||||||
void updateDialog(std::string const & name,
|
virtual void updateDialog(std::string const & name,
|
||||||
std::string const & data);
|
std::string const & data) = 0;
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
protected:
|
|
||||||
///
|
|
||||||
void updateToc();
|
|
||||||
///
|
|
||||||
void updateEmbeddedFiles();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int id_;
|
int id_;
|
||||||
};
|
};
|
||||||
|
@ -27,7 +27,6 @@ liblyxfrontends_la_SOURCES = \
|
|||||||
FontMetrics.h \
|
FontMetrics.h \
|
||||||
KeyModifier.h \
|
KeyModifier.h \
|
||||||
KeySymbol.h \
|
KeySymbol.h \
|
||||||
LyXView.cpp \
|
|
||||||
LyXView.h \
|
LyXView.h \
|
||||||
Painter.cpp \
|
Painter.cpp \
|
||||||
Painter.h \
|
Painter.h \
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
#include "GuiMenubar.h"
|
#include "GuiMenubar.h"
|
||||||
#include "GuiToolbar.h"
|
#include "GuiToolbar.h"
|
||||||
#include "GuiToolbars.h"
|
#include "GuiToolbars.h"
|
||||||
|
#include "Dialogs.h"
|
||||||
|
#include "WorkArea.h"
|
||||||
|
#include "Gui.h"
|
||||||
|
|
||||||
#include "qt_helpers.h"
|
#include "qt_helpers.h"
|
||||||
|
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
@ -33,24 +37,33 @@
|
|||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/os.h"
|
#include "support/os.h"
|
||||||
|
|
||||||
|
#include "buffer_funcs.h"
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
|
#include "BufferList.h"
|
||||||
#include "BufferParams.h"
|
#include "BufferParams.h"
|
||||||
#include "BufferView.h"
|
#include "BufferView.h"
|
||||||
#include "BufferList.h"
|
|
||||||
#include "Cursor.h"
|
#include "Cursor.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "ErrorList.h"
|
||||||
#include "FuncRequest.h"
|
#include "FuncRequest.h"
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "Intl.h"
|
||||||
#include "Layout.h"
|
#include "Layout.h"
|
||||||
#include "LyX.h"
|
|
||||||
#include "LyXFunc.h"
|
#include "LyXFunc.h"
|
||||||
|
#include "LyX.h"
|
||||||
#include "LyXRC.h"
|
#include "LyXRC.h"
|
||||||
#include "MenuBackend.h"
|
#include "MenuBackend.h"
|
||||||
#include "Paragraph.h"
|
#include "Paragraph.h"
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
#include "TextClass.h"
|
#include "TextClass.h"
|
||||||
|
#include "Text.h"
|
||||||
#include "ToolbarBackend.h"
|
#include "ToolbarBackend.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#include "support/lstrings.h"
|
||||||
|
#include "support/filetools.h" // OnlyFilename()
|
||||||
|
#include "support/Timeout.h"
|
||||||
|
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
@ -68,8 +81,16 @@
|
|||||||
#include <QToolBar>
|
#include <QToolBar>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include <boost/bind.hpp>
|
||||||
#include <boost/current_function.hpp>
|
#include <boost/current_function.hpp>
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
# include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
using std::endl;
|
using std::endl;
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
@ -80,6 +101,11 @@ extern bool quitting;
|
|||||||
|
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
|
||||||
|
using support::bformat;
|
||||||
|
using support::FileName;
|
||||||
|
using support::makeDisplayPath;
|
||||||
|
using support::onlyFilename;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
int const statusbar_timer_value = 3000;
|
int const statusbar_timer_value = 3000;
|
||||||
@ -126,22 +152,6 @@ private:
|
|||||||
|
|
||||||
struct GuiView::GuiViewPrivate
|
struct GuiView::GuiViewPrivate
|
||||||
{
|
{
|
||||||
string cur_title;
|
|
||||||
|
|
||||||
int posx_offset;
|
|
||||||
int posy_offset;
|
|
||||||
|
|
||||||
GuiWorkArea * current_work_area_;
|
|
||||||
QSplitter * splitter_;
|
|
||||||
QStackedWidget * stack_widget_;
|
|
||||||
BackgroundWidget * bg_widget_;
|
|
||||||
/// view's menubar
|
|
||||||
GuiMenubar * menubar_;
|
|
||||||
/// view's toolbars
|
|
||||||
GuiToolbars * toolbars_;
|
|
||||||
///
|
|
||||||
docstring current_layout;
|
|
||||||
|
|
||||||
GuiViewPrivate()
|
GuiViewPrivate()
|
||||||
: current_work_area_(0), posx_offset(0), posy_offset(0)
|
: current_work_area_(0), posx_offset(0), posy_offset(0)
|
||||||
{}
|
{}
|
||||||
@ -170,19 +180,22 @@ struct GuiView::GuiViewPrivate
|
|||||||
QAction * smallIcons = new QAction(iconSizeGroup);
|
QAction * smallIcons = new QAction(iconSizeGroup);
|
||||||
smallIcons->setText(qt_("Small-sized icons"));
|
smallIcons->setText(qt_("Small-sized icons"));
|
||||||
smallIcons->setCheckable(true);
|
smallIcons->setCheckable(true);
|
||||||
QObject::connect(smallIcons, SIGNAL(triggered()), parent, SLOT(smallSizedIcons()));
|
QObject::connect(smallIcons, SIGNAL(triggered()),
|
||||||
|
parent, SLOT(smallSizedIcons()));
|
||||||
menu->addAction(smallIcons);
|
menu->addAction(smallIcons);
|
||||||
|
|
||||||
QAction * normalIcons = new QAction(iconSizeGroup);
|
QAction * normalIcons = new QAction(iconSizeGroup);
|
||||||
normalIcons->setText(qt_("Normal-sized icons"));
|
normalIcons->setText(qt_("Normal-sized icons"));
|
||||||
normalIcons->setCheckable(true);
|
normalIcons->setCheckable(true);
|
||||||
QObject::connect(normalIcons, SIGNAL(triggered()), parent, SLOT(normalSizedIcons()));
|
QObject::connect(normalIcons, SIGNAL(triggered()),
|
||||||
|
parent, SLOT(normalSizedIcons()));
|
||||||
menu->addAction(normalIcons);
|
menu->addAction(normalIcons);
|
||||||
|
|
||||||
QAction * bigIcons = new QAction(iconSizeGroup);
|
QAction * bigIcons = new QAction(iconSizeGroup);
|
||||||
bigIcons->setText(qt_("Big-sized icons"));
|
bigIcons->setText(qt_("Big-sized icons"));
|
||||||
bigIcons->setCheckable(true);
|
bigIcons->setCheckable(true);
|
||||||
QObject::connect(bigIcons, SIGNAL(triggered()), parent, SLOT(bigSizedIcons()));
|
QObject::connect(bigIcons, SIGNAL(triggered()),
|
||||||
|
parent, SLOT(bigSizedIcons()));
|
||||||
menu->addAction(bigIcons);
|
menu->addAction(bigIcons);
|
||||||
|
|
||||||
unsigned int cur = parent->iconSize().width();
|
unsigned int cur = parent->iconSize().width();
|
||||||
@ -233,16 +246,48 @@ struct GuiView::GuiViewPrivate
|
|||||||
|
|
||||||
return tab_widget;
|
return tab_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
string cur_title;
|
||||||
|
|
||||||
|
GuiWorkArea * current_work_area_;
|
||||||
|
int posx_offset;
|
||||||
|
int posy_offset;
|
||||||
|
|
||||||
|
QSplitter * splitter_;
|
||||||
|
QStackedWidget * stack_widget_;
|
||||||
|
BackgroundWidget * bg_widget_;
|
||||||
|
/// view's menubar
|
||||||
|
GuiMenubar * menubar_;
|
||||||
|
/// view's toolbars
|
||||||
|
GuiToolbars * toolbars_;
|
||||||
|
///
|
||||||
|
docstring current_layout;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
unsigned int GuiView::GuiViewPrivate::lastIconSize = 0;
|
unsigned int GuiView::GuiViewPrivate::lastIconSize = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/// FIXME
|
||||||
|
LyXView::~LyXView() {}
|
||||||
|
|
||||||
|
|
||||||
GuiView::GuiView(int id)
|
GuiView::GuiView(int id)
|
||||||
: QMainWindow(), LyXView(id), quitting_by_menu_(false),
|
: QMainWindow(), LyXView(id),
|
||||||
d(*new GuiViewPrivate)
|
d(*new GuiViewPrivate),
|
||||||
|
quitting_by_menu_(false),
|
||||||
|
autosave_timeout_(new Timeout(5000)),
|
||||||
|
dialogs_(new Dialogs(*this))
|
||||||
{
|
{
|
||||||
|
// Start autosave timer
|
||||||
|
if (lyxrc.autosave) {
|
||||||
|
autosave_timeout_->timeout.connect(boost::bind(&GuiView::autoSave, this));
|
||||||
|
autosave_timeout_->setTimeout(lyxrc.autosave * 1000);
|
||||||
|
autosave_timeout_->start();
|
||||||
|
}
|
||||||
|
|
||||||
// Qt bug? signal lastWindowClosed does not work
|
// Qt bug? signal lastWindowClosed does not work
|
||||||
setAttribute(Qt::WA_QuitOnClose, false);
|
setAttribute(Qt::WA_QuitOnClose, false);
|
||||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
@ -275,6 +320,8 @@ GuiView::GuiView(int id)
|
|||||||
|
|
||||||
GuiView::~GuiView()
|
GuiView::~GuiView()
|
||||||
{
|
{
|
||||||
|
delete dialogs_;
|
||||||
|
delete autosave_timeout_;
|
||||||
delete &d;
|
delete &d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1024,6 +1071,201 @@ void GuiView::toggleToolbarState(string const & name, bool allowauto)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Buffer * GuiView::buffer()
|
||||||
|
{
|
||||||
|
WorkArea * work_area = currentWorkArea();
|
||||||
|
if (work_area)
|
||||||
|
return &work_area->bufferView().buffer();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Buffer const * GuiView::buffer() const
|
||||||
|
{
|
||||||
|
WorkArea const * work_area = currentWorkArea();
|
||||||
|
if (work_area)
|
||||||
|
return &work_area->bufferView().buffer();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::setBuffer(Buffer * newBuffer)
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(newBuffer);
|
||||||
|
setBusy(true);
|
||||||
|
|
||||||
|
WorkArea * wa = workArea(*newBuffer);
|
||||||
|
if (wa == 0) {
|
||||||
|
updateLabels(*newBuffer->masterBuffer());
|
||||||
|
wa = addWorkArea(*newBuffer);
|
||||||
|
} else {
|
||||||
|
//Disconnect the old buffer...there's no new one.
|
||||||
|
disconnectBuffer();
|
||||||
|
}
|
||||||
|
connectBuffer(*newBuffer);
|
||||||
|
connectBufferView(wa->bufferView());
|
||||||
|
setCurrentWorkArea(wa);
|
||||||
|
|
||||||
|
setBusy(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Buffer * GuiView::loadLyXFile(FileName const & filename, bool tolastfiles)
|
||||||
|
{
|
||||||
|
setBusy(true);
|
||||||
|
|
||||||
|
Buffer * newBuffer = checkAndLoadLyXFile(filename);
|
||||||
|
|
||||||
|
if (!newBuffer) {
|
||||||
|
message(_("Document not loaded."));
|
||||||
|
updateStatusBar();
|
||||||
|
setBusy(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorkArea * wa = workArea(*newBuffer);
|
||||||
|
if (wa == 0)
|
||||||
|
wa = addWorkArea(*newBuffer);
|
||||||
|
|
||||||
|
// scroll to the position when the file was last closed
|
||||||
|
if (lyxrc.use_lastfilepos) {
|
||||||
|
LastFilePosSection::FilePos filepos =
|
||||||
|
LyX::ref().session().lastFilePos().load(filename);
|
||||||
|
// if successfully move to pit (returned par_id is not zero),
|
||||||
|
// update metrics and reset font
|
||||||
|
wa->bufferView().moveToPosition(filepos.pit, filepos.pos, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tolastfiles)
|
||||||
|
LyX::ref().session().lastFiles().add(filename);
|
||||||
|
|
||||||
|
setBusy(false);
|
||||||
|
return newBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::connectBuffer(Buffer & buf)
|
||||||
|
{
|
||||||
|
buf.setGuiDelegate(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::disconnectBuffer()
|
||||||
|
{
|
||||||
|
if (WorkArea * work_area = currentWorkArea())
|
||||||
|
work_area->bufferView().setGuiDelegate(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::connectBufferView(BufferView & bv)
|
||||||
|
{
|
||||||
|
bv.setGuiDelegate(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::disconnectBufferView()
|
||||||
|
{
|
||||||
|
if (WorkArea * work_area = currentWorkArea())
|
||||||
|
work_area->bufferView().setGuiDelegate(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::showErrorList(string const & error_type)
|
||||||
|
{
|
||||||
|
ErrorList & el = buffer()->errorList(error_type);
|
||||||
|
if (!el.empty())
|
||||||
|
getDialogs().show("errorlist", error_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::showDialog(string const & name)
|
||||||
|
{
|
||||||
|
getDialogs().show(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::showDialogWithData(string const & name, string const & data)
|
||||||
|
{
|
||||||
|
getDialogs().show(name, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::showInsetDialog(string const & name, string const & data,
|
||||||
|
Inset * inset)
|
||||||
|
{
|
||||||
|
getDialogs().show(name, data, inset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::updateDialog(string const & name, string const & data)
|
||||||
|
{
|
||||||
|
if (getDialogs().visible(name))
|
||||||
|
getDialogs().update(name, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BufferView * GuiView::view()
|
||||||
|
{
|
||||||
|
WorkArea * wa = currentWorkArea();
|
||||||
|
return wa ? &wa->bufferView() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::updateToc()
|
||||||
|
{
|
||||||
|
updateDialog("toc", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::updateEmbeddedFiles()
|
||||||
|
{
|
||||||
|
updateDialog("embedding", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::autoSave()
|
||||||
|
{
|
||||||
|
LYXERR(Debug::INFO) << "Running autoSave()" << endl;
|
||||||
|
|
||||||
|
if (buffer())
|
||||||
|
view()->buffer().autoSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::resetAutosaveTimer()
|
||||||
|
{
|
||||||
|
if (lyxrc.autosave)
|
||||||
|
autosave_timeout_->restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiView::dispatch(FuncRequest const & cmd)
|
||||||
|
{
|
||||||
|
string const argument = to_utf8(cmd.argument());
|
||||||
|
switch(cmd.action) {
|
||||||
|
case LFUN_BUFFER_SWITCH:
|
||||||
|
setBuffer(theBufferList().getBuffer(to_utf8(cmd.argument())));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
theLyXFunc().setLyXView(this);
|
||||||
|
lyx::dispatch(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Buffer const * GuiView::updateInset(Inset const * inset)
|
||||||
|
{
|
||||||
|
WorkArea * work_area = currentWorkArea();
|
||||||
|
if (!work_area)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (inset) {
|
||||||
|
BOOST_ASSERT(work_area);
|
||||||
|
work_area->scheduleRedraw();
|
||||||
|
}
|
||||||
|
return &work_area->bufferView().buffer();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
|
||||||
|
@ -16,20 +16,20 @@
|
|||||||
#define GUI_VIEW_H
|
#define GUI_VIEW_H
|
||||||
|
|
||||||
#include "frontends/LyXView.h"
|
#include "frontends/LyXView.h"
|
||||||
#include "FuncRequest.h"
|
|
||||||
|
|
||||||
#include <QAction>
|
|
||||||
#include <QCloseEvent>
|
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
#include <QTabWidget>
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
class QCloseEvent;
|
||||||
class QDragEnterEvent;
|
class QDragEnterEvent;
|
||||||
class QDropEvent;
|
class QDropEvent;
|
||||||
class QMenu;
|
class QMenu;
|
||||||
class QToolBar;
|
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
|
|
||||||
|
class Timeout;
|
||||||
|
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
|
||||||
class GuiToolbar;
|
class GuiToolbar;
|
||||||
@ -88,10 +88,21 @@ public:
|
|||||||
/// menu item has been selected
|
/// menu item has been selected
|
||||||
void activated(FuncRequest const &);
|
void activated(FuncRequest const &);
|
||||||
|
|
||||||
QMenu* createPopupMenu();
|
///
|
||||||
|
QMenu * createPopupMenu();
|
||||||
|
|
||||||
|
///
|
||||||
void addTabWorkArea();
|
void addTabWorkArea();
|
||||||
|
|
||||||
|
/// dispatch to current BufferView
|
||||||
|
void dispatch(FuncRequest const & cmd);
|
||||||
|
|
||||||
|
/// \return the buffer currently shown in this window
|
||||||
|
Buffer * buffer();
|
||||||
|
Buffer const * buffer() const;
|
||||||
|
/// set a buffer to the current workarea.
|
||||||
|
void setBuffer(Buffer * b); ///< \c Buffer to set.
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void closing(int);
|
void closing(int);
|
||||||
|
|
||||||
@ -110,7 +121,7 @@ public Q_SLOTS:
|
|||||||
void normalSizedIcons();
|
void normalSizedIcons();
|
||||||
void bigSizedIcons();
|
void bigSizedIcons();
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
/// make sure we quit cleanly
|
/// make sure we quit cleanly
|
||||||
virtual void closeEvent(QCloseEvent * e);
|
virtual void closeEvent(QCloseEvent * e);
|
||||||
///
|
///
|
||||||
@ -131,7 +142,32 @@ protected:
|
|||||||
WorkArea const * currentWorkArea() const;
|
WorkArea const * currentWorkArea() const;
|
||||||
WorkArea * currentWorkArea();
|
WorkArea * currentWorkArea();
|
||||||
|
|
||||||
private:
|
///
|
||||||
|
void resetAutosaveTimer();
|
||||||
|
///
|
||||||
|
void showErrorList(std::string const & error_type);
|
||||||
|
///
|
||||||
|
void structureChanged() { updateToc(); }
|
||||||
|
///
|
||||||
|
void connectBuffer(Buffer & buf);
|
||||||
|
///
|
||||||
|
void disconnectBuffer();
|
||||||
|
///
|
||||||
|
void connectBufferView(BufferView & bv);
|
||||||
|
///
|
||||||
|
void disconnectBufferView();
|
||||||
|
////
|
||||||
|
void showDialog(std::string const & name);
|
||||||
|
void showDialogWithData(std::string const & name,
|
||||||
|
std::string const & data);
|
||||||
|
void showInsetDialog(std::string const & name,
|
||||||
|
std::string const & data, Inset * inset);
|
||||||
|
void updateDialog(std::string const & name,
|
||||||
|
std::string const & data);
|
||||||
|
|
||||||
|
///
|
||||||
|
void updateToc();
|
||||||
|
|
||||||
///
|
///
|
||||||
void dragEnterEvent(QDragEnterEvent * ev);
|
void dragEnterEvent(QDragEnterEvent * ev);
|
||||||
///
|
///
|
||||||
@ -142,6 +178,30 @@ private:
|
|||||||
bool focusNextPrevChild(bool);
|
bool focusNextPrevChild(bool);
|
||||||
///
|
///
|
||||||
QRect updateFloatingGeometry();
|
QRect updateFloatingGeometry();
|
||||||
|
/// called on timeout
|
||||||
|
void autoSave();
|
||||||
|
///
|
||||||
|
void updateEmbeddedFiles();
|
||||||
|
|
||||||
|
/// \return the current buffer view.
|
||||||
|
BufferView * view();
|
||||||
|
|
||||||
|
/// get access to the dialogs
|
||||||
|
Dialogs & getDialogs() { return *dialogs_; }
|
||||||
|
///
|
||||||
|
Dialogs const & getDialogs() const { return *dialogs_; }
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/// load a buffer into the current workarea.
|
||||||
|
Buffer * loadLyXFile(support::FileName const & name, ///< File to load.
|
||||||
|
bool tolastfiles = true); ///< append to the "Open recent" menu?
|
||||||
|
|
||||||
|
/** redraw \c inset in all the BufferViews in which it is currently
|
||||||
|
* visible. If successful return a pointer to the owning Buffer.
|
||||||
|
*/
|
||||||
|
Buffer const * updateInset(Inset const *);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
///
|
///
|
||||||
@ -167,6 +227,11 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
ToolbarSize toolbarSize_;
|
ToolbarSize toolbarSize_;
|
||||||
|
|
||||||
|
/// auto-saving of buffers
|
||||||
|
Timeout * const autosave_timeout_;
|
||||||
|
/// dialogs for this view
|
||||||
|
Dialogs * dialogs_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user