From: Angus Leeming Date: Sat, 25 Oct 2003 20:09:52 +0000 (+0000) Subject: Get rid of hte dynamic_casts in InsetExternal. X-Git-Tag: 1.6.10~15890 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=afc9aaf6eb68127aecbbade60bcf101d502285df;p=features.git Get rid of hte dynamic_casts in InsetExternal. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7980 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index aa9a5180d9..ab96a0e18c 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,6 +1,17 @@ +2003-10-25 Angus Leeming + + * render_base.h (asButton, asGraphic, asPreview, asMonitoredPreview): + new virtual member functions, specialised... + * render_button.h (asButton): + * render_graphic.h (asGraphic): + * render_preview.h (asPreview, asMonitoredPreview): ... here. + + * insetexternal.C: use these new functions rather than dynamic_cast. + Various other small simplifications. + 2003-10-22 Angus Leeming -w * insetexternal.[Ch]: add the ability to 'preview' the external file + * insetexternal.[Ch]: add the ability to 'preview' the external file if so desired. * insetinclude.C: changes due to the changes in the RenderPreview diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index e58c7b4954..c07713af02 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -99,6 +99,7 @@ TempName::operator=(TempName const & other) return *this; } + namespace { /// The translator between the Display enum and corresponding lyx string. @@ -118,6 +119,7 @@ Translator const initTranslator() } // namespace anon + Translator const & displayTranslator() { static Translator const translator = @@ -383,55 +385,6 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) } -namespace { - -enum RenderType { - RENDERBUTTON, - RENDERGRAPHIC, - RENDERPREVIEW -}; - -RenderType getRenderType(InsetExternalParams const & p) -{ - if (!external::getTemplatePtr(p) || p.filename.empty() || - p.display == external::NoDisplay) - return RENDERBUTTON; - - if (p.display == external::PreviewDisplay) { - if (RenderPreview::activated()) - return RENDERPREVIEW; - return RENDERBUTTON; - } - - if (p.display == external::DefaultDisplay && - lyxrc.display_graphics == graphics::NoDisplay) - return RENDERBUTTON; - return RENDERGRAPHIC; -} - - -RenderGraphic & -graphicRenderer(boost::scoped_ptr const & renderer) -{ - RenderGraphic * const ptr = - dynamic_cast(renderer.get()); - BOOST_ASSERT(ptr); - return *ptr; -} - - -RenderMonitoredPreview & -previewRenderer(boost::scoped_ptr const & renderer) -{ - RenderMonitoredPreview * const ptr = - dynamic_cast(renderer.get()); - BOOST_ASSERT(ptr); - return *ptr; -} - -} // namespace anon - - InsetExternal::InsetExternal() : renderer_(new RenderButton) {} @@ -443,41 +396,14 @@ InsetExternal::InsetExternal(InsetExternal const & other) params_(other.params_), renderer_(other.renderer_->clone()) { - switch (getRenderType(params_)) { - case RENDERBUTTON: - break; - - case RENDERGRAPHIC: { - RenderGraphic * const ptr = - dynamic_cast(renderer_.get()); - if (!ptr) { - lyxerr << "InsetExternal::InsetExternal " - << "Not a RenderGraphic!!" - << std::endl; - return; - } + if (renderer_->asMonitoredPreview() != 0) { + RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); -// RenderGraphic & renderer = graphicRenderer(renderer_); -// renderer.connect(boost::bind(&InsetExternal::statusChanged, this)); - break; - } + ptr->fileChanged(boost::bind(&InsetExternal::fileChanged, this)); - case RENDERPREVIEW: { - RenderMonitoredPreview * const ptr = - dynamic_cast(renderer_.get()); - if (!ptr) { - lyxerr << "InsetExternal::InsetExternal " - << "Not a RenderPreview!!" - << std::endl; - return; - } + } else if (renderer_->asGraphic() != 0 ) { + RenderGraphic * const ptr = renderer_->asGraphic(); ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); - ptr->fileChanged(boost::bind(&InsetExternal::fileChanged, this)); -// RenderMonitoredPreview & renderer = previewRenderer(renderer_); -// renderer.connect(boost::bind(&InsetExternal::statusChanged, this)); -// renderer.fileChanged(boost::bind(&InsetExternal::fileChanged, this)); - break; - } } } @@ -556,6 +482,33 @@ void InsetExternal::draw(PainterInfo & pi, int x, int y) const namespace { +enum RenderType { + RENDERBUTTON, + RENDERGRAPHIC, + RENDERPREVIEW +}; + + +RenderType getRenderType(InsetExternalParams const & p) +{ + if (!external::getTemplatePtr(p) || + p.filename.empty() || + p.display == external::NoDisplay) + return RENDERBUTTON; + + if (p.display == external::PreviewDisplay) { + if (RenderPreview::activated()) + return RENDERPREVIEW; + return RENDERBUTTON; + } + + if (p.display == external::DefaultDisplay && + lyxrc.display_graphics == graphics::NoDisplay) + return RENDERBUTTON; + return RENDERGRAPHIC; +} + + graphics::Params get_grfx_params(InsetExternalParams const & eparams) { graphics::Params gparams; @@ -620,14 +573,11 @@ InsetExternalParams const & InsetExternal::params() const void InsetExternal::setParams(InsetExternalParams const & p, Buffer const & buffer) { - // The stored params; what we would like to happen in an ideal world. params_ = p; - // We display the inset as a button by default. switch (getRenderType(params_)) { case RENDERBUTTON: { - RenderButton * button_ptr = - dynamic_cast(renderer_.get()); + RenderButton * button_ptr = renderer_->asButton(); if (!button_ptr) { button_ptr = new RenderButton; renderer_.reset(button_ptr); @@ -637,8 +587,7 @@ void InsetExternal::setParams(InsetExternalParams const & p, break; } case RENDERGRAPHIC: { - RenderGraphic * graphic_ptr = - dynamic_cast(renderer_.get()); + RenderGraphic * graphic_ptr = renderer_->asGraphic(); if (!graphic_ptr) { graphic_ptr = new RenderGraphic; graphic_ptr->connect( @@ -649,9 +598,10 @@ void InsetExternal::setParams(InsetExternalParams const & p, graphic_ptr->update(get_grfx_params(params_)); break; + } case RENDERPREVIEW: { RenderMonitoredPreview * preview_ptr = - dynamic_cast(renderer_.get()); + renderer_->asMonitoredPreview(); if (!preview_ptr) { preview_ptr = new RenderMonitoredPreview; preview_ptr->connect( @@ -677,12 +627,13 @@ void InsetExternal::fileChanged() const if (!buffer_ptr) return; - RenderMonitoredPreview & renderer = previewRenderer(renderer_); + RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); + BOOST_ASSERT(ptr); Buffer const & buffer = *buffer_ptr; - renderer.removePreview(buffer); - add_preview(renderer, *this, buffer); - renderer.startLoading(buffer); + ptr->removePreview(buffer); + add_preview(*ptr, *this, buffer); + ptr->startLoading(buffer); } @@ -819,15 +770,14 @@ void add_preview(RenderMonitoredPreview & renderer, InsetExternal const & inset, void InsetExternal::addPreview(graphics::PreviewLoader & ploader) const { - if (getRenderType(params_) != RENDERPREVIEW) + RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); + if (!ptr) return; - RenderMonitoredPreview & renderer = previewRenderer(renderer_); - if (preview_wanted(params())) { - renderer.setAbsFile(params_.filename.absFilename()); + ptr->setAbsFile(params_.filename.absFilename()); string const snippet = latex_string(*this, ploader.buffer()); - renderer.addPreview(snippet, ploader); + ptr->addPreview(snippet, ploader); } } diff --git a/src/insets/render_base.h b/src/insets/render_base.h index 20285f5fd8..0ca610723a 100644 --- a/src/insets/render_base.h +++ b/src/insets/render_base.h @@ -17,6 +17,10 @@ class MetricsInfo; class PainterInfo; +class RenderButton; +class RenderGraphic; +class RenderPreview; +class RenderMonitoredPreview; class RenderBase { public: @@ -29,6 +33,12 @@ public: /// draw inset and update (xo, yo)-cache virtual void draw(PainterInfo & pi, int x, int y) const = 0; + /// equivalent to dynamic_cast + virtual RenderButton * asButton() { return 0; } + virtual RenderGraphic * asGraphic() { return 0; } + virtual RenderPreview * asPreview() { return 0; } + virtual RenderMonitoredPreview * asMonitoredPreview() { return 0; } + protected: RenderBase() {} RenderBase(RenderBase const &) {} diff --git a/src/insets/render_button.h b/src/insets/render_button.h index 6681e762cb..01a7244c4f 100644 --- a/src/insets/render_button.h +++ b/src/insets/render_button.h @@ -37,6 +37,9 @@ public: /// void setBox(Box b) { button_box_ = b; } + /// equivalent to dynamic_cast + virtual RenderButton * asButton() { return this; } + private: /// The stored data. std::string text_; diff --git a/src/insets/render_graphic.h b/src/insets/render_graphic.h index 447e104eb2..3d67e5f54f 100644 --- a/src/insets/render_graphic.h +++ b/src/insets/render_graphic.h @@ -44,6 +44,9 @@ public: typedef boost::signal0::slot_type slot_type; boost::signals::connection connect(slot_type const &) const; + /// equivalent to dynamic_cast + virtual RenderGraphic * asGraphic() { return this; } + private: /// Not implemented. RenderGraphic & operator=(RenderGraphic const &); diff --git a/src/insets/render_preview.h b/src/insets/render_preview.h index 516eb99b1c..88f87acdaf 100644 --- a/src/insets/render_preview.h +++ b/src/insets/render_preview.h @@ -79,6 +79,9 @@ public: typedef boost::signal0::slot_type slot_type; boost::signals::connection connect(slot_type const &); + /// equivalent to dynamic_cast + virtual RenderPreview * asPreview() { return this; } + private: /// Not implemented. void operator=(RenderPreview const &); @@ -117,6 +120,9 @@ public: /// Connect and you'll be informed when the file changes. boost::signals::connection fileChanged(slot_type const &); + /// equivalent to dynamic_cast + virtual RenderMonitoredPreview * asMonitoredPreview() { return this; } + private: /// mutable lyx::support::FileMonitor monitor_;