diff --git a/ChangeLog b/ChangeLog index ea4825fbdf..432daf8498 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2000-03-08 Juergen Vigna + + * src/insets/lyxinset.h: added owner call which tells us if + this inset is inside another inset. Changed also the return-type + of Editable to an enum so it tells clearer what the return-value is. + + * src/insets/insettext.C (computeTextRows): fixed computing of + textinsets which split automatically on more rows. + + * src/insets/insetert.[Ch]: changed this to be of BaseType + InsetCollapsable. + + * src/insets/insetfoot.[Ch]: added footnote inset + + * src/insets/insetcollapsable.[Ch]: added this BaseClass for + collapsable insets (like footnote, ert, ...) + 2000-03-08 Lars Gullik Bjønnes * src/lyxdraw.h: remvoe file diff --git a/po/POTFILES.in b/po/POTFILES.in index ea2a66716e..73d80d592c 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -30,6 +30,8 @@ src/insets/insetbib.C src/insets/inseterror.C src/insets/inseterror.h src/insets/insetert.C +src/insets/insetert.h +src/insets/insetfoot.C src/insets/insetinclude.C src/insets/insetindex.C src/insets/insetinfo.C diff --git a/src/BufferView.C b/src/BufferView.C index c7a675e218..1fd4c3cd4a 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -731,7 +731,7 @@ void BufferView::workAreaButtonPress(int xpos, int ypos, unsigned int button) updateScrollbar(); // Single left click in math inset? - if (inset_hit != 0 && inset_hit->Editable() == 2) { + if (inset_hit != 0 && inset_hit->Editable()==Inset::HIGHLY_EDITABLE) { // Highly editable inset, like math selection_possible = false; owner_->updateLayoutChoice(); diff --git a/src/LyXAction.C b/src/LyXAction.C index 275c59f07b..a1077e2ab5 100644 --- a/src/LyXAction.C +++ b/src/LyXAction.C @@ -207,6 +207,8 @@ void LyXAction::init() N_("Toggle font underline"), Noop }, { LFUN_FOOTMELT, "footnote-insert", N_("Insert Footnote"), Noop }, + { LFUN_INSET_FOOTNOTE, "footnote-inset-insert", + N_("Insert Footnote"), Noop }, { LFUN_RIGHTSEL, "forward-select", N_("Select next char"), ReadOnly }, { LFUN_HFILL, "hfill-insert", diff --git a/src/buffer.C b/src/buffer.C index 2cc1ffe5ad..25ebd02585 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -76,6 +76,7 @@ using std::setw; #include "insets/insettext.h" #include "insets/insetert.h" #include "insets/insetgraphics.h" +#include "insets/insetfoot.h" #include "support/filetools.h" #include "support/path.h" #include "LaTeX.h" @@ -789,6 +790,13 @@ bool Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par, par->InsertInset(pos, inset); par->SetFont(pos, font); ++pos; + } else if (tmptok == "Foot") { + inset = new InsetFoot(this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; } else if (tmptok == "GRAPHICS") { inset = new InsetGraphics; //inset->Read(lex); diff --git a/src/commandtags.h b/src/commandtags.h index 25bce4ff73..1ab764389b 100644 --- a/src/commandtags.h +++ b/src/commandtags.h @@ -243,6 +243,7 @@ enum kb_action { LFUN_INSET_TEXT, // Jug 20000214 LFUN_INSET_ERT, // Jug 20000218 LFUN_INSERT_GRAPHICS, // Lgb 20000226 + LFUN_INSET_FOOTNOTE, // Jug 20000307 LFUN_LASTACTION /* this marks the end of the table */ }; diff --git a/src/insets/Makefile.am b/src/insets/Makefile.am index 17fed21dac..1431772c7b 100644 --- a/src/insets/Makefile.am +++ b/src/insets/Makefile.am @@ -14,12 +14,16 @@ libinsets_la_SOURCES = \ inset.C \ insetbib.C \ insetbib.h \ + insetcollapsable.C \ + insetcollapsable.h \ insetcommand.C \ insetcommand.h \ inseterror.C \ inseterror.h \ insetert.C \ insetert.h \ + insetfoot.C \ + insetfoot.h \ insetgraphics.C \ insetgraphics.h \ insetinclude.C \ diff --git a/src/insets/figinset.C b/src/insets/figinset.C index 490a8b0fc1..58697d0dfc 100644 --- a/src/insets/figinset.C +++ b/src/insets/figinset.C @@ -1256,9 +1256,9 @@ void InsetFig::Validate(LaTeXFeatures & features) const } -unsigned char InsetFig::Editable() const +Inset::EDITABLE InsetFig::Editable() const { - return 1; + return IS_EDITABLE; } diff --git a/src/insets/figinset.h b/src/insets/figinset.h index 3b0a2b3ab6..d06e404e64 100644 --- a/src/insets/figinset.h +++ b/src/insets/figinset.h @@ -60,7 +60,7 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const; + EDITABLE Editable() const; /// bool Deletable() const; /// diff --git a/src/insets/inset.C b/src/insets/inset.C index a8dce4e1b8..3a1fcb939d 100644 --- a/src/insets/inset.C +++ b/src/insets/inset.C @@ -18,6 +18,7 @@ #include "debug.h" #include "BufferView.h" #include "support/lstrings.h" +#include "Painter.h" /* Insets default methods */ @@ -33,9 +34,9 @@ bool Inset::DirectWrite() const } -unsigned char Inset::Editable() const +Inset::EDITABLE Inset::Editable() const { - return 0; + return NOT_EDITABLE; } @@ -97,9 +98,9 @@ void UpdatableInset::InsetUnlock(BufferView *) // An updatable inset is highly editable by definition -unsigned char UpdatableInset::Editable() const +Inset::EDITABLE UpdatableInset::Editable() const { - return 2; // and what does "2" siginify? (Lgb) + return HIGHLY_EDITABLE; } @@ -154,3 +155,11 @@ UpdatableInset::LocalDispatch(BufferView *, int, string const &) #endif return UNDISPATCHED; } + +int UpdatableInset::getMaxWidth(Painter & pain) const +{ + if (owner_) + return owner_->getMaxWidth(pain); + return pain.paperWidth(); +} + diff --git a/src/insets/insetbib.h b/src/insets/insetbib.h index 32063d1b86..da680c2889 100644 --- a/src/insets/insetbib.h +++ b/src/insets/insetbib.h @@ -39,8 +39,8 @@ public: /// void Edit(BufferView *, int x, int y, unsigned int button); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// struct Holder { @@ -78,8 +78,8 @@ public: /// void Edit(BufferView *, int x, int y, unsigned int button); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// A user can't neither insert nor delete this inset bool Deletable() const { @@ -135,8 +135,8 @@ public: /// string getKeys(char delim); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// bool addDatabase(string const &); diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C new file mode 100644 index 0000000000..1a218c4ba2 --- /dev/null +++ b/src/insets/insetcollapsable.C @@ -0,0 +1,196 @@ +/* This file is part of + * ====================================================== + * + * LyX, The Document Processor + * + * Copyright (C) 1998 The LyX Team. + * + *======================================================*/ + +#include + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "insetcollapsable.h" +#include "gettext.h" +#include "lyxfont.h" +#include "BufferView.h" +#include "Painter.h" + + +InsetCollapsable::InsetCollapsable(Buffer * bf): InsetText(bf) +{ + collapsed = true; + label = "Label"; + autocolapse = true; + autoBreakRows = true; + framecolor = LColor::footnoteframe; + widthOffset = 7; +} + + +Inset * InsetCollapsable::Clone() +{ + Inset * result = new InsetCollapsable(buffer); + return result; +} + +int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const +{ + int width = 0, ascent = 0, descent = 0; + pain.buttonText(0, 0, label.c_str(), labelfont, false, + width, ascent, descent); + return ascent; +} + + +int InsetCollapsable::descent_collapsed(Painter & pain, LyXFont const &) const +{ + int width = 0, ascent = 0, descent = 0; + pain.buttonText(0, 0, label.c_str(), labelfont, false, + width, ascent, descent); + return descent; +} + + +int InsetCollapsable::width_collapsed(Painter & pain, LyXFont const &) const +{ + int width, ascent, descent; + pain.buttonText(TEXT_TO_INSET_OFFSET, 0, label.c_str(), labelfont, false, + width, ascent, descent); + return width + (2*TEXT_TO_INSET_OFFSET); +} + + +int InsetCollapsable::ascent(Painter & pain, LyXFont const & font) const +{ + if (collapsed) + return ascent_collapsed(pain, font); + else + return InsetText::ascent(pain, font) + TEXT_TO_TOP_OFFSET; +} + + +int InsetCollapsable::descent(Painter & pain, LyXFont const & font) const +{ + if (collapsed) + return descent_collapsed(pain, font); + else + return InsetText::descent(pain, font) + TEXT_TO_BOTTOM_OFFSET; +} + + +int InsetCollapsable::width(Painter & pain, LyXFont const & font) const +{ + if (collapsed) + return width_collapsed(pain, font); + + return getMaxWidth(pain); +} + + +void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &, + int baseline, float & x) const +{ + int width = 0; + pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline, + label.c_str(), labelfont, true, width); + x += width + (2 * TEXT_TO_INSET_OFFSET); +} + + +void InsetCollapsable::draw(Painter & pain, LyXFont const & f, + int baseline, float & x) const +{ + if (collapsed) { + draw_collapsed(pain, f, baseline, x); + return; + } + top_x = int(x); + top_baseline = baseline; + draw_collapsed(pain, f, baseline, x); + button_x = int(x - top_x); + + maxWidth = getMaxWidth(pain) - button_x; + x += 2; + int + w = maxWidth - widthOffset, + h = ascent(pain,f) + descent(pain,f); + + pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor); + + x += 4; + top_x = int(x - top_x); + InsetText::draw(pain, f, baseline, x); +} + + +void InsetCollapsable::Edit(BufferView *bv, int x, int y, unsigned int button) +{ + if (collapsed) { + collapsed = false; + UpdateLocal(bv, true); + InsetText::Edit(bv, 0, 0, button); + } else if (button && (x < button_x) && + (y < (labelfont.maxDescent()+labelfont.maxAscent()))) { + collapsed = true; + UpdateLocal(bv, false); + bv->unlockInset(this); + } else { + InsetText::Edit(bv, x-top_x, y, button); + } +} + + +Inset::EDITABLE InsetCollapsable::Editable() const +{ + if (collapsed) + return IS_EDITABLE; + return HIGHLY_EDITABLE; +} + +void InsetCollapsable::InsetUnlock(BufferView *bv) +{ + if (autocolapse) { + collapsed = true; + } + InsetText::InsetUnlock(bv); + UpdateLocal(bv, true); +} + + +void InsetCollapsable::UpdateLocal(BufferView *bv, bool flag) +{ + maxWidth = getMaxWidth(bv->getPainter()) - + width_collapsed(bv->getPainter(), labelfont); + InsetText::UpdateLocal(bv, flag); +} + + +void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button) +{ + if ((x < button_x) && + (y < (labelfont.maxDescent()+labelfont.maxAscent()))) { + collapsed = true; + UpdateLocal(bv, false); + bv->unlockInset(this); + } else if (x >= button_x) { + InsetText::InsetButtonPress(bv, x-top_x, y, button); + } +} + + +void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int button) +{ + if (x >= button_x) + InsetText::InsetButtonRelease(bv, x-top_x, y, button); +} + + +void InsetCollapsable::InsetMotionNotify(BufferView *bv, int x, int y, int button) +{ + if (x >= button_x) + InsetText::InsetMotionNotify(bv, x-top_x, y, button); +} diff --git a/src/insets/insetcollapsable.h b/src/insets/insetcollapsable.h new file mode 100644 index 0000000000..6408e11dd8 --- /dev/null +++ b/src/insets/insetcollapsable.h @@ -0,0 +1,101 @@ +// -*- C++ -*- +/* This file is part of + * ====================================================== + * + * LyX, The Document Processor + * + * Copyright (C) 2000 The LyX Team. + * + *====================================================== + */ + + +#ifndef INSETCOLLAPSABLE_H +#define INSETCOLLAPSABLE_H + +#ifdef __GNUG__ +#pragma interface +#endif + +#include "insettext.h" +#include "lyxfont.h" +#include "LColor.h" + + +class Painter; + +/** A colapsable text inset + +*/ +class InsetCollapsable : public InsetText { +public: + /// + static int const TEXT_TO_TOP_OFFSET = 2; + /// + static int const TEXT_TO_BOTTOM_OFFSET = 2; + /// + InsetCollapsable(Buffer *); + /// + ~InsetCollapsable() {} + /// + Inset * InsetCollapsable::Clone(); + /// + int ascent(Painter &, LyXFont const &) const; + /// + int descent(Painter &, LyXFont const &) const; + /// + int width(Painter &, LyXFont const & f) const; + /// + void draw(Painter & pain, const LyXFont &, int , float &) const; + /// + void Edit(BufferView *, int, int, unsigned int); + /// + EDITABLE Editable() const; + /// + void InsetUnlock(BufferView *); + /// + bool display() const { return (!collapsed); } + /// + void InsetButtonRelease(BufferView *, int, int, int); + /// + void InsetButtonPress(BufferView *, int, int, int); + /// + void InsetMotionNotify(BufferView *, int, int, int); + /// + void setLabel(string const & l) { label = l; } + /// + void setLabelFont(LyXFont & f) { labelfont = f; } + /// + void setAutoCollapse(bool f) { autocolapse = f; } + +protected: + /// + int ascent_collapsed(Painter &, LyXFont const &) const; + /// + int descent_collapsed(Painter &, LyXFont const &) const; + /// + int width_collapsed(Painter &, LyXFont const & f) const; + /// + void draw_collapsed(Painter & pain, const LyXFont &, int , float &) const; + /// + void UpdateLocal(BufferView *, bool); + + /// + bool collapsed; + /// + LColor::color framecolor; + +private: + /// + string label; + /// + LyXFont labelfont; + /// + bool autocolapse; + /// + mutable int + top_baseline, top_x, + button_x; +}; + +#endif diff --git a/src/insets/inseterror.C b/src/insets/inseterror.C index c2c873cf90..8385c4bf84 100644 --- a/src/insets/inseterror.C +++ b/src/insets/inseterror.C @@ -146,9 +146,9 @@ bool InsetError::AutoDelete() const } -unsigned char InsetError::Editable() const +Inset::EDITABLE InsetError::Editable() const { - return 1; + return IS_EDITABLE; } diff --git a/src/insets/inseterror.h b/src/insets/inseterror.h index 47892510a6..ede6b82fcc 100644 --- a/src/insets/inseterror.h +++ b/src/insets/inseterror.h @@ -68,7 +68,7 @@ public: /// void Edit(BufferView *, int x, int y, unsigned int button); /// - unsigned char Editable() const; + EDITABLE Editable() const; /// Inset * Clone() const; /// diff --git a/src/insets/insetert.C b/src/insets/insetert.C index 698ff3435a..27ddcdd7d8 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -17,15 +17,23 @@ #include "gettext.h" #include "lyxfont.h" #include "Painter.h" -#include "lyx_gui_misc.h" +#include "buffer.h" +//#include "lyx_gui_misc.h" InsetERT::InsetERT(Buffer * bf) - : InsetText(bf) + : InsetCollapsable(bf) { - closed = true; - nomotion = false; - autoBreakRows = true; + setLabel(_("ERT")); + LyXFont font(LyXFont::ALL_SANE); + font.setLatex (LyXFont::ON); + real_current_font = current_font = font; + LyXFont labelfont(LyXFont::ALL_SANE); + labelfont.decSize(); + labelfont.decSize(); + labelfont.setColor(LColor::ert); + setLabelFont(labelfont); + setAutoCollapse(false); } @@ -42,151 +50,13 @@ void InsetERT::Write(ostream & os) const WriteParagraphData(os); } - -int InsetERT::ascent_closed(Painter & pain, LyXFont const & f) const -{ - int width, ascent, descent; - LyXFont font(LyXFont::ALL_SANE); - font.setSize(f.size()); - font.decSize(); - font.decSize(); - pain.buttonText(0, 0, _("ERT"), font, false, width, ascent, descent); - return ascent; -} - - -int InsetERT::descent_closed(Painter & pain, LyXFont const & f) const -{ - int width, ascent, descent; - LyXFont font(LyXFont::ALL_SANE); - font.setSize(f.size()); - font.decSize(); - font.decSize(); - pain.buttonText(0, 0, _("ERT"), font, false, width, ascent, descent); - return descent; -} - - -int InsetERT::width_closed(Painter & pain, LyXFont const & f) const -{ - int width, ascent, descent; - LyXFont font(LyXFont::ALL_SANE); - font.setSize(f.size()); - font.decSize(); - font.decSize(); - pain.buttonText(TEXT_TO_INSET_OFFSET, 0, _("ERT"), font, false, - width, ascent, descent); - return width + (2*TEXT_TO_INSET_OFFSET); -} - - -int InsetERT::ascent(Painter & pain, LyXFont const & font) const -{ - if (closed) - return ascent_closed(pain, font); - else - return InsetText::ascent(pain, font); -} - - -int InsetERT::descent(Painter & pain, LyXFont const & font) const -{ - - if (closed) - return descent_closed(pain, font); - else - return InsetText::descent(pain, font); -} - - -int InsetERT::width(Painter & pain, LyXFont const & font) const -{ - if (closed) - return width_closed(pain, font); - else - return InsetText::width(pain, font); -} - - -void InsetERT::draw_closed(Painter & pain, LyXFont const & f, - int baseline, float & x) const -{ - LyXFont font(LyXFont::ALL_SANE); - font.setSize(f.size()); - font.decSize(); - font.decSize(); - font.setColor(LColor::ert); - int width; - pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline, - _("ERT"), font, true, width); - x += width + (2 * TEXT_TO_INSET_OFFSET); -} - - -void InsetERT::draw(Painter & pain, LyXFont const & f, - int baseline, float & x) const -{ - if (closed) { - top_x = int(x); - top_baseline = baseline; - draw_closed(pain, f, baseline, x); - } else { - InsetText::draw(pain, f, baseline, x); - } -// resetPos(bv); -} - - -void InsetERT::InsetButtonRelease(BufferView * bv, int x, int y, int button) -{ - nomotion = false; - InsetText::InsetButtonRelease(bv, x, y, button); -} - - -void InsetERT::InsetButtonPress(BufferView * bv, int x, int y, int button) -{ - nomotion = false; - InsetText::InsetButtonPress(bv, x, y, button); -} - - -void InsetERT::InsetMotionNotify(BufferView * bv, int x, int y, int button) -{ - if (nomotion) - return; - InsetText::InsetMotionNotify(bv, x, y, button); -} - - -void InsetERT::Edit(BufferView * bv, int x, int y, unsigned int button) -{ - closed = false; - nomotion = true; - LyXFont font(LyXFont::ALL_SANE); - font.setLatex (LyXFont::ON); - InsetText::Edit(bv, (x > (width_closed(bv->getPainter(),font)-5) ? - width(bv->getPainter(), font) : 0), y, button); - real_current_font = current_font = font; - bv->updateInset(this, false); -} - - -void InsetERT::InsetUnlock(BufferView * bv) -{ - closed = true; - InsetText::InsetUnlock(bv); - bv->updateInset(this, false); -} - - -bool InsetERT::InsertInset(Inset *) +bool InsetERT::InsertInset(BufferView *, Inset *) { return false; } -void InsetERT::SetFont(LyXFont const &, bool) +void InsetERT::SetFont(BufferView *, LyXFont const &, bool) { WriteAlert(_("Impossible Operation!"), _("Not permitted to change font-types inside ERT-insets!"), diff --git a/src/insets/insetert.h b/src/insets/insetert.h index 162fe8924f..cea113cb60 100644 --- a/src/insets/insetert.h +++ b/src/insets/insetert.h @@ -18,7 +18,7 @@ #pragma interface #endif -#include "insettext.h" +#include "insetcollapsable.h" class Painter; @@ -27,60 +27,23 @@ class Painter; To write full ert (including styles and other insets) in a given space. */ -class InsetERT : public InsetText { +class InsetERT : public InsetCollapsable { public: /// InsetERT(Buffer *); /// - // InsetERT(InsetERT const &, Buffer *); - /// ~InsetERT() {} /// Inset * Clone() const; /// - // void Read(LyXLex &); - /// void Write(ostream &) const; /// - int ascent(Painter &, LyXFont const &) const; + const char * EditMessage() const { return _("Opened ERT Inset");} /// - int descent(Painter &, LyXFont const &) const; + bool InsertInset(BufferView *, Inset *); /// - int width(Painter &, LyXFont const & f) const; + void SetFont(BufferView *, LyXFont const &, bool toggleall = false); /// - void draw(Painter & pain, const LyXFont &, int , float &) const; - /// - //LString EditMessage() const; - /// - void InsetButtonRelease(BufferView *, int, int, int); - /// - void InsetButtonPress(BufferView *, int, int, int); - /// - void InsetMotionNotify(BufferView *, int, int, int); - /// - void Edit(BufferView *, int, int, unsigned int); - /// - void InsetUnlock(BufferView *); - /// - bool InsertInset(Inset *); - /// - void SetFont(LyXFont const &, bool toggleall); - -protected: - /// - int ascent_closed(Painter &, LyXFont const &) const; - /// - int descent_closed(Painter &, LyXFont const &) const; - /// - int width_closed(Painter &, LyXFont const & f) const; - /// - void draw_closed(Painter & pain, LyXFont const &, int , float &) const; - -private: - /// - bool closed; - /// - bool nomotion; }; #endif diff --git a/src/insets/insetfoot.C b/src/insets/insetfoot.C new file mode 100644 index 0000000000..2b01a0e826 --- /dev/null +++ b/src/insets/insetfoot.C @@ -0,0 +1,114 @@ +/* This file is part of + * ====================================================== + * + * LyX, The Document Processor + * + * Copyright (C) 1998 The LyX Team. + * + *======================================================*/ + +#include + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "insetfoot.h" +#include "gettext.h" +#include "lyxfont.h" +#include "BufferView.h" +#include "lyxscreen.h" +#include "Painter.h" + + +InsetFoot::InsetFoot(Buffer * bf): InsetCollapsable(bf) +{ + setLabel(_("foot")); + LyXFont font(LyXFont::ALL_SANE); + font.decSize(); + font.decSize(); + font.setColor(LColor::footnote); + setLabelFont(font); + setAutoCollapse(false); +} + + +InsetFoot * InsetFoot::Clone() const +{ + InsetFoot * result = new InsetFoot(buffer); + return result; +} + + +const char * InsetFoot::EditMessage() const +{ + return _("Opened Footnote Inset"); +} + +#ifndef USE_OSTREAM_ONLY +int InsetFoot::Latex(string & l, signed char fragile) const +{ + int i; + + if (fragile) + l += "\\footnotetext{"; + else + l += "\\footnote{"; + + i = InsetText::Latex(l, fragile); + l += "}"; + + return i; +} +#endif + +int InsetFoot::Latex(ostream & os, signed char fragile) const +{ + int i; + + if (fragile) + os << "\\footnotetext{"; + else + os << "\\footnote{"; + + i = InsetText::Latex(os, fragile); + os << "}"; + + return i; +} + +void InsetFoot::Write(ostream & os) const +{ + os << "Foot\n"; + os << "\ncollapsed "; + if (display()) + os << "false"; + else + os << "true"; + os << "\n"; + WriteParagraphData(os); +} + +void InsetFoot::Read(LyXLex & lex) +{ + if (lex.IsOK()) { + string token, tmptok; + + lex.next(); + token = lex.GetString(); + if (token == "collapsed") { + lex.next(); + collapsed = lex.GetBool(); + } + } + InsetText::Read(lex); +} + +bool InsetFoot::InsertInset(BufferView *bv, Inset * inset) +{ + if ((inset->LyxCode() == Inset::FOOT_CODE) || + (inset->LyxCode() == Inset::MARGIN_CODE)) { + return false; + } + return InsetText::InsertInset(bv, inset); +} diff --git a/src/insets/insetfoot.h b/src/insets/insetfoot.h new file mode 100644 index 0000000000..03e0f01489 --- /dev/null +++ b/src/insets/insetfoot.h @@ -0,0 +1,55 @@ +// -*- C++ -*- +/* This file is part of + * ====================================================== + * + * LyX, The Document Processor + * + * Copyright (C) 1998 The LyX Team. + * + *====================================================== + */ +// The pristine updatable inset: Text + + +#ifndef INSETFOOT_H +#define INSETFOOT_H + +#ifdef __GNUG__ +#pragma interface +#endif + +#include "insetcollapsable.h" + + +class Painter; + +/** The footnote inset + +*/ +class InsetFoot : public InsetCollapsable { +public: + /// + InsetFoot(Buffer *); + /// + ~InsetFoot() {} + /// + InsetFoot * InsetFoot::Clone() const; + /// + Inset::Code LyxCode() const { return Inset::FOOT_CODE; } +#ifndef USE_OSTREAM_ONLY + /// + int Latex(string &, signed char) const; +#endif + /// + int Latex(ostream &, signed char) const; + /// + void Write(ostream &) const; + /// + void Read(LyXLex &); + /// + const char * EditMessage() const; + /// + bool InsertInset(BufferView *, Inset * inset); +}; + +#endif diff --git a/src/insets/insetgraphics.C b/src/insets/insetgraphics.C index 348546d42d..a61086ec3a 100644 --- a/src/insets/insetgraphics.C +++ b/src/insets/insetgraphics.C @@ -59,9 +59,9 @@ void InsetGraphics::Edit(BufferView *, int, int, unsigned int) } -unsigned char InsetGraphics::Editable() const +Inset::EDITABLE InsetGraphics::Editable() const { - return 1; + return IS_EDITABLE; } diff --git a/src/insets/insetgraphics.h b/src/insets/insetgraphics.h index df7fadf0d1..0d184f4d7a 100644 --- a/src/insets/insetgraphics.h +++ b/src/insets/insetgraphics.h @@ -36,7 +36,7 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const; + EDITABLE Editable() const; /// void Write(ostream &) const; /// diff --git a/src/insets/insetinclude.h b/src/insets/insetinclude.h index 7ea9085fa0..94179bdbe3 100644 --- a/src/insets/insetinclude.h +++ b/src/insets/insetinclude.h @@ -49,9 +49,9 @@ public: /// void Edit(BufferView *, int x, int y, unsigned int button); /// - unsigned char Editable() const + EDITABLE Editable() const { - return 1; + return IS_EDITABLE; } /// With lyx3 we won't overload these 3 methods void Write(ostream &) const; diff --git a/src/insets/insetindex.h b/src/insets/insetindex.h index b4905bf0b0..4b9610b844 100644 --- a/src/insets/insetindex.h +++ b/src/insets/insetindex.h @@ -39,9 +39,9 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const + EDITABLE Editable() const { - return 1; + return IS_EDITABLE; } /// string getScreenLabel() const; @@ -61,8 +61,8 @@ public: /// void Edit(BufferView *, int, int, unsigned int) {} /// - unsigned char Editable() const{ - return 1; + EDITABLE Editable() const{ + return IS_EDITABLE; } /// WHY is clone missing? (Lgb) /// diff --git a/src/insets/insetinfo.C b/src/insets/insetinfo.C index fc90380130..9e0d9f5755 100644 --- a/src/insets/insetinfo.C +++ b/src/insets/insetinfo.C @@ -165,9 +165,9 @@ int InsetInfo::DocBook(ostream &) const #endif -unsigned char InsetInfo::Editable() const +Inset::EDITABLE InsetInfo::Editable() const { - return 1; + return IS_EDITABLE; } diff --git a/src/insets/insetinfo.h b/src/insets/insetinfo.h index 3ae6a47e7c..2ff60dde43 100644 --- a/src/insets/insetinfo.h +++ b/src/insets/insetinfo.h @@ -68,7 +68,7 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const; + EDITABLE Editable() const; /// Inset::Code LyxCode() const; /// diff --git a/src/insets/insetlabel.h b/src/insets/insetlabel.h index be251cb1de..9932bdfdba 100644 --- a/src/insets/insetlabel.h +++ b/src/insets/insetlabel.h @@ -37,7 +37,7 @@ public: /// string getScreenLabel() const { return getContents(); } /// - unsigned char Editable() const { return 0; } + EDITABLE Editable() const { return NOT_EDITABLE; } /// int Latex(ostream &, signed char fragile) const; #ifndef USE_OSTREAM_ONLY diff --git a/src/insets/insetloa.h b/src/insets/insetloa.h index 49ca447356..6853205e0a 100644 --- a/src/insets/insetloa.h +++ b/src/insets/insetloa.h @@ -37,8 +37,8 @@ public: string getScreenLabel() const { return _("List of Algorithms"); } /// - unsigned char Editable() const { - return 0; // not yet + EDITABLE Editable() const { + return NOT_EDITABLE; // not yet } /// bool display() const { return true; } diff --git a/src/insets/insetlof.h b/src/insets/insetlof.h index ee95d46c39..4eea16c155 100644 --- a/src/insets/insetlof.h +++ b/src/insets/insetlof.h @@ -35,8 +35,8 @@ public: string getScreenLabel() const { return _("List of Figures"); } /// - unsigned char Editable() const { - return 0; // not yet + EDITABLE Editable() const { + return NOT_EDITABLE; // not yet } /// bool display() const { return true; } diff --git a/src/insets/insetlot.h b/src/insets/insetlot.h index 6600c3bf3a..ba6ce17f79 100644 --- a/src/insets/insetlot.h +++ b/src/insets/insetlot.h @@ -35,8 +35,8 @@ public: string getScreenLabel() const { return _("List of Tables"); } /// - unsigned char Editable() const { - return 0; // not yet + EDITABLE Editable() const { + return NOT_EDITABLE; // not yet } /// bool display() const { return true; } diff --git a/src/insets/insetparent.h b/src/insets/insetparent.h index cc0ecb319d..745b3b8749 100644 --- a/src/insets/insetparent.h +++ b/src/insets/insetparent.h @@ -46,8 +46,8 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// Inset::Code LyxCode() const { return Inset::PARENT_CODE; } diff --git a/src/insets/insetref.h b/src/insets/insetref.h index 2d6d2b45fc..2e6f990f3e 100644 --- a/src/insets/insetref.h +++ b/src/insets/insetref.h @@ -47,8 +47,8 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// bool display() const { return false; } diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 4e187ef8d7..b029c52dd9 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -66,8 +66,9 @@ InsetText::InsetText(Buffer * buf) interline_space = 1; no_selection = false; init_inset = true; - maxAscent = maxDescent = insetWidth = 0; + maxAscent = maxDescent = insetWidth = widthOffset = 0; autoBreakRows = false; + xpos = 0.0; } @@ -82,8 +83,9 @@ InsetText::InsetText(InsetText const & ins, Buffer * buf) interline_space = 1; no_selection = false; init_inset = true; - maxAscent = maxDescent = insetWidth = 0; + maxAscent = maxDescent = insetWidth = widthOffset = 0; autoBreakRows = false; + xpos = 0.0; } @@ -153,7 +155,7 @@ void InsetText::Read(LyXLex & lex) int InsetText::ascent(Painter & pain, LyXFont const & font) const { if (init_inset) { - computeTextRows(pain); + computeTextRows(pain, xpos); init_inset = false; } if (maxAscent) @@ -165,7 +167,7 @@ int InsetText::ascent(Painter & pain, LyXFont const & font) const int InsetText::descent(Painter & pain, LyXFont const & font) const { if (init_inset) { - computeTextRows(pain); + computeTextRows(pain, xpos); init_inset = false; } if (maxDescent) @@ -177,34 +179,18 @@ int InsetText::descent(Painter & pain, LyXFont const & font) const int InsetText::width(Painter & pain, LyXFont const &) const { if (init_inset) { - computeTextRows(pain); + computeTextRows(pain, xpos); init_inset = false; } return insetWidth; } -int InsetText::getMaxWidth(UpdatableInset * inset) const -{ - if (!the_locking_inset) { - lyxerr << "Text: No locking inset in this inset.\n"; - return 0; - } - - if (the_locking_inset == inset) - return maxWidth; - - return the_locking_inset->getMaxWidth(inset); -} - - void InsetText::draw(Painter & pain, LyXFont const & f, int baseline, float & x) const { -// if (init_inset) { - computeTextRows(pain, x); -// init_inset = false; -// } + xpos = x; + computeTextRows(pain, x); UpdatableInset::draw(pain, f, baseline, x); bool do_reset_pos = (x != top_x) || (baseline != top_baseline); @@ -324,7 +310,7 @@ void InsetText::InsetUnlock(BufferView * bv) HideInsetCursor(bv); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } the_locking_inset = 0; no_selection = false; @@ -354,7 +340,7 @@ bool InsetText::UpdateInsetInInset(BufferView * bv, Inset * inset) return the_locking_inset->UpdateInsetInInset(bv, inset); float x = inset_x; inset->draw(bv->getPainter(), real_current_font, inset_y, x); - bv->updateInset(this, true); + UpdateLocal(bv, true); return true; } @@ -373,7 +359,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button) { if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } no_selection = false; if (the_locking_inset) { @@ -419,7 +405,7 @@ void InsetText::InsetMotionNotify(BufferView * bv, int x, int y, int button) setPos(bv, x, y, false); selection_end = actpos; if (old != selection_end) - bv->updateInset(this, false); + UpdateLocal(bv, false); } no_selection = false; } @@ -457,7 +443,7 @@ InsetText::LocalDispatch(BufferView * bv, result = the_locking_inset->LocalDispatch(bv, action, arg); if (result == DISPATCHED) { the_locking_inset->ToggleInsetCursor(bv); - bv->updateInset(this, false); + UpdateLocal(bv, false); the_locking_inset->ToggleInsetCursor(bv); return result; } else if (result == FINISHED) { @@ -475,8 +461,7 @@ InsetText::LocalDispatch(BufferView * bv, case -1: par->InsertChar(actpos,arg[0]); par->SetFont(actpos,real_current_font); - computeTextRows(bv->getPainter()); - bv->updateInset(this, true); + UpdateLocal(bv, true); ++actpos; selection_start = selection_end = actpos; resetPos(bv); @@ -485,13 +470,13 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_RIGHTSEL: moveRight(bv, false); selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); break; case LFUN_RIGHT: result= DISPATCH_RESULT(moveRight(bv)); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -499,13 +484,13 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_LEFTSEL: moveLeft(bv, false); selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); break; case LFUN_LEFT: result= DISPATCH_RESULT(moveLeft(bv)); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -513,13 +498,13 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_DOWNSEL: moveDown(bv, false); selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); break; case LFUN_DOWN: result= DISPATCH_RESULT(moveDown(bv)); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -527,13 +512,13 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_UPSEL: moveUp(bv, false); selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); break; case LFUN_UP: result= DISPATCH_RESULT(moveUp(bv)); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -542,7 +527,7 @@ InsetText::LocalDispatch(BufferView * bv, if (!actpos || par->IsNewline(actpos-1)) { if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } break; } @@ -550,11 +535,10 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_DELETE: if (Delete()) { // we need update selection_start = selection_end = actpos; - computeTextRows(bv->getPainter()); - bv->updateInset(this, true); + UpdateLocal(bv, true); } else if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } break; case LFUN_HOME: @@ -563,7 +547,7 @@ InsetText::LocalDispatch(BufferView * bv, cx -= SingleWidth(bv->getPainter(), par, actpos); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -573,7 +557,7 @@ InsetText::LocalDispatch(BufferView * bv, cx += SingleWidth(bv->getPainter(), par, actpos); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -582,7 +566,7 @@ InsetText::LocalDispatch(BufferView * bv, InsertInset(bv, new InsetFormula); if (hasSelection()) { selection_start = selection_end = actpos; - bv->updateInset(this, false); + UpdateLocal(bv, false); } else { selection_start = selection_end = actpos; } @@ -959,10 +943,13 @@ bool InsetText::Delete() bool InsetText::InsertInset(BufferView * bv, Inset * inset) { + if (inset->Editable() == Inset::IS_EDITABLE) { + UpdatableInset *i = (UpdatableInset *)inset; + i->setOwner((UpdatableInset *)this); + } par->InsertChar(actpos, LyXParagraph::META_INSET); par->InsertInset(actpos, inset); - computeTextRows(bv->getPainter()); - bv->updateInset(this, true); + UpdateLocal(bv, true); the_locking_inset = static_cast(inset); inset_x = cx - top_x; inset_y = cy; @@ -1015,8 +1002,7 @@ void InsetText::SetFont(BufferView * bv, LyXFont const & font, bool toggleall) SetCharFont(s_start, newfont); ++s_start; } - computeTextRows(bv->getPainter()); - bv->updateInset(this, true); + UpdateLocal(bv, true); } @@ -1051,28 +1037,6 @@ void InsetText::SetCharFont(int pos, LyXFont const & f) } -// Ok, Jürgen. Here is my small secret message to you. As you can see I -// played a bit witht he Textinset. (But only through the InsetERT so far). -// As you can see below I have changed the code to use max/min instead of -// the if < construct, imo this makes it faster and easier to read. I have -// also changed rows[rows.size() - 1] to rows.back() makes it clearer that -// we speak about the last element in the vector. I added a second arg to -// to this func as well. This makes it possible to take the position of the -// inset into account when drawing the inset, this is especially needed when -// the ERT inset is first in a paragraph. I am not sure, but this might have -// made short ERT (less than one line, just a couple of words) draw -// incorrectly. You should perhaps have a look yourselves at this. -// Also (phu...) I use pain to get at paperWidth(). -// This is beginning to look like a very nice Inset (speaking of the ERT -// inset that is), but in afterthought, do we really need it? Wouldn't a -// non dynamic inset working in the same way as the floats be more usefull -// and easier to work with? Jean-Marc has already aired this thought. -// I tested also a bit on the raw insettext, it seems that it can't break -// over several lines properly. Other than that it seems to create the basis -// for insetfloat, insetmarginal and insetfoot just fine. How about a -// updatable inset that does not open, unless you click on it? uff... I just -// ramble on. Feel free to remove my comments after you have read them. -// Lgb void InsetText::computeTextRows(Painter & pain, float x) const { int p, @@ -1088,7 +1052,6 @@ void InsetText::computeTextRows(Painter & pain, float x) const if (rows.size()) rows.clear(); - //rows.erase(rows.begin(),rows.end()); int width = wordAscent = wordDescent = 0; insetWidth = maxAscent = maxDescent = 0; row.asc = 0; @@ -1101,11 +1064,7 @@ void InsetText::computeTextRows(Painter & pain, float x) const insetWidth += SingleWidth(pain, par, p); SingleHeight(pain, par, p, asc, desc); maxAscent = max(maxAscent, asc); - //if (asc > maxAscent) - //maxAscent = asc; maxDescent = max(maxDescent, desc); - //if (desc > maxDescent) - //maxDescent = desc; } rows[0].asc = maxAscent; rows[0].desc = maxDescent; @@ -1119,25 +1078,20 @@ void InsetText::computeTextRows(Painter & pain, float x) const int cw, lastWordWidth = 0; - //maxWidth = buffer->getUser()->paperWidth(); - maxWidth = pain.paperWidth(); + maxWidth = UpdatableInset::getMaxWidth(pain) - widthOffset; for(p = 0; p < par->Last(); ++p) { cw = SingleWidth(pain, par, p); width += cw; lastWordWidth += cw; SingleHeight(pain, par, p, asc, desc); wordAscent = max(wordAscent, asc); - //if (asc > wordAscent) - // wordAscent = asc; wordDescent = max(wordDescent, desc); - //if (desc > wordDescent) - // wordDescent = desc; Inset const * inset = 0; if (((p + 1) < par->Last()) && (par->GetChar(p + 1)==LyXParagraph::META_INSET)) inset = par->GetInset(p + 1); if (inset && inset->display()) { - if (!is_first_word_in_row && (width >= maxWidth - x)) { + if (!is_first_word_in_row && (width >= (maxWidth - x))) { // we have to split also the row above rows.back().asc = oasc; rows.back().desc = odesc; @@ -1146,17 +1100,11 @@ void InsetText::computeTextRows(Painter & pain, float x) const oasc = wordAscent; odesc = wordDescent; insetWidth = max(insetWidth, owidth); - //if (insetWidth < owidth) - // insetWidth = owidth; width = lastWordWidth; lastWordWidth = 0; } else { oasc = max(oasc, wordAscent); - //if (oasc < wordAscent) - //oasc = wordAscent; odesc = max(odesc, wordDescent); - //if (odesc < wordDescent) - //odesc = wordDescent; } rows.back().asc = oasc; rows.back().desc = odesc; @@ -1170,7 +1118,7 @@ void InsetText::computeTextRows(Painter & pain, float x) const oasc = odesc = width = lastWordWidth = 0; is_first_word_in_row = true; wordAscent = wordDescent = 0; - x = 0.0; +// x = 0.0; continue; } else if (par->IsSeparator(p)) { if (width >= maxWidth - x) { @@ -1188,31 +1136,24 @@ void InsetText::computeTextRows(Painter & pain, float x) const oasc = wordAscent; odesc = wordDescent; insetWidth = max(insetWidth, owidth); - //if (insetWidth < owidth) - //insetWidth = owidth; width = lastWordWidth; } wordAscent = wordDescent = lastWordWidth = 0; nwp = p + 1; - x = 0.0; +// x = 0.0; continue; } owidth = width; oasc = max(oasc, wordAscent); - //if (oasc < wordAscent) - //oasc = wordAscent; odesc = max(odesc, wordDescent); - //if (odesc < wordDescent) - //odesc = wordDescent; wordAscent = wordDescent = lastWordWidth = 0; nwp = p + 1; is_first_word_in_row = false; } - x = 0.0; } // if we have some data in the paragraph we have ascent/descent if (p) { - if (width >= maxWidth) { + if (width >= (maxWidth - x)) { // assign upper row rows.back().asc = oasc; rows.back().desc = odesc; @@ -1221,25 +1162,16 @@ void InsetText::computeTextRows(Painter & pain, float x) const rows.push_back(row); rows.back().asc = wordAscent; rows.back().desc = wordDescent; - insetWidth = max(insetWidth, owidth); - //if (insetWidth < owidth) - //insetWidth = owidth; - width -= owidth; - insetWidth = max(insetWidth, width); - //if (insetWidth < width) - //insetWidth = width; + width -= lastWordWidth; } else { // assign last row data - oasc = max(oasc, wordAscent); - //if (oasc < wordAscent) - //oasc = wordAscent; - odesc = min(odesc, wordDescent); - //if (odesc < wordDescent) - //odesc = wordDescent; - rows.back().asc = oasc; - rows.back().desc = odesc; +// width = lastWordWidth; +// lastWordWidth = 0; + rows.back().asc = max(oasc, wordAscent); + rows.back().desc = max(odesc, wordDescent); } } + insetWidth = max(insetWidth, width); // alocate a dummy row for the endpos row.pos = par->Last(); rows.push_back(row); @@ -1249,7 +1181,6 @@ void InsetText::computeTextRows(Painter & pain, float x) const for (RowList::size_type i = 1; i < rows.size() - 1; ++i) { maxDescent += rows[i].asc + rows[i].desc + interline_space; } - lyxerr << "Rows: " << rows.size() << endl; #if 0 if (the_locking_inset) { computeBaselines(top_baseline); @@ -1270,3 +1201,9 @@ void InsetText::computeBaselines(int baseline) const rows[i].asc + interline_space; } } + +void InsetText::UpdateLocal(BufferView *bv, bool flag) +{ + init_inset = flag; + bv->updateInset(this, flag); +} diff --git a/src/insets/insettext.h b/src/insets/insettext.h index 86965826cb..c616616d14 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -21,10 +21,11 @@ #include "lyxinset.h" #include "lyxparagraph.h" #include "LString.h" -#include "buffer.h" +//#include "buffer.h" class Painter; class BufferView; +class Buffer; /** A text inset is like a TeX box @@ -54,8 +55,6 @@ public: /// int width(Painter &, LyXFont const & f) const; /// - int getMaxWidth(UpdatableInset *) const; - /// void draw(Painter & pain, LyXFont const &, int , float &) const; /// char const * EditMessage() const; @@ -66,8 +65,6 @@ public: /// bool UnlockInsetInInset(BufferView *, Inset *, bool lr = false); /// - //void UpdateLocal(bool flag=true); - /// bool UpdateInsetInInset(BufferView *, Inset *); /// void InsetButtonRelease(BufferView *, int, int, int); @@ -114,6 +111,8 @@ public: LyXParagraph * par; protected: + /// + void UpdateLocal(BufferView *, bool); /// void WriteParagraphData(ostream &) const; /// @@ -127,7 +126,7 @@ protected: int SingleWidth(Painter &, LyXParagraph * par, int pos) const; /// LyXFont GetFont(LyXParagraph * par, int pos) const; - /// + Buffer * buffer; /// LyXFont current_font; @@ -142,6 +141,8 @@ protected: /// mutable int insetWidth; /// + int widthOffset; + /// bool autoBreakRows; private: @@ -202,6 +203,8 @@ private: /// bool no_selection; /// + mutable float xpos; + /// mutable bool init_inset; /// UpdatableInset * the_locking_inset; diff --git a/src/insets/insettoc.h b/src/insets/insettoc.h index f6d08a5611..d64cd9b2b9 100644 --- a/src/insets/insettoc.h +++ b/src/insets/insettoc.h @@ -36,8 +36,8 @@ public: /// On edit, we open the TOC pop-up void Edit(BufferView * bv, int, int, unsigned int); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// bool display() const { return true; } diff --git a/src/insets/inseturl.h b/src/insets/inseturl.h index f0580239ff..fc6835b81e 100644 --- a/src/insets/inseturl.h +++ b/src/insets/inseturl.h @@ -54,8 +54,8 @@ public: /// void Edit(BufferView *, int, int, unsigned int); /// - unsigned char Editable() const { - return 1; + EDITABLE Editable() const { + return IS_EDITABLE; } /// const char * EditMessage() const {return _("Opened Url");} diff --git a/src/insets/lyxinset.h b/src/insets/lyxinset.h index 8336562786..f018fdc84d 100644 --- a/src/insets/lyxinset.h +++ b/src/insets/lyxinset.h @@ -82,7 +82,17 @@ public: /// TEXT_CODE, /// - SPECIALCHAR_CODE + FOOT_CODE, + /// + MARGIN_CODE, + /// + SPECIALCHAR_CODE, + }; + + enum EDITABLE { + NOT_EDITABLE = 0, + IS_EDITABLE, + HIGHLY_EDITABLE }; /// @@ -103,7 +113,7 @@ public: /// virtual void Edit(BufferView *, int x, int y, unsigned int button); /// - virtual unsigned char Editable() const; + virtual EDITABLE Editable() const; /// virtual bool AutoDelete() const; /// @@ -212,11 +222,14 @@ public: } /// - UpdatableInset() { scx = mx_scx = 0; } + UpdatableInset() { + scx = mx_scx = 0; + owner_ = 0; + } /// //virtual ~UpdatableInset() {} /// - virtual unsigned char Editable() const; + virtual EDITABLE Editable() const; /// may call ToggleLockedInsetCursor virtual void ToggleInsetCursor(BufferView *); @@ -259,7 +272,12 @@ public: /// virtual bool isCursorVisible() const { return cursor_visible; } /// - virtual int getMaxWidth(UpdatableInset *) const { return -1; } + virtual int getMaxWidth(Painter & pain) const; + /// + virtual void setOwner(UpdatableInset * inset) { owner_ = inset; } + /// + virtual UpdatableInset * owner() { return owner_; } + protected: /// // virtual void UpdateLocal(bool flag=true); @@ -272,5 +290,8 @@ private: /// int mx_scx; mutable int scx; + /// + UpdatableInset * owner_; + }; #endif diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 0af4ce33cd..e2db299938 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -44,6 +44,7 @@ #include "insets/insettext.h" #include "insets/insetert.h" #include "insets/insetgraphics.h" +#include "insets/insetfoot.h" #include "mathed/formulamacro.h" #include "toolbar.h" #include "spellchecker.h" // RVDK_PATCH_5 @@ -1313,7 +1314,7 @@ string LyXFunc::Dispatch(int ac, && tmptext->cursor.par->GetChar(tmptext->cursor.pos) == LyXParagraph::META_INSET && tmptext->cursor.par->GetInset(tmptext->cursor.pos) - && tmptext->cursor.par->GetInset(tmptext->cursor.pos)->Editable() == 2){ + && tmptext->cursor.par->GetInset(tmptext->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE){ Inset * tmpinset = tmptext->cursor.par->GetInset(tmptext->cursor.pos); setMessage(tmpinset->EditMessage()); tmpinset->Edit(owner->view(), 0, 0, 0); @@ -1341,7 +1342,7 @@ string LyXFunc::Dispatch(int ac, && txt->cursor.par->GetChar(txt->cursor.pos) == LyXParagraph::META_INSET && txt->cursor.par->GetInset(txt->cursor.pos) - && txt->cursor.par->GetInset(txt->cursor.pos)->Editable() == 2) { + && txt->cursor.par->GetInset(txt->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE) { Inset * tmpinset = txt->cursor.par->GetInset(txt->cursor.pos); setMessage(tmpinset->EditMessage()); tmpinset->Edit(owner->view(), @@ -1929,6 +1930,12 @@ string LyXFunc::Dispatch(int ac, owner->view()->insertInset(new_inset); new_inset->Edit(owner->view(), 0, 0, 0); } + case LFUN_INSET_FOOTNOTE: + { + InsetFoot * new_inset = new InsetFoot(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } break; // --- lyxserver commands ---------------------------- diff --git a/src/text2.C b/src/text2.C index d41597d933..f8979be1aa 100644 --- a/src/text2.C +++ b/src/text2.C @@ -355,7 +355,7 @@ void LyXText::OpenStuff() && cursor.par->GetInset(cursor.pos)->Editable()) { owner_->owner()->getMiniBuffer() ->Set(cursor.par->GetInset(cursor.pos)->EditMessage()); - if (cursor.par->GetInset(cursor.pos)->Editable() != 2) + if (cursor.par->GetInset(cursor.pos)->Editable() != Inset::HIGHLY_EDITABLE) SetCursorParUndo(); cursor.par->GetInset(cursor.pos)->Edit(owner_, 0, 0, 0); } else {