#include "Dialog.h"
#include "FileDialog.h"
#include "GuiApplication.h"
+#include "GuiCompleter.h"
#include "GuiWorkArea.h"
#include "GuiKeySymbol.h"
#include "GuiToolbar.h"
#include "GuiToolbars.h"
#include "Menus.h"
+#include "TocModel.h"
#include "qt_helpers.h"
#include "BufferView.h"
#include "Converter.h"
#include "Cursor.h"
+#include "Encoding.h"
#include "ErrorList.h"
#include "Format.h"
#include "FuncStatus.h"
#include "FuncRequest.h"
-#include "support/gettext.h"
#include "Intl.h"
#include "Layout.h"
#include "Lexer.h"
#include "ToolbarBackend.h"
#include "version.h"
+#include "support/lassert.h"
#include "support/debug.h"
-#include "support/FileFilterList.h"
#include "support/FileName.h"
#include "support/filetools.h"
+#include "support/gettext.h"
#include "support/ForkedCalls.h"
#include "support/lstrings.h"
#include "support/os.h"
#include <QUrl>
#include <QScrollBar>
-#include <boost/assert.hpp>
#include <boost/bind.hpp>
#ifdef HAVE_SYS_TIME_H
{
LYXERR(Debug::GUI, "show banner: " << lyxrc.show_banner);
/// The text to be written on top of the pixmap
- QString const text = lyx_version ? lyx_version : qt_("unknown version");
+ QString const text = lyx_version ?
+ qt_("version ") + lyx_version : qt_("unknown version");
splash_ = QPixmap(":/images/banner.png");
QPainter pain(&splash_);
- pain.setPen(QColor(255, 255, 0));
+ pain.setPen(QColor(0, 0, 0));
QFont font;
// The font used to display the version info
font.setStyleHint(QFont::SansSerif);
font.setWeight(QFont::Bold);
font.setPointSize(int(toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble()));
pain.setFont(font);
- pain.drawText(260, 270, text);
+ pain.drawText(190, 225, text);
}
void paintEvent(QPaintEvent *)
Timeout autosave_timeout_;
/// flag against a race condition due to multiclicks, see bug #1119
bool in_show_;
+
+ ///
+ TocModels toc_models_;
};
theLyXFunc().setLyXView(this);
// Fill up the menu bar.
- guiApp->menus().fillMenuBar(menuBar(), this);
+ guiApp->menus().fillMenuBar(menuBar(), this, true);
setCentralWidget(d.stack_widget_);
// We don't want to keep the window in memory if it is closed.
setAttribute(Qt::WA_DeleteOnClose, true);
-#ifndef Q_WS_MACX
- // assign an icon to main form. We do not do it under Qt/Mac,
+#if (!defined(Q_WS_WIN) && !defined(Q_WS_MACX))
+ // assign an icon to main form. We do not do it under Qt/Win or Qt/Mac,
// since the icon is provided in the application bundle.
setWindowIcon(QPixmap(":/images/lyx.png"));
#endif
}
+TocModels & GuiView::tocModels()
+{
+ return d.toc_models_;
+}
+
+
void GuiView::setFocus()
{
if (d.current_work_area_)
continue;
}
- std::vector<int> const & ids = guiApp->viewIds();
- for (size_type i = 0; i != ids.size(); ++i) {
+ QVector<int> const ids = guiApp->viewIds();
+ for (int i = 0; i != ids.size(); ++i) {
if (id_ == ids[i])
continue;
if (guiApp->view(ids[i]).workArea(*b)) {
break;
}
}
- if (b && !closeBuffer(*b)) {
+ if (b && !closeBuffer(*b, true)) {
close_event->ignore();
return;
}
// Save toolbars configuration
if (isFullScreen()) {
d.toolbars_->toggleFullScreen(!isFullScreen());
- updateToolbars();
+ updateDialogs();
}
// Make sure the timer time out will not trigger a statusbar update.
this, SLOT(updateWindowTitle(GuiWorkArea *)));
updateWindowTitle(wa);
- updateToc();
- // Buffer-dependent dialogs should be updated or
- // hidden. This should go here because some dialogs (eg ToC)
- // require bv_->text.
- updateBufferDependent(true);
- updateToolbars();
- updateLayoutList();
- updateStatusBar();
+ structureChanged();
+
+ // The document settings needs to be reinitialised.
+ updateDialog("document", "");
+
+ // Buffer-dependent dialogs must be updated. This is done here because
+ // some dialogs require buffer()->text.
+ updateDialogs();
}
void GuiView::on_lastWorkAreaRemoved()
{
-#ifdef Q_WS_MAC
+#ifdef Q_WS_MACX
// On Mac close the view if there is no Tab open anymore,
// but only if no splitter is visible
if (!lyxrc.open_buffers_in_tabs && d.splitter_->count() == 1) {
QTimer::singleShot(0, this, SLOT(close()));
}
}
+#else
+ structureChanged();
+ // The document settings needs to be reinitialised.
+ updateDialog("document", "");
+ updateDialogs();
#endif
}
connectBuffer(bv.buffer());
// The document structure, name and dialogs might have
// changed in another view.
- updateBufferDependent(true);
- updateToolbars();
- updateLayoutList();
- updateStatusBar();
+ structureChanged();
+ // The document settings needs to be reinitialised.
+ updateDialog("document", "");
+ updateDialogs();
} else {
setWindowTitle(qt_("LyX"));
setWindowIconText(qt_("LyX"));
}
case QEvent::ShortcutOverride: {
+
+ if (isFullScreen() && menuBar()->isHidden()) {
+ QKeyEvent * ke = static_cast<QKeyEvent*>(e);
+ // FIXME: we should also try to detect special LyX shortcut such as
+ // Alt-P and Alt-M. Right now there is a hack in
+ // GuiWorkArea::processKeySym() that hides again the menubar for
+ // those cases.
+ if (ke->modifiers() & Qt::AltModifier && ke->key() != Qt::Key_Alt)
+ menuBar()->show();
+ return QMainWindow::event(e);
+ }
+
if (d.current_work_area_)
// Nothing special to do.
return QMainWindow::event(e);
QKeyEvent * ke = static_cast<QKeyEvent*>(e);
-
// Let Qt handle menu access and the Tab keys to navigate keys to navigate
// between controls.
if (ke->modifiers() & Qt::AltModifier || ke->key() == Qt::Key_Tab
void GuiView::setCurrentWorkArea(GuiWorkArea * wa)
{
- BOOST_ASSERT(wa);
-
- // Changing work area can result from opening a file so
- // update the toc in any case.
- updateToc();
-
+ LASSERT(wa, /**/);
d.current_work_area_ = wa;
for (int i = 0; i != d.splitter_->count(); ++i) {
if (d.tabWorkArea(i)->setCurrentWorkArea(wa))
void GuiView::removeWorkArea(GuiWorkArea * wa)
{
- BOOST_ASSERT(wa);
+ LASSERT(wa, /**/);
if (wa == d.current_work_area_) {
disconnectBuffer();
disconnectBufferView();
- hideBufferDependent();
d.current_work_area_ = 0;
}
d.toolbars_->update(math, table, review, mathmacrotemplate);
} else
d.toolbars_->update(false, false, false, false);
-
- // update read-only status of open dialogs.
- checkStatus();
}
void GuiView::setBuffer(Buffer * newBuffer)
{
- BOOST_ASSERT(newBuffer);
+ LASSERT(newBuffer, /**/);
setBusy(true);
GuiWorkArea * wa = workArea(*newBuffer);
}
+void GuiView::structureChanged()
+{
+ d.toc_models_.reset(view());
+ // Navigator needs more than a simple update in this case. It needs to be
+ // rebuilt.
+ updateDialog("toc", "");
+}
+
+
void GuiView::updateDialog(string const & name, string const & data)
{
if (!isDialogVisible(name))
Dialog * const dialog = it->second.get();
if (dialog->isVisibleView())
- dialog->updateData(data);
+ dialog->initialiseParams(data);
}
}
-void GuiView::updateToc()
-{
- updateDialog("toc", "");
-}
-
-
-void GuiView::updateEmbeddedFiles()
-{
- updateDialog("embedding", "");
-}
-
-
void GuiView::autoSave()
{
LYXERR(Debug::INFO, "Running autoSave()");
}
-FuncStatus GuiView::getStatus(FuncRequest const & cmd)
+bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
{
- FuncStatus flag;
bool enable = true;
Buffer * buf = buffer();
flag.setOnOff(d.toolbars_->visible(cmd.getArg(0)));
break;
+ case LFUN_UI_TOGGLE:
+ flag.setOnOff(isFullScreen());
+ break;
+
case LFUN_DIALOG_TOGGLE:
flag.setOnOff(isDialogVisible(cmd.getArg(0)));
// fall through to set "enable"
}
case LFUN_INSET_APPLY: {
- if (!buf) {
- enable = false;
- break;
- }
string const name = cmd.getArg(0);
Inset * inset = getOpenInset(name);
if (inset) {
FuncStatus fs;
if (!inset->getStatus(view()->cursor(), fr, fs)) {
// Every inset is supposed to handle this
- BOOST_ASSERT(false);
+ LASSERT(false, /**/);
}
flag |= fs;
} else {
FuncRequest fr(LFUN_INSET_INSERT, cmd.argument());
- flag |= getStatus(fr);
+ flag |= lyx::getStatus(fr);
}
enable = flag.enabled();
break;
break;
default:
- if (!view()) {
- enable = false;
- break;
- }
+ return false;
}
if (!enable)
flag.enabled(false);
- return flag;
+ return true;
}
dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
dlg.setButton1(qt_("Templates|#T#t"), toqstr(lyxrc.template_path));
- FileDialog::Result result =
- dlg.open(toqstr(lyxrc.template_path),
- FileFilterList(_("LyX Documents (*.lyx)")));
+ FileDialog::Result result = dlg.open(toqstr(lyxrc.template_path),
+ QStringList(qt_("LyX Documents (*.lyx)")));
if (result.first == FileDialog::Later)
return FileName();
toqstr(addPath(package().system_support().absFilename(), "examples")));
FileDialog::Result result =
- dlg.open(toqstr(initpath), FileFilterList(_("LyX Documents (*.lyx)")));
+ dlg.open(toqstr(initpath), QStringList(qt_("LyX Documents (*.lyx)")));
if (result.first == FileDialog::Later)
return;
filter += ')';
FileDialog::Result result =
- dlg.open(toqstr(initpath), FileFilterList(filter));
+ dlg.open(toqstr(initpath), fileFilters(toqstr(filter)));
if (result.first == FileDialog::Later)
return;
return;
// get absolute path of file
- FileName const fullname(makeAbsPath(filename));
+ FileName const fullname(support::makeAbsPath(filename));
FileName const lyxfile(support::changeExtension(fullname.absFilename(), ".lyx"));
toqstr(addPath(package().system_support().absFilename(),
"examples")));
- FileDialog::Result result =
- dlg.open(toqstr(initpath),
- FileFilterList(_("LyX Documents (*.lyx)")));
+ FileDialog::Result result = dlg.open(toqstr(initpath),
+ QStringList(qt_("LyX Documents (*.lyx)")));
if (result.first == FileDialog::Later)
return;
LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT));
FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
- FileFilterList());
+ QStringList());
if (result.first == FileDialog::Later)
return;
if (!newname.empty()) {
// FIXME UNICODE
- fname = makeAbsPath(to_utf8(newname), oldname.onlyPath().absFilename());
+ fname = support::makeAbsPath(to_utf8(newname), oldname.onlyPath().absFilename());
} else {
// Switch to this Buffer.
setBuffer(&b);
if (!isLyXFilename(fname.absFilename()))
fname.changeExtension(".lyx");
- FileFilterList const filter(_("LyX Documents (*.lyx)"));
-
FileDialog::Result result =
dlg.save(toqstr(fname.onlyPath().absFilename()),
- filter,
+ QStringList(qt_("LyX Documents (*.lyx)")),
toqstr(fname.onlyFileName()));
if (result.first == FileDialog::Later)
}
-bool GuiView::closeBuffer(Buffer & buf)
+bool GuiView::closeBuffer(Buffer & buf, bool tolastopened)
{
// goto bookmark to update bookmark pit.
//FIXME: we should update only the bookmarks related to this buffer!
theLyXFunc().gotoBookmark(i+1, false, false);
if (buf.isClean() || buf.paragraphs().empty()) {
- if (buf.masterBuffer() == &buf)
+ if (buf.masterBuffer() == &buf && tolastopened)
LyX::ref().session().lastOpened().add(buf.fileName());
theBufferList().release(&buf);
return true;
// save file names to .lyx/session
// if master/slave are both open, do not save slave since it
// will be automatically loaded when the master is loaded
- if (buf.masterBuffer() == &buf)
+ if (buf.masterBuffer() == &buf && tolastopened)
LyX::ref().session().lastOpened().add(buf.fileName());
theBufferList().release(&buf);
bool GuiView::dispatch(FuncRequest const & cmd)
{
- BufferView * bv = view();
+ BufferView * bv = view();
// By default we won't need any update.
if (bv)
bv->cursor().updateFlags(Update::None);
+ bool dispatched = true;
switch(cmd.action) {
case LFUN_BUFFER_IMPORT:
// We cannot use a for loop as the buffer list cycles.
Buffer * b = first;
do {
- if (b->isClean())
- continue;
- saveBuffer(*b);
- LYXERR(Debug::ACTION, "Saved " << b->absFileName());
+ if (!b->isClean()) {
+ saveBuffer(*b);
+ LYXERR(Debug::ACTION, "Saved " << b->absFileName());
+ }
b = theBufferList().next(b);
} while (b != first);
message(_("All documents saved."));
}
case LFUN_INSET_APPLY: {
+ view()->cursor().recordUndoFullDocument();
string const name = cmd.getArg(0);
Inset * inset = getOpenInset(name);
if (inset) {
break;
default:
- return false;
+ dispatched = false;
+ break;
}
- return true;
+ if (isFullScreen()) {
+ if (menuBar()->isVisible())
+ menuBar()->hide();
+ if (statusBar()->isVisible())
+ statusBar()->hide();
+ }
+
+ return dispatched;
}
}
#endif
if (arg != "fullscreen") {
- message(bformat(_("LFUN_UI_TOGGLE %1$s unknown command!"), from_utf8(arg)));
+ message(bformat("LFUN_UI_TOGGLE " + _("%1$s unknown command!"), from_utf8(arg)));
return;
}
#if QT_VERSION >= 0x040300
setContentsMargins(0, 0, 0, 0);
#endif
- showNormal();
+ setWindowState(windowState() ^ Qt::WindowFullScreen);
menuBar()->show();
statusBar()->show();
} else {
#if QT_VERSION >= 0x040300
setContentsMargins(-2, -2, -2, -2);
#endif
- showFullScreen();
+ setWindowState(windowState() ^ Qt::WindowFullScreen);
statusBar()->hide();
menuBar()->hide();
}
d.current_work_area_->startBlinkingCursor();
// Take this occasion to update the other GUI elements.
- updateLayoutList();
- updateToolbars();
- updateStatusBar();
+ updateDialogs();
}
char const * const dialognames[] = {
"aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
-"citation", "document", "embedding", "errorlist", "ert", "external", "file",
+"citation", "document", "errorlist", "ert", "external", "file",
"findreplace", "float", "graphics", "include", "index", "nomenclature", "label", "log",
"mathdelimiter", "mathmatrix", "note", "paragraph", "prefs", "print",
-"ref", "sendto", "spellchecker", "symbols", "tabular", "tabularcreate",
+"ref", "sendto", "space", "spellchecker", "symbols", "tabular", "tabularcreate",
#ifdef HAVE_LIBAIKSAURUS
"thesaurus",
}
-void GuiView::hideBufferDependent() const
+void GuiView::updateDialogs()
{
map<string, DialogPtr>::const_iterator it = d.dialogs_.begin();
map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
for(; it != end; ++it) {
Dialog * dialog = it->second.get();
- if (dialog->isBufferDependent())
- dialog->hideView();
- }
-}
-
-
-void GuiView::updateBufferDependent(bool switched) const
-{
- map<string, DialogPtr>::const_iterator it = d.dialogs_.begin();
- map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
-
- for(; it != end; ++it) {
- Dialog * dialog = it->second.get();
- if (!dialog->isVisibleView())
- continue;
- if (switched && dialog->isBufferDependent()) {
- if (dialog->initialiseParams(""))
- dialog->updateView();
- else
- dialog->hideView();
- } else {
- // A bit clunky, but the dialog will request
- // that the kernel provides it with the necessary
- // data.
- dialog->updateDialog();
- }
- }
-}
-
-
-void GuiView::checkStatus()
-{
- map<string, DialogPtr>::const_iterator it = d.dialogs_.begin();
- map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
-
- for(; it != end; ++it) {
- Dialog * const dialog = it->second.get();
if (dialog && dialog->isVisibleView())
dialog->checkStatus();
}
+ updateToolbars();
+ updateLayoutList();
+ updateStatusBar();
}
-
// will be replaced by a proper factory...
Dialog * createGuiAbout(GuiView & lv);
Dialog * createGuiBibitem(GuiView & lv);
Dialog * createGuiExternal(GuiView & lv);
Dialog * createGuiFloat(GuiView & lv);
Dialog * createGuiGraphics(GuiView & lv);
+Dialog * createGuiHSpace(GuiView & lv);
Dialog * createGuiInclude(GuiView & lv);
Dialog * createGuiLabel(GuiView & lv);
Dialog * createGuiListings(GuiView & lv);
Dialog * GuiView::build(string const & name)
{
- BOOST_ASSERT(isValidName(name));
+ LASSERT(isValidName(name), /**/);
if (name == "aboutlyx")
return createGuiAbout(*this);
return createGuiRef(*this);
if (name == "sendto")
return createGuiSendTo(*this);
+ if (name == "space")
+ return createGuiHSpace(*this);
if (name == "spellchecker")
return createGuiSpellchecker(*this);
if (name == "symbols")