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:
André Pönitz 2007-11-12 23:23:19 +00:00
parent fec095e310
commit 309232d26b
5 changed files with 365 additions and 360 deletions

View File

@ -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

View File

@ -13,9 +13,8 @@
#ifndef LYXVIEW_H
#define LYXVIEW_H
#include "frontends/Application.h"
#include "frontends/Delegates.h"
#include "support/docstring.h"
#include "support/strfwd.h"
#include <vector>
@ -23,12 +22,10 @@ namespace lyx {
namespace support { class FileName; }
class Font;
class Buffer;
class BufferView;
class FuncRequest;
class Inset;
class Timeout;
class ToolbarInfo;
namespace frontend {
@ -54,7 +51,7 @@ class LyXView
{
public:
///
LyXView(int id);
LyXView(int id) : id_(id) {}
///
virtual ~LyXView();
///
@ -110,11 +107,13 @@ public:
//@{ generic accessor functions
/// \return the current buffer view.
BufferView * view();
virtual BufferView * view() = 0;
/// \return the buffer currently shown in this window
Buffer * buffer();
Buffer const * buffer() const;
virtual Buffer * buffer() = 0;
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;
@ -125,18 +124,15 @@ public:
virtual void openMenu(docstring const & name) = 0;
/// 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.
Buffer * loadLyXFile(support::FileName const & name, ///< File to load.
bool tolastfiles = true); ///< append to the "Open recent" menu?
/// set a buffer to the current workarea.
void setBuffer(Buffer * b); ///< \c Buffer to set.
virtual Buffer * loadLyXFile(support::FileName const & name, ///< File to load.
bool tolastfiles = true) = 0; ///< append to the "Open recent" menu?
/// updates the possible layouts selectable
virtual void updateLayoutChoice(bool force) = 0;
@ -157,72 +153,58 @@ public:
virtual void clearMessage() = 0;
/// reset autosave timer
void resetAutosaveTimer();
virtual void resetAutosaveTimer() = 0;
/// 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
* 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.
virtual bool hasFocus() const = 0;
/// show the error list to the user
void showErrorList(std::string const &);
virtual void showErrorList(std::string const &) = 0;
//
// GuiBufferDelegate
//
/// 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.
void errors(std::string const & err) { showErrorList(err); }
/// Reset autosave timers for all users.
void resetAutosaveTimers() { resetAutosaveTimer(); }
/// connect to signals in the given BufferView
void connectBufferView(BufferView & bv);
virtual void connectBufferView(BufferView & bv) = 0;
/// disconnect from signals in the given BufferView
void disconnectBufferView();
virtual void disconnectBufferView() = 0;
/// connect to signals in the given buffer
void connectBuffer(Buffer & buf);
virtual void connectBuffer(Buffer & buf) = 0;
/// disconnect from signals in the given buffer
void disconnectBuffer();
virtual void disconnectBuffer() = 0;
private:
/// noncopyable
LyXView(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
//@{
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);
virtual void showDialog(std::string const & name) = 0;
virtual void showDialogWithData(std::string const & name,
std::string const & data) = 0;
virtual void showInsetDialog(std::string const & name,
std::string const & data, Inset * inset) = 0;
virtual void updateDialog(std::string const & name,
std::string const & data) = 0;
//@}
protected:
///
void updateToc();
///
void updateEmbeddedFiles();
private:
int id_;
};

View File

@ -27,7 +27,6 @@ liblyxfrontends_la_SOURCES = \
FontMetrics.h \
KeyModifier.h \
KeySymbol.h \
LyXView.cpp \
LyXView.h \
Painter.cpp \
Painter.h \

View File

@ -21,6 +21,10 @@
#include "GuiMenubar.h"
#include "GuiToolbar.h"
#include "GuiToolbars.h"
#include "Dialogs.h"
#include "WorkArea.h"
#include "Gui.h"
#include "qt_helpers.h"
#include "frontends/Application.h"
@ -33,24 +37,33 @@
#include "support/lstrings.h"
#include "support/os.h"
#include "buffer_funcs.h"
#include "Buffer.h"
#include "BufferList.h"
#include "BufferParams.h"
#include "BufferView.h"
#include "BufferList.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 "LyX.h"
#include "LyXRC.h"
#include "MenuBackend.h"
#include "Paragraph.h"
#include "Session.h"
#include "TextClass.h"
#include "Text.h"
#include "ToolbarBackend.h"
#include "version.h"
#include "support/lstrings.h"
#include "support/filetools.h" // OnlyFilename()
#include "support/Timeout.h"
#include <QAction>
#include <QApplication>
#include <QCloseEvent>
@ -68,8 +81,16 @@
#include <QToolBar>
#include <QUrl>
#include <boost/bind.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::string;
using std::vector;
@ -80,6 +101,11 @@ extern bool quitting;
namespace frontend {
using support::bformat;
using support::FileName;
using support::makeDisplayPath;
using support::onlyFilename;
namespace {
int const statusbar_timer_value = 3000;
@ -126,22 +152,6 @@ private:
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()
: current_work_area_(0), posx_offset(0), posy_offset(0)
{}
@ -170,19 +180,22 @@ struct GuiView::GuiViewPrivate
QAction * smallIcons = new QAction(iconSizeGroup);
smallIcons->setText(qt_("Small-sized icons"));
smallIcons->setCheckable(true);
QObject::connect(smallIcons, SIGNAL(triggered()), parent, SLOT(smallSizedIcons()));
QObject::connect(smallIcons, SIGNAL(triggered()),
parent, SLOT(smallSizedIcons()));
menu->addAction(smallIcons);
QAction * normalIcons = new QAction(iconSizeGroup);
normalIcons->setText(qt_("Normal-sized icons"));
normalIcons->setCheckable(true);
QObject::connect(normalIcons, SIGNAL(triggered()), parent, SLOT(normalSizedIcons()));
QObject::connect(normalIcons, SIGNAL(triggered()),
parent, SLOT(normalSizedIcons()));
menu->addAction(normalIcons);
QAction * bigIcons = new QAction(iconSizeGroup);
bigIcons->setText(qt_("Big-sized icons"));
bigIcons->setCheckable(true);
QObject::connect(bigIcons, SIGNAL(triggered()), parent, SLOT(bigSizedIcons()));
QObject::connect(bigIcons, SIGNAL(triggered()),
parent, SLOT(bigSizedIcons()));
menu->addAction(bigIcons);
unsigned int cur = parent->iconSize().width();
@ -233,16 +246,48 @@ struct GuiView::GuiViewPrivate
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;
/// FIXME
LyXView::~LyXView() {}
GuiView::GuiView(int id)
: QMainWindow(), LyXView(id), quitting_by_menu_(false),
d(*new GuiViewPrivate)
: QMainWindow(), LyXView(id),
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
setAttribute(Qt::WA_QuitOnClose, false);
setAttribute(Qt::WA_DeleteOnClose, true);
@ -275,6 +320,8 @@ GuiView::GuiView(int id)
GuiView::~GuiView()
{
delete dialogs_;
delete autosave_timeout_;
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 lyx

View File

@ -16,20 +16,20 @@
#define GUI_VIEW_H
#include "frontends/LyXView.h"
#include "FuncRequest.h"
#include <QAction>
#include <QCloseEvent>
#include <QMainWindow>
#include <QTabWidget>
#include <QTimer>
class QCloseEvent;
class QDragEnterEvent;
class QDropEvent;
class QMenu;
class QToolBar;
namespace lyx {
class Timeout;
namespace frontend {
class GuiToolbar;
@ -88,10 +88,21 @@ public:
/// menu item has been selected
void activated(FuncRequest const &);
QMenu* createPopupMenu();
///
QMenu * createPopupMenu();
///
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:
void closing(int);
@ -110,7 +121,7 @@ public Q_SLOTS:
void normalSizedIcons();
void bigSizedIcons();
protected:
private:
/// make sure we quit cleanly
virtual void closeEvent(QCloseEvent * e);
///
@ -131,7 +142,32 @@ protected:
WorkArea const * currentWorkArea() const;
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);
///
@ -142,6 +178,30 @@ private:
bool focusNextPrevChild(bool);
///
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:
///
@ -167,6 +227,11 @@ private:
};
ToolbarSize toolbarSize_;
/// auto-saving of buffers
Timeout * const autosave_timeout_;
/// dialogs for this view
Dialogs * dialogs_;
};