X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2FDialogs.C;h=5ea2ef5ad3347dea7fa529b244aa8345e074ac29;hb=e7fc677261bd14fdf159e594fcf422e985c72664;hp=43b1d155a7bc790edc3f3457b6f6b529420916ed;hpb=0cfafddc7d9fd51fafd4b8c6d721732caf4e6744;p=lyx.git diff --git a/src/frontends/Dialogs.C b/src/frontends/Dialogs.C index 43b1d155a7..5ea2ef5ad3 100644 --- a/src/frontends/Dialogs.C +++ b/src/frontends/Dialogs.C @@ -1,42 +1,247 @@ /** - * \file Dialogs.C - * Copyright 1995-2002 The LyX Team. - * See the file COPYING. - * \author Angus Leeming + * \file frontends/Dialogs.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Angus Leeming + * + * Full author contact details are available in file CREDITS. * * Common to all frontends' Dialogs */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "Dialogs.h" +#include "controllers/Dialog.h" + +#include +#include + + +using std::string; +using lyx::frontend::Dialog; + + // Note that static boost signals break some compilers, so this wrapper // initialises the signal dynamically when it is first invoked. template class BugfixSignal { public: - Signal & operator()() { return thesignal(); } - Signal const & operator()() const { return thesignal(); } + Signal & operator()() { return thesignal(); } + Signal const & operator()() const { return thesignal(); } private: - Signal & thesignal() const - { - if (!signal_.get()) - signal_.reset(new Signal); - return *signal_; - } - - mutable boost::scoped_ptr signal_; + Signal & thesignal() const + { + if (!signal_.get()) + signal_.reset(new Signal); + return *signal_; + } + + mutable boost::scoped_ptr signal_; }; -boost::signal0 & Dialogs::redrawGUI() +boost::signal & Dialogs::redrawGUI() +{ + static BugfixSignal > thesignal; + return thesignal(); +} + + +namespace { + +BugfixSignal > hideSignal; + +} + + +void Dialogs::hide(string const & name, InsetBase* inset) +{ + hideSignal()(name, inset); +} + + +Dialogs::Dialogs(LyXView & lyxview) + : lyxview_(lyxview), in_show_(false) { - static BugfixSignal > thesignal; - return thesignal(); + // Connect signals + redrawGUI().connect(boost::bind(&Dialogs::redraw, this)); + hideSignal().connect(boost::bind(&Dialogs::hideSlot, this, _1, _2)); +} + + +Dialog * Dialogs::find_or_build(string const & name) +{ + if (!isValidName(name)) + return 0; + + std::map::iterator it = + dialogs_.find(name); + + if (it != dialogs_.end()) + return it->second.get(); + + dialogs_[name] = build(name); + return dialogs_[name].get(); +} + + +void Dialogs::show(string const & name, string const & data) +{ + if (in_show_) { + return; + } + in_show_ = true; + Dialog * dialog = find_or_build(name); + if (dialog) { + // FIXME! Should check that the dialog is NOT an inset dialog. + dialog->show(data); + } + in_show_ = false; +} + + +void Dialogs::show(string const & name, string const & data, InsetBase * inset) +{ + if (in_show_) { + return; + } + in_show_ = true; + Dialog * dialog = find_or_build(name); + if (dialog) { + // FIXME! Should check that the dialog IS an inset dialog. + dialog->show(data); + open_insets_[name] = inset; + } + in_show_ = false; +} + + +bool Dialogs::visible(string const & name) const +{ + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) + return false; + return it->second.get()->isVisible(); +} + + +void Dialogs::update(string const & name, string const & data) +{ + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) + return; + + Dialog * const dialog = it->second.get(); + if (dialog->isVisible()) + dialog->update(data); +} + + +void Dialogs::hideSlot(string const & name, InsetBase * inset) +{ + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) + return; + + if (inset && inset != getOpenInset(name)) + return; + + Dialog * const dialog = it->second.get(); + if (dialog->isVisible()) + dialog->hide(); + open_insets_[name] = 0; +} + + +void Dialogs::disconnect(string const & name) +{ + if (!isValidName(name)) + return; + + open_insets_[name] = 0; +} + + +InsetBase * Dialogs::getOpenInset(string const & name) const +{ + if (!isValidName(name)) + return 0; + + std::map::const_iterator it = + open_insets_.find(name); + return it == open_insets_.end() ? 0 : it->second; +} + + +void Dialogs::hideAll() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + it->second->hide(); + } +} + + +void Dialogs::hideBufferDependent() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * dialog = it->second.get(); + if (dialog->controller().isBufferDependent()) + dialog->hide(); + } +} + + +void Dialogs::updateBufferDependent(bool switched) const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * dialog = it->second.get(); + if (switched && dialog->controller().isBufferDependent()) { + dialog->hide(); + } else { + // A bit clunky, but the dialog will request + // that the kernel provides it with the necessary + // data. + dialog->RestoreButton(); + } + } +} + + +void Dialogs::redraw() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + it->second->redraw(); + } +} + + +void Dialogs::checkStatus() +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * const dialog = it->second.get(); + if (dialog->isVisible()) + dialog->checkStatus(); + } }