mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 01:59:02 +00:00
Added a preliminary NOT working insettabular. Lot's of fixes for the text
inset which should work now quite stable (well better as before anyway ;) There have been especially problems with insets inside insets for which LyX was not prepared, so if you only tried the ERT-inset all should have worked great also before. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@681 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
d0950aceda
commit
33868acd2c
61
ChangeLog
61
ChangeLog
@ -1,3 +1,64 @@
|
|||||||
|
2000-04-19 Juergen Vigna <jug@sad.it>
|
||||||
|
|
||||||
|
* src/insets/insettext.C (init): using a LyXCursor now for cursor
|
||||||
|
position. Set the inset_owner of the used paragraph so that it knows
|
||||||
|
that it is inside an inset. Fixed cursor handling with mouse and
|
||||||
|
cursor keys. Fixed wrong timed inset redraws and lots of other changes
|
||||||
|
and cleanups to make TextInsets work better.
|
||||||
|
|
||||||
|
* src/insets/insettext.h: Using a LyXCursor now. Added a clear() call.
|
||||||
|
Changed parameters of various functions and added LockInsetInInset().
|
||||||
|
|
||||||
|
* src/insets/insettext.C:
|
||||||
|
|
||||||
|
* src/insets/insetcollapsable.h:
|
||||||
|
* src/insets/insetcollapsable.C:
|
||||||
|
* src/insets/insetfoot.h:
|
||||||
|
* src/insets/insetfoot.C:
|
||||||
|
* src/insets/insetert.h:
|
||||||
|
* src/insets/insetert.C: cleaned up the code so that it works now
|
||||||
|
correctly with insettext.
|
||||||
|
|
||||||
|
* src/insets/inset.C:
|
||||||
|
* src/insets/lyxinset.h: inserted inset_owner and some more changes so
|
||||||
|
that insets in insets are supported right.
|
||||||
|
|
||||||
|
* src/table.h:
|
||||||
|
* src/table.C: lots of changes for use with inset tabular (and cleanup)
|
||||||
|
|
||||||
|
* src/paragraph.C: some small fixes
|
||||||
|
|
||||||
|
* src/debug.h: inserted INSETS debug info
|
||||||
|
|
||||||
|
* src/lyxfunc.C (Dispatch): added code for InsetTabular and some inset
|
||||||
|
fixes (f.ex. calling LFUN_DOWN if exiting inset with LFUN_DOWN).
|
||||||
|
|
||||||
|
* src/commandtags.h:
|
||||||
|
* src/LyXAction.C: insert code for InsetTabular.
|
||||||
|
|
||||||
|
* src/BufferView_pimpl.C (workAreaMotionNotify): do return always if
|
||||||
|
not Button1MotionMask.
|
||||||
|
(workAreaButtonRelease): send always a InsetButtonRelease event to
|
||||||
|
the_locking_inset.
|
||||||
|
(checkInsetHit): some setCursor fixes (always with insets).
|
||||||
|
|
||||||
|
* src/BufferView2.C (lockInset): returns a bool now and extended for
|
||||||
|
locking insets inside insets.
|
||||||
|
(showLockedInsetCursor): it is important to have the cursor always
|
||||||
|
before the locked inset.
|
||||||
|
(fitLockedInsetCursor): forgot adding of InsetInInsetY()-offset.
|
||||||
|
|
||||||
|
* src/BufferView.h: made lockInset return a bool.
|
||||||
|
|
||||||
|
* src/lyxtext.h: inserted function SetCursor(LyXCursor, ...).
|
||||||
|
|
||||||
|
* src/text2.C (SetCursor): This now has a version with a LyXCursor
|
||||||
|
that is used also internally but can be called as public to have back
|
||||||
|
a cursor pos which is not set internally.
|
||||||
|
(SetCursorIntern): Changed to use above function.
|
||||||
|
|
||||||
|
* src/CutAndPaste.C (DeleteBuffer): forgot to inizialize textclass
|
||||||
|
|
||||||
2000-04-19 Lars Gullik Bjønnes <larsbj@lyx.org>
|
2000-04-19 Lars Gullik Bjønnes <larsbj@lyx.org>
|
||||||
|
|
||||||
* ANNOUNCE:
|
* ANNOUNCE:
|
||||||
|
@ -12,10 +12,12 @@
|
|||||||
src/buffer.C
|
src/buffer.C
|
||||||
src/bufferlist.C
|
src/bufferlist.C
|
||||||
src/BufferView2.C
|
src/BufferView2.C
|
||||||
|
src/bufferview_funcs.C
|
||||||
src/BufferView_pimpl.C
|
src/BufferView_pimpl.C
|
||||||
src/bullet_forms.C
|
src/bullet_forms.C
|
||||||
src/bullet_forms_cb.C
|
src/bullet_forms_cb.C
|
||||||
src/Chktex.C
|
src/Chktex.C
|
||||||
|
src/ColorHandler.C
|
||||||
src/combox.C
|
src/combox.C
|
||||||
src/credits.C
|
src/credits.C
|
||||||
src/credits_form.C
|
src/credits_form.C
|
||||||
@ -41,6 +43,7 @@ src/insets/insetlof.C
|
|||||||
src/insets/insetlot.C
|
src/insets/insetlot.C
|
||||||
src/insets/insetparent.C
|
src/insets/insetparent.C
|
||||||
src/insets/insetref.C
|
src/insets/insetref.C
|
||||||
|
src/insets/insettabular.C
|
||||||
src/insets/insettext.C
|
src/insets/insettext.C
|
||||||
src/insets/insettoc.C
|
src/insets/insettoc.C
|
||||||
src/insets/inseturl.C
|
src/insets/inseturl.C
|
||||||
@ -75,7 +78,6 @@ src/mathed/math_forms.C
|
|||||||
src/mathed/math_panel.C
|
src/mathed/math_panel.C
|
||||||
src/menus.C
|
src/menus.C
|
||||||
src/minibuffer.C
|
src/minibuffer.C
|
||||||
src/Painter.C
|
|
||||||
src/PaperLayout.C
|
src/PaperLayout.C
|
||||||
src/paragraph.C
|
src/paragraph.C
|
||||||
src/ParagraphExtra.C
|
src/ParagraphExtra.C
|
||||||
@ -86,6 +88,7 @@ src/support/filetools.C
|
|||||||
src/support/getUserName.C
|
src/support/getUserName.C
|
||||||
src/support/path.C
|
src/support/path.C
|
||||||
src/support/path.h
|
src/support/path.h
|
||||||
|
src/table.C
|
||||||
src/TableLayout.C
|
src/TableLayout.C
|
||||||
src/text2.C
|
src/text2.C
|
||||||
src/text.C
|
src/text.C
|
||||||
|
@ -160,7 +160,7 @@ public:
|
|||||||
/// Inserts a lyx file at cursor position. Returns false if it fails.
|
/// Inserts a lyx file at cursor position. Returns false if it fails.
|
||||||
bool insertLyXFile(string const & file);
|
bool insertLyXFile(string const & file);
|
||||||
///
|
///
|
||||||
int lockInset(UpdatableInset * inset);
|
bool lockInset(UpdatableInset * inset);
|
||||||
///
|
///
|
||||||
void showLockedInsetCursor(long x, long y, int asc, int desc);
|
void showLockedInsetCursor(long x, long y, int asc, int desc);
|
||||||
///
|
///
|
||||||
|
@ -723,24 +723,29 @@ void BufferView::replaceWord(string const & replacestring)
|
|||||||
// End of spellchecker stuff
|
// End of spellchecker stuff
|
||||||
|
|
||||||
|
|
||||||
|
bool BufferView::lockInset(UpdatableInset * inset)
|
||||||
/* these functions return 1 if an error occured,
|
|
||||||
otherwise 0 */
|
|
||||||
int BufferView::lockInset(UpdatableInset * inset)
|
|
||||||
{
|
{
|
||||||
if (!the_locking_inset && inset){
|
if (!the_locking_inset && inset) {
|
||||||
the_locking_inset = inset;
|
the_locking_inset = inset;
|
||||||
return 0;
|
return true;
|
||||||
|
} else if (inset) {
|
||||||
|
return the_locking_inset->LockInsetInInset(this, inset);
|
||||||
}
|
}
|
||||||
return 1;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc)
|
void BufferView::showLockedInsetCursor(long x, long y, int asc, int desc)
|
||||||
{
|
{
|
||||||
if (the_locking_inset && available()) {
|
if (the_locking_inset && available()) {
|
||||||
y += text->cursor.y +
|
LyXCursor cursor = text->cursor;
|
||||||
the_locking_inset->InsetInInsetY();
|
if ((cursor.pos - 1 >= 0) &&
|
||||||
|
(cursor.par->GetChar(cursor.pos-1) ==
|
||||||
|
LyXParagraph::META_INSET) &&
|
||||||
|
(cursor.par->GetInset(cursor.pos - 1) ==
|
||||||
|
the_locking_inset->GetLockingInset()))
|
||||||
|
text->SetCursor(cursor, cursor.par, cursor.pos-1);
|
||||||
|
y += cursor.y + the_locking_inset->InsetInInsetY();
|
||||||
pimpl_->screen->ShowManualCursor(x, y, asc, desc,
|
pimpl_->screen->ShowManualCursor(x, y, asc, desc,
|
||||||
LyXScreen::BAR_SHAPE);
|
LyXScreen::BAR_SHAPE);
|
||||||
}
|
}
|
||||||
@ -758,7 +763,7 @@ void BufferView::hideLockedInsetCursor()
|
|||||||
void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc)
|
void BufferView::fitLockedInsetCursor(long x, long y, int asc, int desc)
|
||||||
{
|
{
|
||||||
if (the_locking_inset && available()){
|
if (the_locking_inset && available()){
|
||||||
y += text->cursor.y;
|
y += text->cursor.y + the_locking_inset->InsetInInsetY();
|
||||||
if (pimpl_->screen->FitManualCursor(x, y, asc, desc))
|
if (pimpl_->screen->FitManualCursor(x, y, asc, desc))
|
||||||
updateScrollbar();
|
updateScrollbar();
|
||||||
}
|
}
|
||||||
|
@ -551,6 +551,10 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state)
|
|||||||
{
|
{
|
||||||
if (buffer_ == 0 || !screen) return;
|
if (buffer_ == 0 || !screen) return;
|
||||||
|
|
||||||
|
// Only use motion with button 1
|
||||||
|
if (!state & Button1MotionMask)
|
||||||
|
return;
|
||||||
|
|
||||||
// Check for inset locking
|
// Check for inset locking
|
||||||
if (bv_->the_locking_inset) {
|
if (bv_->the_locking_inset) {
|
||||||
LyXCursor cursor = bv_->text->cursor;
|
LyXCursor cursor = bv_->text->cursor;
|
||||||
@ -561,10 +565,6 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state)
|
|||||||
state);
|
state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only use motion with button 1
|
|
||||||
if (!state & Button1MotionMask)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* The selection possible is needed, that only motion events are
|
/* The selection possible is needed, that only motion events are
|
||||||
* used, where the bottom press event was on the drawing area too */
|
* used, where the bottom press event was on the drawing area too */
|
||||||
@ -849,6 +849,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, unsigned int button)
|
|||||||
UpdatableInset *inset = (UpdatableInset *)inset_hit;
|
UpdatableInset *inset = (UpdatableInset *)inset_hit;
|
||||||
inset->InsetButtonRelease(bv_, x, y, button);
|
inset->InsetButtonRelease(bv_, x, y, button);
|
||||||
} else {
|
} else {
|
||||||
|
inset_hit->InsetButtonRelease(bv_, x, y, button);
|
||||||
inset_hit->Edit(bv_, x, y, button);
|
inset_hit->Edit(bv_, x, y, button);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -938,7 +939,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, unsigned int button)
|
|||||||
* If hit, the coordinates are changed relative to the inset.
|
* If hit, the coordinates are changed relative to the inset.
|
||||||
* Otherwise coordinates are not changed, and false is returned.
|
* Otherwise coordinates are not changed, and false is returned.
|
||||||
*/
|
*/
|
||||||
Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, unsigned int button)
|
Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, unsigned int /* button */)
|
||||||
{
|
{
|
||||||
if (!screen)
|
if (!screen)
|
||||||
return 0;
|
return 0;
|
||||||
@ -947,12 +948,8 @@ Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, unsigned int button)
|
|||||||
|
|
||||||
LyXCursor cursor;
|
LyXCursor cursor;
|
||||||
bv_->text->SetCursorFromCoordinates(cursor, x, y_tmp);
|
bv_->text->SetCursorFromCoordinates(cursor, x, y_tmp);
|
||||||
#if 1
|
|
||||||
bool move_cursor = true;
|
|
||||||
#else
|
|
||||||
bool move_cursor = ((cursor.par != bv_->text->cursor.par) ||
|
bool move_cursor = ((cursor.par != bv_->text->cursor.par) ||
|
||||||
(cursor.pos != bv_->text->cursor.pos)) && (button < 2);
|
(cursor.pos != bv_->text->cursor.pos));
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cursor.pos < cursor.par->Last()
|
if (cursor.pos < cursor.par->Last()
|
||||||
&& cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
|
&& cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
|
||||||
@ -976,8 +973,8 @@ Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, unsigned int button)
|
|||||||
if (x > start_x && x < end_x
|
if (x > start_x && x < end_x
|
||||||
&& y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font)
|
&& y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font)
|
||||||
&& y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) {
|
&& y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) {
|
||||||
if (move_cursor)
|
if (move_cursor && (tmpinset != bv_->the_locking_inset))
|
||||||
bv_->text->SetCursorFromCoordinates(x, y_tmp);
|
bv_->text->SetCursor(cursor.par,cursor.pos,true);
|
||||||
x = x - start_x;
|
x = x - start_x;
|
||||||
// The origin of an inset is on the baseline
|
// The origin of an inset is on the baseline
|
||||||
y = y_tmp - (bv_->text->cursor.y);
|
y = y_tmp - (bv_->text->cursor.y);
|
||||||
@ -1004,8 +1001,8 @@ Inset * BufferView::Pimpl::checkInsetHit(int & x, int & y, unsigned int button)
|
|||||||
if (x > start_x && x < end_x
|
if (x > start_x && x < end_x
|
||||||
&& y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font)
|
&& y_tmp > cursor.y - tmpinset->ascent(bv_->painter(), font)
|
||||||
&& y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) {
|
&& y_tmp < cursor.y + tmpinset->descent(bv_->painter(), font)) {
|
||||||
if (move_cursor)
|
if (move_cursor && (tmpinset != bv_->the_locking_inset))
|
||||||
bv_->text->SetCursorFromCoordinates(x, y_tmp);
|
bv_->text->SetCursor(cursor.par,cursor.pos,true);
|
||||||
x = x - start_x;
|
x = x - start_x;
|
||||||
// The origin of an inset is on the baseline
|
// The origin of an inset is on the baseline
|
||||||
y = y_tmp - (bv_->text->cursor.y);
|
y = y_tmp - (bv_->text->cursor.y);
|
||||||
|
@ -32,7 +32,7 @@ using std::pair;
|
|||||||
// easy to implement. (Lgb)
|
// easy to implement. (Lgb)
|
||||||
|
|
||||||
static LyXParagraph * buf = 0;
|
static LyXParagraph * buf = 0;
|
||||||
static LyXTextClassList::size_type textclass;
|
static LyXTextClassList::size_type textclass = 0;
|
||||||
|
|
||||||
// for now here this should be in another Cut&Paste Class!
|
// for now here this should be in another Cut&Paste Class!
|
||||||
// Jürgen, I moved this out of CutAndPaste since it does not operate on any
|
// Jürgen, I moved this out of CutAndPaste since it does not operate on any
|
||||||
|
@ -340,6 +340,8 @@ void LyXAction::init()
|
|||||||
{ LFUN_TAB, "tab-forward", "", Noop },
|
{ LFUN_TAB, "tab-forward", "", Noop },
|
||||||
{ LFUN_TABINSERT, "tab-insert", "", Noop },
|
{ LFUN_TABINSERT, "tab-insert", "", Noop },
|
||||||
{ LFUN_TABLE, "table-insert", N_("Insert Table"), Noop },
|
{ LFUN_TABLE, "table-insert", N_("Insert Table"), Noop },
|
||||||
|
{ LFUN_INSET_TABULAR, "tabular-inset-insert",
|
||||||
|
N_("Insert a new Tabular Inset"), Noop },
|
||||||
{ LFUN_TEX, "tex-mode", N_("Toggle TeX style"), Noop },
|
{ LFUN_TEX, "tex-mode", N_("Toggle TeX style"), Noop },
|
||||||
{ LFUN_INSET_TEXT, "text-inset-insert",
|
{ LFUN_INSET_TEXT, "text-inset-insert",
|
||||||
N_("Insert a new Text Inset"), Noop },
|
N_("Insert a new Text Inset"), Noop },
|
||||||
|
@ -244,8 +244,9 @@ enum kb_action {
|
|||||||
LFUN_INSET_ERT, // Jug 20000218
|
LFUN_INSET_ERT, // Jug 20000218
|
||||||
LFUN_INSERT_GRAPHICS, // Lgb 20000226
|
LFUN_INSERT_GRAPHICS, // Lgb 20000226
|
||||||
LFUN_INSET_FOOTNOTE, // Jug 20000307
|
LFUN_INSET_FOOTNOTE, // Jug 20000307
|
||||||
LFUN_INSET_NUMBER, // Dekel 20000402
|
LFUN_INSET_NUMBER, // Dekel 20000402
|
||||||
LFUN_PARAGRAPH_SPACING, // Lgb 20000411
|
LFUN_PARAGRAPH_SPACING, // Lgb 20000411
|
||||||
|
LFUN_INSET_TABULAR, // Jug 20000412
|
||||||
LFUN_LASTACTION /* this marks the end of the table */
|
LFUN_LASTACTION /* this marks the end of the table */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ static error_item errorTags[] = {
|
|||||||
{ Debug::ROFF, "roff", "Keep *roff temporary files"},
|
{ Debug::ROFF, "roff", "Keep *roff temporary files"},
|
||||||
{ Debug::ACTION, "action", "User commands"},
|
{ Debug::ACTION, "action", "User commands"},
|
||||||
{ Debug::LYXLEX, "lyxlex", "The LyX Lexxer"},
|
{ Debug::LYXLEX, "lyxlex", "The LyX Lexxer"},
|
||||||
|
{ Debug::INSETS, "insets", "LyX Insets"},
|
||||||
{ Debug::NONE, "none", "No debugging message"},
|
{ Debug::NONE, "none", "No debugging message"},
|
||||||
{ Debug::ANY, "any", "All debugging messages"}
|
{ Debug::ANY, "any", "All debugging messages"}
|
||||||
};
|
};
|
||||||
|
@ -50,14 +50,16 @@ struct Debug {
|
|||||||
///
|
///
|
||||||
LYXLEX = (1 << 15),
|
LYXLEX = (1 << 15),
|
||||||
///
|
///
|
||||||
DEPEND = (1 << 16)
|
DEPEND = (1 << 16),
|
||||||
|
///
|
||||||
|
INSETS = (1 << 17)
|
||||||
};
|
};
|
||||||
///
|
///
|
||||||
static const type ANY = type(INFO | INIT | KEY | TOOLBAR |
|
static const type ANY = type(INFO | INIT | KEY | TOOLBAR |
|
||||||
PARSER | LYXRC | KBMAP | LATEX |
|
PARSER | LYXRC | KBMAP | LATEX |
|
||||||
MATHED | FONT | TCLASS | LYXVC |
|
MATHED | FONT | TCLASS | LYXVC |
|
||||||
LYXSERVER | ROFF | ACTION | LYXLEX |
|
LYXSERVER | ROFF | ACTION | LYXLEX |
|
||||||
DEPEND);
|
DEPEND | INSETS);
|
||||||
///
|
///
|
||||||
friend inline void operator|=(Debug::type & d1, Debug::type d2);
|
friend inline void operator|=(Debug::type & d1, Debug::type d2);
|
||||||
|
|
||||||
|
@ -52,6 +52,8 @@ libinsets_la_SOURCES = \
|
|||||||
insetref.h \
|
insetref.h \
|
||||||
insetspecialchar.C \
|
insetspecialchar.C \
|
||||||
insetspecialchar.h \
|
insetspecialchar.h \
|
||||||
|
insettabular.C \
|
||||||
|
insettabular.h \
|
||||||
insettext.C \
|
insettext.C \
|
||||||
insettext.h \
|
insettext.h \
|
||||||
insettoc.C \
|
insettoc.C \
|
||||||
|
@ -122,6 +122,14 @@ void UpdatableInset::ToggleInsetCursor(BufferView *)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdatableInset::ShowInsetCursor(BufferView *)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdatableInset::HideInsetCursor(BufferView *)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void UpdatableInset::Edit(BufferView * bv, int, int, unsigned int)
|
void UpdatableInset::Edit(BufferView * bv, int, int, unsigned int)
|
||||||
{
|
{
|
||||||
@ -170,10 +178,9 @@ UpdatableInset::LocalDispatch(BufferView *, int, string const &)
|
|||||||
return UNDISPATCHED;
|
return UNDISPATCHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UpdatableInset::getMaxWidth(Painter & pain) const
|
int UpdatableInset::getMaxWidth(Painter & pain, UpdatableInset const *inset) const
|
||||||
{
|
{
|
||||||
if (owner_)
|
if (owner())
|
||||||
return owner_->getMaxWidth(pain);
|
return static_cast<UpdatableInset*>(owner())->getMaxWidth(pain, inset);
|
||||||
return pain.paperWidth();
|
return pain.paperWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,11 +25,12 @@ InsetCollapsable::InsetCollapsable(Buffer * bf)
|
|||||||
{
|
{
|
||||||
collapsed = true;
|
collapsed = true;
|
||||||
label = "Label";
|
label = "Label";
|
||||||
autocolapse = true;
|
autocollapse = true;
|
||||||
autoBreakRows = true;
|
autoBreakRows = true;
|
||||||
framecolor = LColor::footnoteframe;
|
framecolor = LColor::footnoteframe;
|
||||||
widthOffset = 10;
|
widthOffset = 10;
|
||||||
button_x = button_top_y = button_bottom_y = top_x = -1;
|
button_length = button_top_y = button_bottom_y = 0;
|
||||||
|
setInsetName("Collapsable");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -42,6 +43,31 @@ Inset * InsetCollapsable::Clone() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InsetCollapsable::Write(ostream & os) const
|
||||||
|
{
|
||||||
|
os << getInsetName() << "\n\ncollapsed ";
|
||||||
|
if (display())
|
||||||
|
os << "false\n";
|
||||||
|
else
|
||||||
|
os << "true\n";
|
||||||
|
WriteParagraphData(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetCollapsable::Read(LyXLex & lex)
|
||||||
|
{
|
||||||
|
if (lex.IsOK()) {
|
||||||
|
lex.next();
|
||||||
|
string token = lex.GetString();
|
||||||
|
if (token == "collapsed") {
|
||||||
|
lex.next();
|
||||||
|
collapsed = lex.GetBool();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InsetText::Read(lex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const
|
int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const
|
||||||
{
|
{
|
||||||
int width = 0, ascent = 0, descent = 0;
|
int width = 0, ascent = 0, descent = 0;
|
||||||
@ -92,7 +118,7 @@ int InsetCollapsable::width(Painter & pain, LyXFont const & font) const
|
|||||||
if (collapsed)
|
if (collapsed)
|
||||||
return width_collapsed(pain, font);
|
return width_collapsed(pain, font);
|
||||||
|
|
||||||
return getMaxWidth(pain) - widthOffset + 2;
|
return getMaxWidth(pain, this) - widthOffset + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -109,41 +135,39 @@ void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &,
|
|||||||
void InsetCollapsable::draw(Painter & pain, LyXFont const & f,
|
void InsetCollapsable::draw(Painter & pain, LyXFont const & f,
|
||||||
int baseline, float & x) const
|
int baseline, float & x) const
|
||||||
{
|
{
|
||||||
|
button_length = width_collapsed(pain, labelfont) + 2;
|
||||||
|
button_top_y = -ascent_collapsed(pain, f);
|
||||||
|
button_bottom_y = descent_collapsed(pain, f);
|
||||||
if (collapsed) {
|
if (collapsed) {
|
||||||
draw_collapsed(pain, f, baseline, x);
|
draw_collapsed(pain, f, baseline, x);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
top_x = int(x);
|
|
||||||
top_baseline = baseline;
|
|
||||||
draw_collapsed(pain, f, baseline, x);
|
|
||||||
button_x = int(x);
|
|
||||||
button_top_y = -ascent_collapsed(pain, f);
|
|
||||||
button_bottom_y = descent_collapsed(pain, f);
|
|
||||||
|
|
||||||
maxWidth = getMaxWidth(pain) - button_x;
|
|
||||||
x += 2;
|
|
||||||
int
|
int
|
||||||
w = maxWidth - widthOffset,
|
top_x = int(x);
|
||||||
h = ascent(pain,f) + descent(pain,f);
|
|
||||||
|
draw_collapsed(pain, f, baseline, x);
|
||||||
|
x += 2;
|
||||||
|
|
||||||
|
int w = getMaxTextWidth(pain,this);
|
||||||
|
int h = ascent(pain,f) + descent(pain,f);
|
||||||
|
|
||||||
pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor);
|
pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor);
|
||||||
|
|
||||||
x += 4;
|
x += 4;
|
||||||
top_x = int(x - top_x);
|
drawTextXOffset = int(x) - top_x;
|
||||||
InsetText::draw(pain, f, baseline, x);
|
InsetText::draw(pain, f, baseline, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetCollapsable::Edit(BufferView *bv, int x, int y, unsigned int button)
|
void InsetCollapsable::Edit(BufferView *bv, int x, int y, unsigned int button)
|
||||||
{
|
{
|
||||||
if (collapsed) {
|
if (collapsed && autocollapse) {
|
||||||
collapsed = false;
|
collapsed = false;
|
||||||
UpdateLocal(bv, true);
|
UpdateLocal(bv, true);
|
||||||
InsetText::Edit(bv, 0, 0, button);
|
InsetText::Edit(bv, 0, 0, button);
|
||||||
} else if (button && (x < button_x)) {
|
} else if (!collapsed) {
|
||||||
return;
|
InsetText::Edit(bv, x, y, button);
|
||||||
} else {
|
|
||||||
InsetText::Edit(bv, x-top_x, y, button);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,45 +181,69 @@ Inset::EDITABLE InsetCollapsable::Editable() const
|
|||||||
|
|
||||||
void InsetCollapsable::InsetUnlock(BufferView *bv)
|
void InsetCollapsable::InsetUnlock(BufferView *bv)
|
||||||
{
|
{
|
||||||
if (autocolapse) {
|
if (autocollapse) {
|
||||||
collapsed = true;
|
collapsed = true;
|
||||||
}
|
}
|
||||||
InsetText::InsetUnlock(bv);
|
InsetText::InsetUnlock(bv);
|
||||||
UpdateLocal(bv, true);
|
UpdateLocal(bv, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetCollapsable::UpdateLocal(BufferView * bv, bool flag)
|
void InsetCollapsable::UpdateLocal(BufferView * bv, bool flag)
|
||||||
{
|
{
|
||||||
maxWidth = getMaxWidth(bv->painter()) -
|
|
||||||
width_collapsed(bv->painter(), labelfont);
|
|
||||||
InsetText::UpdateLocal(bv, flag);
|
InsetText::UpdateLocal(bv, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button)
|
void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button)
|
||||||
{
|
{
|
||||||
if ((x >= button_x) && (y >= button_top_y)) {
|
if (!collapsed && (x >= button_length)) {
|
||||||
InsetText::InsetButtonPress(bv, x-top_x, y, button);
|
InsetText::InsetButtonPress(bv, x, y, button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int button)
|
void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int button)
|
||||||
{
|
{
|
||||||
if ((x < button_x) && (y >= button_top_y) && (y <= button_bottom_y)) {
|
if ((x >= 0) && (x < button_length) &&
|
||||||
collapsed = true;
|
(y >= button_top_y) && (y < button_bottom_y)) {
|
||||||
UpdateLocal(bv, false);
|
if (collapsed) {
|
||||||
bv->unlockInset(this);
|
collapsed = false;
|
||||||
} else if ((x >= button_x) && (y >= button_top_y)) {
|
InsetText::InsetButtonRelease(bv, 0, 0, button);
|
||||||
InsetText::InsetButtonRelease(bv, x-top_x, y, button);
|
UpdateLocal(bv, true);
|
||||||
|
} else {
|
||||||
|
collapsed = true;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
bv->unlockInset(this);
|
||||||
|
}
|
||||||
|
} else if (!collapsed && (x >= button_length) && (y >= button_top_y)) {
|
||||||
|
InsetText::InsetButtonRelease(bv, x, y, button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InsetCollapsable::InsetMotionNotify(BufferView *bv, int x, int y, int state)
|
||||||
void InsetCollapsable::InsetMotionNotify(BufferView *bv, int x, int y, int button)
|
|
||||||
{
|
{
|
||||||
if ((x >= button_x) && (y >= button_top_y)) {
|
if (x >= button_length) {
|
||||||
InsetText::InsetMotionNotify(bv, x-top_x, y, button);
|
InsetText::InsetMotionNotify(bv, x, y, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InsetCollapsable::getMaxWidth(Painter & pain, UpdatableInset const * inset) const
|
||||||
|
{
|
||||||
|
if ((this == inset) && !owner())
|
||||||
|
return pain.paperWidth();
|
||||||
|
if (this == inset)
|
||||||
|
return (static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset));
|
||||||
|
if (owner())
|
||||||
|
return (static_cast<UpdatableInset*>(owner())->getMaxWidth(pain,inset)-
|
||||||
|
width_collapsed(pain, labelfont) - 2 - widthOffset);
|
||||||
|
|
||||||
|
return pain.paperWidth()-width_collapsed(pain, labelfont)-2-widthOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
int InsetCollapsable::getMaxTextWidth(Painter & pain,
|
||||||
|
UpdatableInset const * inset, int) const
|
||||||
|
{
|
||||||
|
return getMaxWidth(pain, inset) -
|
||||||
|
width_collapsed(pain, labelfont) - widthOffset - 2;
|
||||||
|
}
|
||||||
|
@ -41,6 +41,10 @@ public:
|
|||||||
///
|
///
|
||||||
Inset * Clone() const;
|
Inset * Clone() const;
|
||||||
///
|
///
|
||||||
|
void Read(LyXLex &);
|
||||||
|
///
|
||||||
|
void Write(std::ostream &) const;
|
||||||
|
///
|
||||||
int ascent(Painter &, LyXFont const &) const;
|
int ascent(Painter &, LyXFont const &) const;
|
||||||
///
|
///
|
||||||
int descent(Painter &, LyXFont const &) const;
|
int descent(Painter &, LyXFont const &) const;
|
||||||
@ -67,7 +71,9 @@ public:
|
|||||||
///
|
///
|
||||||
void setLabelFont(LyXFont & f) { labelfont = f; }
|
void setLabelFont(LyXFont & f) { labelfont = f; }
|
||||||
///
|
///
|
||||||
void setAutoCollapse(bool f) { autocolapse = f; }
|
void setAutoCollapse(bool f) { autocollapse = f; }
|
||||||
|
///
|
||||||
|
int getMaxWidth(Painter & pain, UpdatableInset const *) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
///
|
///
|
||||||
@ -80,6 +86,8 @@ protected:
|
|||||||
void draw_collapsed(Painter & pain, const LyXFont &, int , float &) const;
|
void draw_collapsed(Painter & pain, const LyXFont &, int , float &) const;
|
||||||
///
|
///
|
||||||
void UpdateLocal(BufferView *, bool);
|
void UpdateLocal(BufferView *, bool);
|
||||||
|
///
|
||||||
|
int getMaxTextWidth(Painter & pain, UpdatableInset const *, int x=0) const;
|
||||||
|
|
||||||
///
|
///
|
||||||
bool collapsed;
|
bool collapsed;
|
||||||
@ -92,11 +100,12 @@ private:
|
|||||||
///
|
///
|
||||||
LyXFont labelfont;
|
LyXFont labelfont;
|
||||||
///
|
///
|
||||||
bool autocolapse;
|
bool autocollapse;
|
||||||
///
|
///
|
||||||
mutable int
|
mutable int
|
||||||
top_baseline, top_x,
|
button_length, button_top_y, button_bottom_y;
|
||||||
button_x, button_top_y, button_bottom_y;
|
///
|
||||||
|
int widthOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,6 +36,7 @@ InsetERT::InsetERT(Buffer * bf)
|
|||||||
labelfont.setColor(LColor::ert);
|
labelfont.setColor(LColor::ert);
|
||||||
setLabelFont(labelfont);
|
setLabelFont(labelfont);
|
||||||
setAutoCollapse(false);
|
setAutoCollapse(false);
|
||||||
|
setInsetName("ERT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -43,17 +44,12 @@ Inset * InsetERT::Clone() const
|
|||||||
{
|
{
|
||||||
InsetERT * result = new InsetERT(buffer);
|
InsetERT * result = new InsetERT(buffer);
|
||||||
result->init(buffer, this);
|
result->init(buffer, this);
|
||||||
|
|
||||||
|
result->collapsed = collapsed;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetERT::Write(ostream & os) const
|
|
||||||
{
|
|
||||||
os << "ERT\n";
|
|
||||||
WriteParagraphData(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char const * InsetERT::EditMessage() const
|
char const * InsetERT::EditMessage() const
|
||||||
{
|
{
|
||||||
return _("Opened ERT Inset");
|
return _("Opened ERT Inset");
|
||||||
|
@ -36,8 +36,6 @@ public:
|
|||||||
///
|
///
|
||||||
Inset * Clone() const;
|
Inset * Clone() const;
|
||||||
///
|
///
|
||||||
void Write(std::ostream &) const;
|
|
||||||
///
|
|
||||||
char const * EditMessage() const;
|
char const * EditMessage() const;
|
||||||
///
|
///
|
||||||
bool InsertInset(BufferView *, Inset *);
|
bool InsertInset(BufferView *, Inset *);
|
||||||
|
@ -33,6 +33,7 @@ InsetFoot::InsetFoot(Buffer * bf)
|
|||||||
font.setColor(LColor::footnote);
|
font.setColor(LColor::footnote);
|
||||||
setLabelFont(font);
|
setLabelFont(font);
|
||||||
setAutoCollapse(false);
|
setAutoCollapse(false);
|
||||||
|
setInsetName("Foot");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,41 +55,15 @@ char const * InsetFoot::EditMessage() const
|
|||||||
|
|
||||||
int InsetFoot::Latex(ostream & os, bool fragile, bool fp) const
|
int InsetFoot::Latex(ostream & os, bool fragile, bool fp) const
|
||||||
{
|
{
|
||||||
if (fragile)
|
if (fragile)
|
||||||
os << "\\footnote{"; // was footnotemark but that won't work
|
os << "\\footnote{"; // was footnotemark but that won't work
|
||||||
else
|
else
|
||||||
os << "\\footnote{";
|
os << "\\footnote{";
|
||||||
|
|
||||||
int i = InsetText::Latex(os, fragile, fp);
|
int i = InsetText::Latex(os, fragile, fp);
|
||||||
os << "}";
|
os << "}";
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InsetFoot::Write(ostream & os) const
|
|
||||||
{
|
|
||||||
os << "Foot\n"
|
|
||||||
<< "\ncollapsed ";
|
|
||||||
if (display())
|
|
||||||
os << "false\n";
|
|
||||||
else
|
|
||||||
os << "true\n";
|
|
||||||
WriteParagraphData(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InsetFoot::Read(LyXLex & lex)
|
|
||||||
{
|
|
||||||
if (lex.IsOK()) {
|
|
||||||
lex.next();
|
|
||||||
string token = lex.GetString();
|
|
||||||
if (token == "collapsed") {
|
|
||||||
lex.next();
|
|
||||||
collapsed = lex.GetBool();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
InsetText::Read(lex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,10 +39,6 @@ public:
|
|||||||
///
|
///
|
||||||
int Latex(std::ostream &, bool fragile, bool fp) const;
|
int Latex(std::ostream &, bool fragile, bool fp) const;
|
||||||
///
|
///
|
||||||
void Write(std::ostream &) const;
|
|
||||||
///
|
|
||||||
void Read(LyXLex &);
|
|
||||||
///
|
|
||||||
const char * EditMessage() const;
|
const char * EditMessage() const;
|
||||||
///
|
///
|
||||||
bool InsertInset(BufferView *, Inset * inset);
|
bool InsertInset(BufferView *, Inset * inset);
|
||||||
|
964
src/insets/insettabular.C
Normal file
964
src/insets/insettabular.C
Normal file
@ -0,0 +1,964 @@
|
|||||||
|
/* This file is part of
|
||||||
|
* ======================================================
|
||||||
|
*
|
||||||
|
* LyX, The Document Processor
|
||||||
|
*
|
||||||
|
* Copyright (C) 2000 The LyX Team.
|
||||||
|
*
|
||||||
|
*======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "insettabular.h"
|
||||||
|
|
||||||
|
#include "buffer.h"
|
||||||
|
#include "commandtags.h"
|
||||||
|
#include "LaTeXFeatures.h"
|
||||||
|
#include "Painter.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "insets/insettext.h"
|
||||||
|
|
||||||
|
const int ADD_TO_HEIGHT = 2;
|
||||||
|
const int ADD_TO_TABLE_WIDTH = 2;
|
||||||
|
|
||||||
|
using std::ostream;
|
||||||
|
using std::ifstream;
|
||||||
|
|
||||||
|
InsetTabular::InsetTabular(Buffer * buf, int rows=1, int columns=1)
|
||||||
|
{
|
||||||
|
if (rows <= 0)
|
||||||
|
rows = 1;
|
||||||
|
if (columns <= 0)
|
||||||
|
columns = 1;
|
||||||
|
tabular = new LyXTable(rows,columns,buf);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
buffer = buf;
|
||||||
|
cursor_visible = false;
|
||||||
|
old_x = -1;
|
||||||
|
sel_pos_start = sel_pos_end = 0;
|
||||||
|
no_selection = false;
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
InsetTabular::InsetTabular(InsetTabular const & tab, Buffer * buf)
|
||||||
|
{
|
||||||
|
tabular = new LyXTable(*(tab.tabular), buf);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
buffer = buf;
|
||||||
|
cursor_visible = false;
|
||||||
|
old_x = -1;
|
||||||
|
sel_pos_start = sel_pos_end = 0;
|
||||||
|
no_selection = false;
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
InsetTabular::~InsetTabular()
|
||||||
|
{
|
||||||
|
if (tabular)
|
||||||
|
delete tabular;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
InsetTabular * InsetTabular::Clone() const
|
||||||
|
{
|
||||||
|
InsetTabular * t = new InsetTabular(*this, buffer);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::Write(ostream & os) const
|
||||||
|
{
|
||||||
|
os << "\\begin_inset Tabular\n";
|
||||||
|
tabular->Write(os,false);
|
||||||
|
os << "\\end_inset\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::Read(LyXLex & lex)
|
||||||
|
{
|
||||||
|
if (tabular)
|
||||||
|
delete tabular;
|
||||||
|
|
||||||
|
// bool old_format = (lex.GetString() == "\\LyXTable");
|
||||||
|
tabular = new LyXTable(lex, buffer);
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int InsetTabular::ascent(Painter & pain, LyXFont const & font) const
|
||||||
|
{
|
||||||
|
if (init) {
|
||||||
|
calculate_width_of_cells(pain, font);
|
||||||
|
init = false;
|
||||||
|
}
|
||||||
|
return tabular->AscentOfRow(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int InsetTabular::descent(Painter & pain, LyXFont const & font) const
|
||||||
|
{
|
||||||
|
if (init) {
|
||||||
|
calculate_width_of_cells(pain, font);
|
||||||
|
init = false;
|
||||||
|
}
|
||||||
|
return tabular->HeightOfTable() - tabular->AscentOfRow(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int InsetTabular::width(Painter & pain, LyXFont const & font) const
|
||||||
|
{
|
||||||
|
if (init) {
|
||||||
|
calculate_width_of_cells(pain, font);
|
||||||
|
init = false;
|
||||||
|
}
|
||||||
|
return tabular->WidthOfTable() + (2 * ADD_TO_TABLE_WIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::draw(Painter & pain, const LyXFont & font, int,
|
||||||
|
float &) const
|
||||||
|
{
|
||||||
|
calculate_width_of_cells(pain, font);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char * InsetTabular::EditMessage() const
|
||||||
|
{
|
||||||
|
return _("Opened Tabular Inset");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::Edit(BufferView * bv, int x, int y, unsigned int button)
|
||||||
|
{
|
||||||
|
UpdatableInset::Edit(bv, x, y, button);
|
||||||
|
|
||||||
|
bv->lockInset(this);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
inset_pos = inset_x = inset_y = 0;
|
||||||
|
no_selection = true;
|
||||||
|
setPos(x,y);
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
sel_cell_start = sel_cell_end = actcell;
|
||||||
|
// bv->getOwner()->getPopups().updateFormTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::InsetUnlock(BufferView * bv)
|
||||||
|
{
|
||||||
|
if (the_locking_inset)
|
||||||
|
the_locking_inset->InsetUnlock(bv);
|
||||||
|
HideInsetCursor(bv);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
} else
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
no_selection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::LockInsetInInset(UpdatableInset *)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool InsetTabular::UnlockInsetInInset(BufferView * bv, UpdatableInset * inset,
|
||||||
|
bool lr)
|
||||||
|
{
|
||||||
|
if (!the_locking_inset)
|
||||||
|
return false;
|
||||||
|
if (the_locking_inset == inset) {
|
||||||
|
the_locking_inset->InsetUnlock(bv);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
if (lr)
|
||||||
|
moveRight(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return the_locking_inset->UnlockInsetInInset(bv, inset, lr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::UpdateLocal(BufferView * bv, bool flag)
|
||||||
|
{
|
||||||
|
resetPos();
|
||||||
|
bv->updateInset(this, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::UpdateInsetInInset(BufferView * bv, Inset * inset)
|
||||||
|
{
|
||||||
|
if (!the_locking_inset)
|
||||||
|
return false;
|
||||||
|
if (the_locking_inset != inset)
|
||||||
|
return the_locking_inset->UpdateInsetInInset(bv, inset);
|
||||||
|
UpdateLocal(bv);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::InsetButtonRelease(BufferView *bv, int x, int y, int button)
|
||||||
|
{
|
||||||
|
if (the_locking_inset) {
|
||||||
|
the_locking_inset->InsetButtonRelease(bv, x-inset_x,y-inset_y,button);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
no_selection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::InsetButtonPress(BufferView *bv, int x, int y, int)
|
||||||
|
{
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = 0;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
}
|
||||||
|
no_selection = false;
|
||||||
|
setPos(x,y,false);
|
||||||
|
if (the_locking_inset) {
|
||||||
|
#if 0
|
||||||
|
UpdatableInset
|
||||||
|
* inset=0;
|
||||||
|
if (par->GetChar(actpos)==LYX_META_INSET)
|
||||||
|
inset=(UpdatableInset*)par->GetInset(actpos);
|
||||||
|
if (the_locking_inset == inset) {
|
||||||
|
the_locking_inset->InsetButtonPress(bv,x-inset_x,y-inset_y,button);
|
||||||
|
return;
|
||||||
|
} else if (inset) {
|
||||||
|
// otherwise unlock the_locking_inset and lock the new inset
|
||||||
|
inset_x = cx-top_x;
|
||||||
|
inset_y = cy;
|
||||||
|
inset_pos = actpos;
|
||||||
|
the_locking_inset->InsetUnlock(bv);
|
||||||
|
the_locking_inset = inset;
|
||||||
|
the_locking_inset->Edit(bv, x - inset_x, y - inset_y, button);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// otherwise only unlock the_locking_inset
|
||||||
|
the_locking_inset->InsetUnlock(bv);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
int
|
||||||
|
oldcell = actcell;
|
||||||
|
#endif
|
||||||
|
setPos(x,y);
|
||||||
|
the_locking_inset = 0;
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
sel_cell_start = sel_cell_end = actcell;
|
||||||
|
#if 0
|
||||||
|
if (button == 3)
|
||||||
|
bview->getOwner()->getPopups().showFormTable();
|
||||||
|
else if (oldcell != actcell)
|
||||||
|
bview->getOwner()->getPopups().updateFormTable();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::InsetMotionNotify(BufferView * bv, int x, int y, int button)
|
||||||
|
{
|
||||||
|
if (the_locking_inset) {
|
||||||
|
the_locking_inset->InsetMotionNotify(bv, x-inset_x,y-inset_y,button);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!no_selection) {
|
||||||
|
int
|
||||||
|
// oldcell = actcell,
|
||||||
|
old = sel_pos_end;
|
||||||
|
|
||||||
|
setPos(x,y);
|
||||||
|
sel_pos_end = actpos;
|
||||||
|
sel_cell_end = actcell;
|
||||||
|
if (old != sel_pos_end)
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
#if 0
|
||||||
|
if (oldcell != actcell)
|
||||||
|
bview->getOwner()->getPopups().updateFormTable();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
no_selection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::InsetKeyPress(XKeyEvent * xke)
|
||||||
|
{
|
||||||
|
if (the_locking_inset) {
|
||||||
|
the_locking_inset->InsetKeyPress(xke);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView *bv, int action,
|
||||||
|
string const & arg)
|
||||||
|
{
|
||||||
|
no_selection = false;
|
||||||
|
if (UpdatableInset::LocalDispatch(bv, action, arg)) {
|
||||||
|
resetPos();
|
||||||
|
return DISPATCHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatableInset::RESULT
|
||||||
|
result=DISPATCHED;
|
||||||
|
if ((action < 0) && arg.empty())
|
||||||
|
return FINISHED;
|
||||||
|
|
||||||
|
if ((action != LFUN_DOWN) && (action != LFUN_UP) &&
|
||||||
|
(action != LFUN_DOWNSEL) && (action != LFUN_UPSEL))
|
||||||
|
old_x = -1;
|
||||||
|
if (the_locking_inset) {
|
||||||
|
result=the_locking_inset->LocalDispatch(bv, action, arg);
|
||||||
|
if (result == DISPATCHED) {
|
||||||
|
setWidthOfCell(actpos,actcell,actrow);
|
||||||
|
the_locking_inset->ToggleInsetCursor(bv);
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
the_locking_inset->ToggleInsetCursor(bv);
|
||||||
|
return result;
|
||||||
|
} else if (result == FINISHED) {
|
||||||
|
if ((action == LFUN_RIGHT) || (action == -1)) {
|
||||||
|
actpos = inset_pos + 1;
|
||||||
|
resetPos();
|
||||||
|
}
|
||||||
|
the_locking_inset=0;
|
||||||
|
result = DISPATCHED;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HideInsetCursor(bv);
|
||||||
|
switch (action) {
|
||||||
|
// Normal chars not handled here
|
||||||
|
case -1:
|
||||||
|
break;
|
||||||
|
// --- Cursor Movements ---------------------------------------------
|
||||||
|
case LFUN_RIGHTSEL:
|
||||||
|
moveRight(false);
|
||||||
|
sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
break;
|
||||||
|
case LFUN_RIGHT:
|
||||||
|
result= DISPATCH_RESULT(moveRight());
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
} else
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
break;
|
||||||
|
case LFUN_LEFTSEL:
|
||||||
|
moveLeft(false);
|
||||||
|
sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
break;
|
||||||
|
case LFUN_LEFT:
|
||||||
|
result= DISPATCH_RESULT(moveLeft());
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
} else
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
break;
|
||||||
|
case LFUN_DOWNSEL:
|
||||||
|
moveDown(false);
|
||||||
|
sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
break;
|
||||||
|
case LFUN_DOWN:
|
||||||
|
result= DISPATCH_RESULT(moveDown());
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
} else
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
break;
|
||||||
|
case LFUN_UPSEL:
|
||||||
|
moveUp(false);
|
||||||
|
sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
break;
|
||||||
|
case LFUN_UP:
|
||||||
|
result= DISPATCH_RESULT(moveUp());
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
} else
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
break;
|
||||||
|
case LFUN_BACKSPACE:
|
||||||
|
break;
|
||||||
|
case LFUN_DELETE:
|
||||||
|
break;
|
||||||
|
case LFUN_HOME:
|
||||||
|
break;
|
||||||
|
case LFUN_END:
|
||||||
|
break;
|
||||||
|
case LFUN_TAB:
|
||||||
|
if (hasCharSelection()) {
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
UpdateLocal(bv, false);
|
||||||
|
}
|
||||||
|
sel_pos_start = sel_pos_end = actpos;
|
||||||
|
moveNextCell();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result = UNDISPATCHED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (result!=FINISHED) {
|
||||||
|
if (!the_locking_inset) {
|
||||||
|
#if 0
|
||||||
|
if (oldcell != actcell)
|
||||||
|
bview->getOwner()->getPopups().updateFormTable();
|
||||||
|
#endif
|
||||||
|
ShowInsetCursor(bv);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
bv->unlockInset(this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int InsetTabular::Latex(ostream & os, bool, bool) const
|
||||||
|
{
|
||||||
|
return tabular->Latex(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
int InsetTabular::Linuxdoc(ostream &) const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int InsetTabular::DocBook(ostream &) const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::Validate(LaTeXFeatures & features) const
|
||||||
|
{
|
||||||
|
if (tabular->IsLongTable())
|
||||||
|
features.longtable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::calculate_width_of_cells(Painter & pain, LyXFont const & font) const
|
||||||
|
{
|
||||||
|
int
|
||||||
|
cell=-1,
|
||||||
|
i,j,
|
||||||
|
maxAsc, maxDesc;
|
||||||
|
InsetText
|
||||||
|
*inset;
|
||||||
|
|
||||||
|
for(i=0; i < tabular->rows; ++i) {
|
||||||
|
maxAsc = maxDesc = 0;
|
||||||
|
for(j=0; j < tabular->columns; ++j) {
|
||||||
|
if (tabular->IsPartOfMultiColumn(i,j))
|
||||||
|
continue;
|
||||||
|
++cell;
|
||||||
|
inset = tabular->GetCellInset(cell);
|
||||||
|
maxAsc = max(maxAsc, inset->ascent(pain, font));
|
||||||
|
maxDesc = max(maxDesc, inset->descent(pain, font));
|
||||||
|
tabular->SetWidthOfCell(cell, inset->width(pain, font));
|
||||||
|
}
|
||||||
|
tabular->SetAscentOfRow(i,maxAsc+ADD_TO_HEIGHT);
|
||||||
|
tabular->SetDescentOfRow(i,maxDesc+ADD_TO_HEIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::DrawCellLines(Painter & pain, int x, int baseline,
|
||||||
|
int row, int cell)
|
||||||
|
{
|
||||||
|
// Juergen, have you thought about drawing the on-off lines in a
|
||||||
|
// different color (gray of some kind), especially since those
|
||||||
|
// lines will not be there on the hardcopy anyway. (Lgb)
|
||||||
|
int
|
||||||
|
x_old = x;
|
||||||
|
bool
|
||||||
|
on_off;
|
||||||
|
|
||||||
|
x_old -= tabular->WidthOfColumn(cell);
|
||||||
|
on_off = !tabular->TopLine(cell);
|
||||||
|
if ((!on_off || !tabular->TopAlreadyDrawed(cell)) &&
|
||||||
|
!tabular->IsContRow(cell))
|
||||||
|
pain.line(x_old, baseline - tabular->AscentOfRow(row),
|
||||||
|
x, baseline - tabular->AscentOfRow(row),
|
||||||
|
LColor::tableline,
|
||||||
|
on_off ? Painter::line_onoffdash:Painter::line_solid);
|
||||||
|
on_off = !tabular->BottomLine(cell);
|
||||||
|
if ((!on_off && !tabular->RowHasContRow(cell)) ||
|
||||||
|
tabular->VeryLastRow(cell))
|
||||||
|
pain.line(x_old ,baseline + tabular->DescentOfRow(row),
|
||||||
|
x, baseline + tabular->DescentOfRow(row),
|
||||||
|
LColor::tableline,
|
||||||
|
on_off ? Painter::line_onoffdash:Painter::line_solid);
|
||||||
|
on_off = !tabular->LeftLine(cell);
|
||||||
|
pain.line(x_old, baseline - tabular->AscentOfRow(row),
|
||||||
|
x_old, baseline + tabular->DescentOfRow(row),
|
||||||
|
LColor::tableline,
|
||||||
|
on_off ? Painter::line_onoffdash:Painter::line_solid);
|
||||||
|
on_off = !tabular->RightLine(cell);
|
||||||
|
pain.line(x - tabular->AdditionalWidth(cell),
|
||||||
|
baseline - tabular->AscentOfRow(row),
|
||||||
|
x - tabular->AdditionalWidth(cell),
|
||||||
|
baseline + tabular->DescentOfRow(row),
|
||||||
|
LColor::tableline,
|
||||||
|
on_off ? Painter::line_onoffdash:Painter::line_solid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::GetCursorPos(int & x, int & y)
|
||||||
|
{
|
||||||
|
x = cx-top_x;
|
||||||
|
y = cy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::ToggleInsetCursor(BufferView * bv)
|
||||||
|
{
|
||||||
|
if (the_locking_inset) {
|
||||||
|
the_locking_inset->ToggleInsetCursor(bv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int
|
||||||
|
x=0,y=0,
|
||||||
|
asc,desc;
|
||||||
|
|
||||||
|
LyXFont
|
||||||
|
font; // = the_locking_inset->GetFont(par, actpos);
|
||||||
|
|
||||||
|
asc = lyxfont::maxAscent(font);
|
||||||
|
desc = lyxfont::maxDescent(font);
|
||||||
|
|
||||||
|
if (cursor_visible)
|
||||||
|
bv->hideLockedInsetCursor();
|
||||||
|
else
|
||||||
|
bv->showLockedInsetCursor(cx+x, cy+y, asc, desc);
|
||||||
|
cursor_visible = !cursor_visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::ShowInsetCursor(BufferView * bv)
|
||||||
|
{
|
||||||
|
if (!cursor_visible) {
|
||||||
|
int
|
||||||
|
asc,desc;
|
||||||
|
LyXFont
|
||||||
|
font; // = GetFont(par, actpos);
|
||||||
|
|
||||||
|
asc = lyxfont::maxAscent(font);
|
||||||
|
desc = lyxfont::maxDescent(font);
|
||||||
|
bv->fitLockedInsetCursor(cx, cy, asc, desc);
|
||||||
|
bv->showLockedInsetCursor(cx, cy, asc, desc);
|
||||||
|
cursor_visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::HideInsetCursor(BufferView * bv)
|
||||||
|
{
|
||||||
|
if (cursor_visible)
|
||||||
|
ToggleInsetCursor(bv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void InsetTabular::setPos(int, int, bool)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::setWidthOfCell(int, int, int)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::moveRight(bool)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::moveLeft(bool)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::moveUp(bool)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::moveDown(bool)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::moveNextCell()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::movePrevCell()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::resetPos()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsetTabular::Delete()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::SetFont(LyXFont const &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::TableFeatures(int, string)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int
|
||||||
|
i,
|
||||||
|
selection_start,
|
||||||
|
selection_end,
|
||||||
|
setLines = 0,
|
||||||
|
setAlign = LYX_ALIGN_LEFT,
|
||||||
|
lineSet;
|
||||||
|
bool
|
||||||
|
what;
|
||||||
|
|
||||||
|
switch (feature) {
|
||||||
|
case LyXTable::ALIGN_LEFT:
|
||||||
|
setAlign=LYX_ALIGN_LEFT;
|
||||||
|
break;
|
||||||
|
case LyXTable::ALIGN_RIGHT:
|
||||||
|
setAlign=LYX_ALIGN_RIGHT;
|
||||||
|
break;
|
||||||
|
case LyXTable::ALIGN_CENTER:
|
||||||
|
setAlign=LYX_ALIGN_CENTER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (hasCellSelection()) {
|
||||||
|
if (sel_cell_start > sel_cell_end) {
|
||||||
|
selection_start = sel_cell_end;
|
||||||
|
selection_end = sel_cell_start;
|
||||||
|
} else {
|
||||||
|
selection_start = sel_cell_start;
|
||||||
|
selection_end = sel_cell_end;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
selection_start = selection_end = actcell;
|
||||||
|
switch (feature) {
|
||||||
|
case LyXTable::SET_PWIDTH:
|
||||||
|
tabular->SetPWidth(actcell,val);
|
||||||
|
break;
|
||||||
|
case LyXTable::SET_SPECIAL_COLUMN:
|
||||||
|
case LyXTable::SET_SPECIAL_MULTI:
|
||||||
|
tabular->SetAlignSpecial(actcell,val,feature);
|
||||||
|
break;
|
||||||
|
case LyXTable::APPEND_ROW:
|
||||||
|
{
|
||||||
|
int
|
||||||
|
pos = actpos,
|
||||||
|
cell_org = actcell,
|
||||||
|
cell = actcell;
|
||||||
|
|
||||||
|
// if there is a ContRow following this row I have to add
|
||||||
|
// the row after the ContRow's
|
||||||
|
if ((pos < par->last()) && tabular->RowHasContRow(cell_org)) {
|
||||||
|
while((pos < par->last()) && !tabular->IsContRow(cell)) {
|
||||||
|
while (pos < par->last() && !par->IsNewline(pos))
|
||||||
|
++pos;
|
||||||
|
if (pos < par->last())
|
||||||
|
++pos;
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
while((pos < par->last()) && tabular->IsContRow(cell)) {
|
||||||
|
while (pos < par->last() && !par->IsNewline(pos))
|
||||||
|
++pos;
|
||||||
|
if (pos < par->last())
|
||||||
|
++pos;
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
cell_org = --cell;
|
||||||
|
if (pos < par->last())
|
||||||
|
--pos;
|
||||||
|
}
|
||||||
|
while ((pos < par->last()) &&
|
||||||
|
((cell == cell_org) || !tabular->IsFirstCell(cell))) {
|
||||||
|
while ((pos < par->last()) && !par->IsNewline(pos))
|
||||||
|
++pos;
|
||||||
|
if (pos < par->last())
|
||||||
|
++pos;
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
// insert the new cells
|
||||||
|
int number = tabular->NumberOfCellsInRow(cell_org);
|
||||||
|
for (i=0; i<number; ++i)
|
||||||
|
par->InsertChar(pos, LYX_META_NEWLINE);
|
||||||
|
|
||||||
|
// append the row into the table
|
||||||
|
tabular->AppendRow(cell_org);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case LyXTable::APPEND_CONT_ROW:
|
||||||
|
{
|
||||||
|
int
|
||||||
|
pos = actpos,
|
||||||
|
cell_org = actcell,
|
||||||
|
cell = actcell;
|
||||||
|
|
||||||
|
// if there is already a controw but not for this cell
|
||||||
|
// the AppendContRow sets only the right values but does
|
||||||
|
// not actually add a row
|
||||||
|
if (tabular->RowHasContRow(cell_org) &&
|
||||||
|
(tabular->CellHasContRow(cell_org) < 0)) {
|
||||||
|
tabular->AppendContRow(cell_org);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while ((pos < par->last()) &&
|
||||||
|
((cell == cell_org) || !tabular->IsFirstCell(cell))) {
|
||||||
|
while (pos < par->last() && !par->IsNewline(pos))
|
||||||
|
++pos;
|
||||||
|
if (pos < par->last())
|
||||||
|
++pos;
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
// insert the new cells
|
||||||
|
int number = tabular->NumberOfCellsInRow(cell_org);
|
||||||
|
for (i=0; i<number; ++i)
|
||||||
|
par->InsertChar(pos, LYX_META_NEWLINE);
|
||||||
|
// append the row into the table
|
||||||
|
tabular->AppendContRow(cell_org);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case LyXTable::APPEND_COLUMN:
|
||||||
|
{
|
||||||
|
int
|
||||||
|
pos = 0,
|
||||||
|
cell_org = actcell,
|
||||||
|
cell = 0;
|
||||||
|
do {
|
||||||
|
if (pos && (par->IsNewline(pos-1))) {
|
||||||
|
if (tabular->AppendCellAfterCell(cell_org, cell)) {
|
||||||
|
par->InsertChar(pos, LYX_META_NEWLINE);
|
||||||
|
if (pos <= actpos)
|
||||||
|
++actpos;
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
} while (pos <= par->last());
|
||||||
|
// remember that the very last cell doesn't end with a newline.
|
||||||
|
// This saves one byte memory per table ;-)
|
||||||
|
if (tabular->AppendCellAfterCell(cell_org, cell))
|
||||||
|
par->InsertChar(par->last(), LYX_META_NEWLINE);
|
||||||
|
// append the column into the table
|
||||||
|
tabular->AppendColumn(cell_org);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case LyXTable::DELETE_ROW:
|
||||||
|
RemoveTableRow();
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
case LyXTable::DELETE_COLUMN:
|
||||||
|
{
|
||||||
|
int pos = 0;
|
||||||
|
int cell = 0;
|
||||||
|
do {
|
||||||
|
if (!pos || (par->IsNewline(pos-1))){
|
||||||
|
if (tabular->DeleteCellIfColumnIsDeleted(cell, actcell)) {
|
||||||
|
// delete one cell
|
||||||
|
while (pos < par->last() && !par->IsNewline(pos))
|
||||||
|
par->Erase(pos);
|
||||||
|
if (pos < par->last())
|
||||||
|
par->Erase(pos);
|
||||||
|
else
|
||||||
|
par->Erase(pos - 1); // the missing newline
|
||||||
|
// at the end of a table
|
||||||
|
--pos; // because of ++pos below
|
||||||
|
}
|
||||||
|
++cell;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
} while (pos <= par->last());
|
||||||
|
/* delete the column from the table */
|
||||||
|
tabular->DeleteColumn(actcell);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case LyXTable::TOGGLE_LINE_TOP:
|
||||||
|
lineSet = !tabular->TopLine(actcell);
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetTopLine(i,lineSet);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
|
||||||
|
case LyXTable::TOGGLE_LINE_BOTTOM:
|
||||||
|
lineSet = !tabular->BottomLine(actcell);
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetBottomLine(i,lineSet);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
|
||||||
|
case LyXTable::TOGGLE_LINE_LEFT:
|
||||||
|
lineSet = !tabular->LeftLine(actcell);
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetLeftLine(i,lineSet);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
|
||||||
|
case LyXTable::TOGGLE_LINE_RIGHT:
|
||||||
|
lineSet = !tabular->RightLine(actcell);
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetRightLine(i,lineSet);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
case LyXTable::ALIGN_LEFT:
|
||||||
|
case LyXTable::ALIGN_RIGHT:
|
||||||
|
case LyXTable::ALIGN_CENTER:
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetAlignment(i,setAlign);
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
case LyXTable::MULTICOLUMN:
|
||||||
|
{
|
||||||
|
if (tabular->row_of_cell(selection_start) !=
|
||||||
|
tabular->row_of_cell(selection_end)) {
|
||||||
|
WriteAlert(_("Impossible Operation!"),
|
||||||
|
_("Multicolumns can only be horizontally."),
|
||||||
|
_("Sorry."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// just multicol for one Single Cell
|
||||||
|
if (!hasCellSelection()) {
|
||||||
|
// check wether we are completly in a multicol
|
||||||
|
if (tabular->IsMultiColumn(actcell)) {
|
||||||
|
int
|
||||||
|
newlines,
|
||||||
|
pos = actpos;
|
||||||
|
if ((newlines=tabular->UnsetMultiColumn(actcell))) {
|
||||||
|
while ((pos < par->last()) && !par->IsNewline(pos))
|
||||||
|
++pos;
|
||||||
|
for (;newlines;--newlines)
|
||||||
|
par->InsertChar(pos, LYX_META_NEWLINE);
|
||||||
|
}
|
||||||
|
calculate_width_of_cells();
|
||||||
|
} else {
|
||||||
|
tabular->SetMultiColumn(actcell, 1);
|
||||||
|
}
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// we have a selection so this means we just add all this
|
||||||
|
// cells to form a multicolumn cell
|
||||||
|
int
|
||||||
|
number = 1,
|
||||||
|
s_start, s_end;
|
||||||
|
|
||||||
|
if (sel_pos_start > sel_pos_end) {
|
||||||
|
s_start = sel_pos_end;
|
||||||
|
s_end = sel_pos_start;
|
||||||
|
} else {
|
||||||
|
s_start = sel_pos_start;
|
||||||
|
s_end = sel_pos_end;
|
||||||
|
}
|
||||||
|
for(i=s_start; i < s_end; ++i) {
|
||||||
|
if (par->IsNewline(i)) {
|
||||||
|
par->Erase(i);
|
||||||
|
// check for double-blanks
|
||||||
|
if ((i && !par->IsLineSeparator(i-1)) &&
|
||||||
|
(i < par->last()) && !par->IsLineSeparator(i))
|
||||||
|
par->InsertChar(i, ' ');
|
||||||
|
else
|
||||||
|
--i;
|
||||||
|
++number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tabular->SetMultiColumn(selection_start,number);
|
||||||
|
actpos = s_start;
|
||||||
|
sel_cell_end = sel_cell_start;
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case LyXTable::SET_ALL_LINES:
|
||||||
|
setLines = 1;
|
||||||
|
case LyXTable::UNSET_ALL_LINES:
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetAllLines(i, setLines);
|
||||||
|
calculate_width_of_cells();
|
||||||
|
UpdateLocal();
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LONGTABLE:
|
||||||
|
tabular->SetLongTable(true);
|
||||||
|
UpdateLocal(); // because this toggles displayed
|
||||||
|
return;
|
||||||
|
case LyXTable::UNSET_LONGTABLE:
|
||||||
|
tabular->SetLongTable(false);
|
||||||
|
UpdateLocal(); // because this toggles displayed
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_ROTATE_TABLE:
|
||||||
|
tabular->SetRotateTable(true);
|
||||||
|
return;
|
||||||
|
case LyXTable::UNSET_ROTATE_TABLE:
|
||||||
|
tabular->SetRotateTable(false);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_ROTATE_CELL:
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetRotateCell(i,true);
|
||||||
|
return;
|
||||||
|
case LyXTable::UNSET_ROTATE_CELL:
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetRotateCell(i,false);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LINEBREAKS:
|
||||||
|
what = !tabular->Linebreaks(tabular->FirstVirtualCell(actcell));
|
||||||
|
for(i=selection_start; i<=selection_end; ++i)
|
||||||
|
tabular->SetLinebreaks(i,what);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LTFIRSTHEAD:
|
||||||
|
tabular->SetLTHead(actcell,true);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LTHEAD:
|
||||||
|
tabular->SetLTHead(actcell,false);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LTFOOT:
|
||||||
|
tabular->SetLTFoot(actcell,false);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LTLASTFOOT:
|
||||||
|
tabular->SetLTFoot(actcell,true);
|
||||||
|
return;
|
||||||
|
case LyXTable::SET_LTNEWPAGE:
|
||||||
|
what = !tabular->LTNewPage(actcell);
|
||||||
|
tabular->SetLTNewPage(actcell,what);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void InsetTabular::RemoveTableRow()
|
||||||
|
{
|
||||||
|
}
|
188
src/insets/insettabular.h
Normal file
188
src/insets/insettabular.h
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/* This file is part of
|
||||||
|
* ======================================================
|
||||||
|
*
|
||||||
|
* LyX, The Document Processor
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-2000 The LyX Team.
|
||||||
|
*
|
||||||
|
*======================================================
|
||||||
|
*/
|
||||||
|
// This is the rewrite of the tabular (table) support.
|
||||||
|
|
||||||
|
// It will probably be a lot of work.
|
||||||
|
|
||||||
|
// One first goal could be to make the inset read the old table format
|
||||||
|
// and just output it again... no viewing at all.
|
||||||
|
|
||||||
|
// When making the internal structure of tabular support I really think
|
||||||
|
// that STL containers should be used. This will separate the container from
|
||||||
|
// the rest of the code, which is a good thing.
|
||||||
|
|
||||||
|
// Ideally the tabular support should do as the mathed and use
|
||||||
|
// LaTeX in the .lyx file too.
|
||||||
|
|
||||||
|
// Things to think of when desingning the new tabular support:
|
||||||
|
// - color support (colortbl, color)
|
||||||
|
// - decimal alignment (dcloumn)
|
||||||
|
// - custom lines (hhline)
|
||||||
|
// - rotation
|
||||||
|
// - multicolumn
|
||||||
|
// - multirow
|
||||||
|
// - column styles
|
||||||
|
|
||||||
|
// This is what I have written about tabular support in the LyX3-Tasks file:
|
||||||
|
//
|
||||||
|
// o rewrite of table code. Should probably be written as some
|
||||||
|
// kind of an inset. At least get the code out of the kernel.
|
||||||
|
// - colortbl -multirow
|
||||||
|
// - hhline -multicolumn
|
||||||
|
// - dcolumn
|
||||||
|
// o enhance longtable support
|
||||||
|
|
||||||
|
// Lgb
|
||||||
|
|
||||||
|
#ifndef INSETTABULAR_H
|
||||||
|
#define INSETTABULAR_H
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "lyxinset.h"
|
||||||
|
#include "table.h"
|
||||||
|
#include "LString.h"
|
||||||
|
|
||||||
|
class LyXLex;
|
||||||
|
class Painter;
|
||||||
|
class BufferView;
|
||||||
|
class Buffer;
|
||||||
|
class TexRow;
|
||||||
|
|
||||||
|
class InsetTabular : public UpdatableInset {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
InsetTabular(Buffer *, int rows=1, int columns=1);
|
||||||
|
///
|
||||||
|
InsetTabular(InsetTabular const &, Buffer *);
|
||||||
|
///
|
||||||
|
~InsetTabular();
|
||||||
|
///
|
||||||
|
InsetTabular * InsetTabular::Clone() const;
|
||||||
|
///
|
||||||
|
void Read(LyXLex &);
|
||||||
|
///
|
||||||
|
void Write(std::ostream &) const;
|
||||||
|
///
|
||||||
|
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;
|
||||||
|
///
|
||||||
|
const char * EditMessage() const;
|
||||||
|
///
|
||||||
|
void Edit(BufferView *, int x, int y, unsigned int);
|
||||||
|
///
|
||||||
|
void InsetUnlock(BufferView *);
|
||||||
|
///
|
||||||
|
bool LockInsetInInset(UpdatableInset *);
|
||||||
|
///
|
||||||
|
bool UnlockInsetInInset(BufferView *, UpdatableInset *, bool lr=false);
|
||||||
|
///
|
||||||
|
void UpdateLocal(BufferView *, bool flag = true);
|
||||||
|
///
|
||||||
|
bool UpdateInsetInInset(BufferView *, Inset *);
|
||||||
|
///
|
||||||
|
bool display() const { return tabular->IsLongTable(); }
|
||||||
|
///
|
||||||
|
void InsetButtonRelease(BufferView *, int, int, int);
|
||||||
|
///
|
||||||
|
void InsetButtonPress(BufferView *, int, int, int);
|
||||||
|
///
|
||||||
|
void InsetMotionNotify(BufferView *, int, int, int);
|
||||||
|
///
|
||||||
|
void InsetKeyPress(XKeyEvent *);
|
||||||
|
///
|
||||||
|
UpdatableInset::RESULT LocalDispatch(BufferView *, int, string const &);
|
||||||
|
///
|
||||||
|
int Latex(std::ostream &, bool, bool) const;
|
||||||
|
///
|
||||||
|
int Linuxdoc(std::ostream &) const;
|
||||||
|
///
|
||||||
|
int DocBook(std::ostream &) const;
|
||||||
|
///
|
||||||
|
void Validate(LaTeXFeatures & features) const;
|
||||||
|
///
|
||||||
|
Inset::Code LyxCode() const { return Inset::TABULAR_CODE; }
|
||||||
|
///
|
||||||
|
void GetCursorPos(int & x, int & y);
|
||||||
|
///
|
||||||
|
void ToggleInsetCursor(BufferView *);
|
||||||
|
///
|
||||||
|
void TableFeatures(int feature, string val="");
|
||||||
|
///
|
||||||
|
int GetActCell() { return actcell; }
|
||||||
|
///
|
||||||
|
void SetFont(LyXFont const &);
|
||||||
|
///
|
||||||
|
/// Public structures and variables
|
||||||
|
///
|
||||||
|
LyXTable * tabular;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void calculate_width_of_cells(Painter &, LyXFont const &) const;
|
||||||
|
///
|
||||||
|
void DrawCellLines(Painter &, int x, int baseline, int row, int cell);
|
||||||
|
///
|
||||||
|
void ShowInsetCursor(BufferView *);
|
||||||
|
///
|
||||||
|
void HideInsetCursor(BufferView *);
|
||||||
|
///
|
||||||
|
void setPos(int x, int y, bool activate_inset=true);
|
||||||
|
///
|
||||||
|
void setWidthOfCell(int pos, int cell, int row);
|
||||||
|
///
|
||||||
|
bool moveRight(bool activate_inset=true);
|
||||||
|
bool moveLeft(bool activate_inset=true);
|
||||||
|
bool moveUp(bool activate_inset=true);
|
||||||
|
bool moveDown(bool activate_inset=true);
|
||||||
|
bool moveNextCell();
|
||||||
|
bool movePrevCell();
|
||||||
|
bool Delete();
|
||||||
|
///
|
||||||
|
void resetPos();
|
||||||
|
///
|
||||||
|
void RemoveTableRow();
|
||||||
|
///
|
||||||
|
bool hasCharSelection() const {return (sel_pos_start != sel_pos_end);}
|
||||||
|
bool hasCellSelection() const {return hasCharSelection() &&
|
||||||
|
(sel_cell_start != sel_cell_end);}
|
||||||
|
///
|
||||||
|
/// Private structures and variables
|
||||||
|
///
|
||||||
|
UpdatableInset
|
||||||
|
* the_locking_inset;
|
||||||
|
Buffer
|
||||||
|
* buffer;
|
||||||
|
int
|
||||||
|
inset_pos,
|
||||||
|
inset_x, inset_y,
|
||||||
|
sel_pos_start,
|
||||||
|
sel_pos_end,
|
||||||
|
sel_cell_start,
|
||||||
|
sel_cell_end,
|
||||||
|
old_x,
|
||||||
|
cx, cy,
|
||||||
|
actpos,
|
||||||
|
actcell,
|
||||||
|
actcol,
|
||||||
|
actrow;
|
||||||
|
bool
|
||||||
|
no_selection;
|
||||||
|
mutable bool
|
||||||
|
init;
|
||||||
|
};
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load Diff
@ -19,9 +19,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "lyxinset.h"
|
#include "lyxinset.h"
|
||||||
#include "lyxparagraph.h"
|
|
||||||
#include "LString.h"
|
#include "LString.h"
|
||||||
//#include "buffer.h"
|
#include "lyxparagraph.h"
|
||||||
|
#include "lyxcursor.h"
|
||||||
|
|
||||||
class Painter;
|
class Painter;
|
||||||
class BufferView;
|
class BufferView;
|
||||||
@ -46,6 +46,8 @@ public:
|
|||||||
///
|
///
|
||||||
Inset * Clone() const;
|
Inset * Clone() const;
|
||||||
///
|
///
|
||||||
|
void clear() const { par->clearContents(); }
|
||||||
|
///
|
||||||
void Read(LyXLex &);
|
void Read(LyXLex &);
|
||||||
///
|
///
|
||||||
void Write(std::ostream &) const;
|
void Write(std::ostream &) const;
|
||||||
@ -64,7 +66,9 @@ public:
|
|||||||
///
|
///
|
||||||
void InsetUnlock(BufferView *);
|
void InsetUnlock(BufferView *);
|
||||||
///
|
///
|
||||||
bool UnlockInsetInInset(BufferView *, Inset *, bool lr = false);
|
bool LockInsetInInset(BufferView *, UpdatableInset *);
|
||||||
|
///
|
||||||
|
bool UnlockInsetInInset(BufferView *, UpdatableInset *, bool lr = false);
|
||||||
///
|
///
|
||||||
bool UpdateInsetInInset(BufferView *, Inset *);
|
bool UpdateInsetInInset(BufferView *, Inset *);
|
||||||
///
|
///
|
||||||
@ -110,7 +114,7 @@ protected:
|
|||||||
///
|
///
|
||||||
void WriteParagraphData(std::ostream &) const;
|
void WriteParagraphData(std::ostream &) const;
|
||||||
///
|
///
|
||||||
void resetPos(BufferView *, bool setfont=false);
|
void resetPos(Painter &) const;
|
||||||
///
|
///
|
||||||
void drawSelection(Painter &, int pos, int baseline, float x);
|
void drawSelection(Painter &, int pos, int baseline, float x);
|
||||||
///
|
///
|
||||||
@ -122,6 +126,9 @@ protected:
|
|||||||
LyXFont GetFont(LyXParagraph * par, int pos) const;
|
LyXFont GetFont(LyXParagraph * par, int pos) const;
|
||||||
///
|
///
|
||||||
virtual LyXFont GetDrawFont(LyXParagraph * par, int pos) const;
|
virtual LyXFont GetDrawFont(LyXParagraph * par, int pos) const;
|
||||||
|
///
|
||||||
|
virtual int getMaxTextWidth(Painter &, UpdatableInset const *,
|
||||||
|
int x=0) const;
|
||||||
|
|
||||||
Buffer * buffer;
|
Buffer * buffer;
|
||||||
///
|
///
|
||||||
@ -129,15 +136,14 @@ protected:
|
|||||||
///
|
///
|
||||||
LyXFont real_current_font;
|
LyXFont real_current_font;
|
||||||
///
|
///
|
||||||
mutable int maxWidth;
|
|
||||||
///
|
|
||||||
mutable int maxAscent;
|
mutable int maxAscent;
|
||||||
///
|
///
|
||||||
mutable int maxDescent;
|
mutable int maxDescent;
|
||||||
///
|
///
|
||||||
mutable int insetWidth;
|
mutable int insetWidth;
|
||||||
///
|
///
|
||||||
int widthOffset;
|
mutable int drawTextXOffset;
|
||||||
|
mutable int drawTextYOffset;
|
||||||
///
|
///
|
||||||
bool autoBreakRows;
|
bool autoBreakRows;
|
||||||
|
|
||||||
@ -159,12 +165,12 @@ private:
|
|||||||
///
|
///
|
||||||
void HideInsetCursor(BufferView *);
|
void HideInsetCursor(BufferView *);
|
||||||
///
|
///
|
||||||
void setPos(BufferView *, int x, int y, bool activate_inset = true);
|
void setPos(Painter &, int x, int y) const;
|
||||||
///
|
///
|
||||||
bool moveRight(BufferView *, bool activate_inset = true);
|
UpdatableInset::RESULT moveRight(BufferView *, bool activate_inset = true);
|
||||||
bool moveLeft(BufferView *, bool activate_inset = true);
|
UpdatableInset::RESULT moveLeft(BufferView *, bool activate_inset = true);
|
||||||
bool moveUp(BufferView *, bool activate_inset = true);
|
UpdatableInset::RESULT moveUp(BufferView *);
|
||||||
bool moveDown(BufferView *, bool activate_inset = true);
|
UpdatableInset::RESULT moveDown(BufferView *);
|
||||||
bool Delete();
|
bool Delete();
|
||||||
bool cutSelection();
|
bool cutSelection();
|
||||||
bool copySelection();
|
bool copySelection();
|
||||||
@ -175,14 +181,17 @@ private:
|
|||||||
void SetCharFont(int pos, LyXFont const & font);
|
void SetCharFont(int pos, LyXFont const & font);
|
||||||
///
|
///
|
||||||
string getText(int);
|
string getText(int);
|
||||||
|
///
|
||||||
|
bool checkAndActivateInset(BufferView * bv, int x = 0, int y = 0,
|
||||||
|
int button = 0);
|
||||||
|
|
||||||
/* Private structures and variables */
|
/* Private structures and variables */
|
||||||
///
|
///
|
||||||
int inset_pos;
|
int inset_pos;
|
||||||
///
|
///
|
||||||
int inset_x;
|
mutable int inset_x;
|
||||||
///
|
///
|
||||||
int inset_y;
|
mutable int inset_y;
|
||||||
///
|
///
|
||||||
int interline_space;
|
int interline_space;
|
||||||
///
|
///
|
||||||
@ -190,15 +199,11 @@ private:
|
|||||||
///
|
///
|
||||||
int selection_end;
|
int selection_end;
|
||||||
///
|
///
|
||||||
int old_x;
|
mutable LyXCursor cursor;
|
||||||
///
|
///
|
||||||
int cx;
|
mutable LyXCursor old_cursor;
|
||||||
///
|
///
|
||||||
int cy;
|
mutable int actrow;
|
||||||
///
|
|
||||||
int actpos;
|
|
||||||
///
|
|
||||||
int actrow;
|
|
||||||
///
|
///
|
||||||
bool no_selection;
|
bool no_selection;
|
||||||
///
|
///
|
||||||
@ -227,7 +232,6 @@ private:
|
|||||||
buffer = it.buffer; // suspect
|
buffer = it.buffer; // suspect
|
||||||
current_font = it.current_font;
|
current_font = it.current_font;
|
||||||
real_current_font = it.real_current_font;
|
real_current_font = it.real_current_font;
|
||||||
maxWidth = it.maxWidth;
|
|
||||||
maxAscent = it.maxAscent;
|
maxAscent = it.maxAscent;
|
||||||
maxDescent = it.maxDescent;
|
maxDescent = it.maxDescent;
|
||||||
insetWidth = it.insetWidth;
|
insetWidth = it.insetWidth;
|
||||||
@ -237,10 +241,7 @@ private:
|
|||||||
interline_space = it.interline_space;
|
interline_space = it.interline_space;
|
||||||
selection_start = it.selection_start;
|
selection_start = it.selection_start;
|
||||||
selection_end = it.selection_end;
|
selection_end = it.selection_end;
|
||||||
old_x = it.old_x;
|
cursor = it.cursor;
|
||||||
cx = it.cx;
|
|
||||||
cy = it.cy;
|
|
||||||
actpos = it.actpos;
|
|
||||||
actrow = it.actrow;
|
actrow = it.actrow;
|
||||||
no_selection = it.no_selection;
|
no_selection = it.no_selection;
|
||||||
the_locking_inset = it.the_locking_inset; // suspect
|
the_locking_inset = it.the_locking_inset; // suspect
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
*
|
*
|
||||||
* LyX, The Document Processor
|
* LyX, The Document Processor
|
||||||
*
|
*
|
||||||
* Copyright 1995 Matthias Ettrich
|
|
||||||
* Copyright 1995-2000 the LyX Team.
|
* Copyright 1995-2000 the LyX Team.
|
||||||
*
|
*
|
||||||
* ====================================================== */
|
* ====================================================== */
|
||||||
@ -92,7 +91,9 @@ public:
|
|||||||
///
|
///
|
||||||
SPECIALCHAR_CODE,
|
SPECIALCHAR_CODE,
|
||||||
///
|
///
|
||||||
NUMBER_CODE
|
NUMBER_CODE,
|
||||||
|
///
|
||||||
|
TABULAR_CODE
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EDITABLE {
|
enum EDITABLE {
|
||||||
@ -101,6 +102,8 @@ public:
|
|||||||
HIGHLY_EDITABLE
|
HIGHLY_EDITABLE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
Inset() { owner_ = 0; }
|
||||||
///
|
///
|
||||||
virtual ~Inset() {}
|
virtual ~Inset() {}
|
||||||
///
|
///
|
||||||
@ -121,6 +124,12 @@ public:
|
|||||||
///
|
///
|
||||||
virtual EDITABLE Editable() const;
|
virtual EDITABLE Editable() const;
|
||||||
///
|
///
|
||||||
|
virtual void InsetButtonPress(BufferView *, int, int, int) {}
|
||||||
|
///
|
||||||
|
virtual void InsetButtonRelease(BufferView *, int, int, int) {}
|
||||||
|
///
|
||||||
|
virtual void InsetMotionNotify(BufferView *, int , int , int) {}
|
||||||
|
///
|
||||||
bool IsTextInset() const;
|
bool IsTextInset() const;
|
||||||
///
|
///
|
||||||
virtual bool AutoDelete() const;
|
virtual bool AutoDelete() const;
|
||||||
@ -172,6 +181,20 @@ public:
|
|||||||
virtual void init(BufferView *) {}
|
virtual void init(BufferView *) {}
|
||||||
///
|
///
|
||||||
virtual bool InsertInsetAllowed(Inset *) const { return false; }
|
virtual bool InsertInsetAllowed(Inset *) const { return false; }
|
||||||
|
///
|
||||||
|
virtual void setInsetName(const char * s) { name = s; }
|
||||||
|
///
|
||||||
|
virtual string getInsetName() const { return name; }
|
||||||
|
///
|
||||||
|
virtual void setOwner(Inset * inset) { owner_ = inset; }
|
||||||
|
///
|
||||||
|
virtual Inset * owner() const { return owner_; }
|
||||||
|
///
|
||||||
|
private:
|
||||||
|
///
|
||||||
|
Inset * owner_;
|
||||||
|
///
|
||||||
|
string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -209,6 +232,8 @@ public:
|
|||||||
are not enough.
|
are not enough.
|
||||||
|
|
||||||
DISPATCHED = the inset catched the action
|
DISPATCHED = the inset catched the action
|
||||||
|
DISPATCHED_NOUPDATE = the inset catched the action and no update
|
||||||
|
is needed here to redraw the inset
|
||||||
FINISHED = the inset must be unlocked as a result
|
FINISHED = the inset must be unlocked as a result
|
||||||
of the action
|
of the action
|
||||||
UNDISPATCHED = the action was not catched, it should be
|
UNDISPATCHED = the action was not catched, it should be
|
||||||
@ -217,6 +242,7 @@ public:
|
|||||||
enum RESULT {
|
enum RESULT {
|
||||||
UNDISPATCHED = 0,
|
UNDISPATCHED = 0,
|
||||||
DISPATCHED,
|
DISPATCHED,
|
||||||
|
DISPATCHED_NOUPDATE,
|
||||||
FINISHED
|
FINISHED
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -226,10 +252,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
UpdatableInset() {
|
UpdatableInset() { scx = mx_scx = 0; }
|
||||||
scx = mx_scx = 0;
|
|
||||||
owner_ = 0;
|
|
||||||
}
|
|
||||||
///
|
///
|
||||||
//virtual ~UpdatableInset() {}
|
//virtual ~UpdatableInset() {}
|
||||||
///
|
///
|
||||||
@ -238,6 +261,10 @@ public:
|
|||||||
/// may call ToggleLockedInsetCursor
|
/// may call ToggleLockedInsetCursor
|
||||||
virtual void ToggleInsetCursor(BufferView *);
|
virtual void ToggleInsetCursor(BufferView *);
|
||||||
///
|
///
|
||||||
|
virtual void ShowInsetCursor(BufferView *);
|
||||||
|
///
|
||||||
|
virtual void HideInsetCursor(BufferView *);
|
||||||
|
///
|
||||||
virtual void GetCursorPos(int &, int &) const {}
|
virtual void GetCursorPos(int &, int &) const {}
|
||||||
///
|
///
|
||||||
virtual void InsetButtonPress(BufferView *, int x, int y, int button);
|
virtual void InsetButtonPress(BufferView *, int x, int y, int button);
|
||||||
@ -270,7 +297,10 @@ public:
|
|||||||
virtual bool UpdateInsetInInset(BufferView *, Inset *)
|
virtual bool UpdateInsetInInset(BufferView *, Inset *)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
///
|
///
|
||||||
virtual bool UnlockInsetInInset(BufferView *, Inset *,
|
virtual bool LockInsetInInset(BufferView *, UpdatableInset *)
|
||||||
|
{ return false; }
|
||||||
|
///
|
||||||
|
virtual bool UnlockInsetInInset(BufferView *, UpdatableInset *,
|
||||||
bool /*lr*/ = false)
|
bool /*lr*/ = false)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
/// An updatable inset could handle lyx editing commands
|
/// An updatable inset could handle lyx editing commands
|
||||||
@ -278,11 +308,7 @@ public:
|
|||||||
///
|
///
|
||||||
virtual bool isCursorVisible() const { return cursor_visible; }
|
virtual bool isCursorVisible() const { return cursor_visible; }
|
||||||
///
|
///
|
||||||
virtual int getMaxWidth(Painter & pain) const;
|
virtual int getMaxWidth(Painter & pain, UpdatableInset const *) const;
|
||||||
///
|
|
||||||
virtual void setOwner(UpdatableInset * inset) { owner_ = inset; }
|
|
||||||
///
|
|
||||||
virtual UpdatableInset * owner() { return owner_; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
///
|
///
|
||||||
@ -296,8 +322,5 @@ private:
|
|||||||
///
|
///
|
||||||
int mx_scx;
|
int mx_scx;
|
||||||
mutable int scx;
|
mutable int scx;
|
||||||
///
|
|
||||||
UpdatableInset * owner_;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,6 +54,7 @@ using std::istringstream;
|
|||||||
#include "insets/insetert.h"
|
#include "insets/insetert.h"
|
||||||
#include "insets/insetgraphics.h"
|
#include "insets/insetgraphics.h"
|
||||||
#include "insets/insetfoot.h"
|
#include "insets/insetfoot.h"
|
||||||
|
#include "insets/insettabular.h"
|
||||||
#include "mathed/formulamacro.h"
|
#include "mathed/formulamacro.h"
|
||||||
#include "toolbar.h"
|
#include "toolbar.h"
|
||||||
#include "spellchecker.h" // RVDK_PATCH_5
|
#include "spellchecker.h" // RVDK_PATCH_5
|
||||||
@ -533,6 +534,7 @@ string LyXFunc::Dispatch(int ac,
|
|||||||
// the math inset [asierra060396]
|
// the math inset [asierra060396]
|
||||||
if (owner->view()->available() &&
|
if (owner->view()->available() &&
|
||||||
owner->view()->the_locking_inset) {
|
owner->view()->the_locking_inset) {
|
||||||
|
UpdatableInset::RESULT result;
|
||||||
if (action > 1
|
if (action > 1
|
||||||
|| (action == LFUN_UNKNOWN_ACTION
|
|| (action == LFUN_UNKNOWN_ACTION
|
||||||
&& keyseq.length >= -1)) {
|
&& keyseq.length >= -1)) {
|
||||||
@ -574,10 +576,11 @@ string LyXFunc::Dispatch(int ac,
|
|||||||
if (inset)
|
if (inset)
|
||||||
inset->Edit(owner->view(),slx,sly,0);
|
inset->Edit(owner->view(),slx,sly,0);
|
||||||
return string();
|
return string();
|
||||||
} else if (owner->view()->the_locking_inset->
|
} else if (((result=owner->view()->the_locking_inset->
|
||||||
LocalDispatch(owner->view(), action,
|
LocalDispatch(owner->view(), action,
|
||||||
argument) ==
|
argument)) ==
|
||||||
UpdatableInset::DISPATCHED)
|
UpdatableInset::DISPATCHED) ||
|
||||||
|
(result == UpdatableInset::DISPATCHED_NOUPDATE))
|
||||||
return string();
|
return string();
|
||||||
else {
|
else {
|
||||||
setMessage(N_("Text mode"));
|
setMessage(N_("Text mode"));
|
||||||
@ -605,6 +608,12 @@ string LyXFunc::Dispatch(int ac,
|
|||||||
Set(CurrentState(owner->view()));
|
Set(CurrentState(owner->view()));
|
||||||
}
|
}
|
||||||
return string();
|
return string();
|
||||||
|
case LFUN_DOWN:
|
||||||
|
owner->view()->text->CursorDown();
|
||||||
|
moveCursorUpdate(false);
|
||||||
|
owner->getMiniBuffer()->
|
||||||
|
Set(CurrentState(owner->view()));
|
||||||
|
return string();
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2048,6 +2057,14 @@ string LyXFunc::Dispatch(int ac,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case LFUN_INSET_TABULAR:
|
||||||
|
{
|
||||||
|
InsetTabular * new_inset = new InsetTabular(owner->buffer(),2,2);
|
||||||
|
owner->view()->insertInset(new_inset);
|
||||||
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
// --- lyxserver commands ----------------------------
|
// --- lyxserver commands ----------------------------
|
||||||
|
|
||||||
case LFUN_CHARATCURSOR:
|
case LFUN_CHARATCURSOR:
|
||||||
|
@ -239,6 +239,8 @@ public:
|
|||||||
void SetCursor(LyXParagraph * par,
|
void SetCursor(LyXParagraph * par,
|
||||||
LyXParagraph::size_type pos,
|
LyXParagraph::size_type pos,
|
||||||
bool setfont = true) const;
|
bool setfont = true) const;
|
||||||
|
void SetCursor(LyXCursor &, LyXParagraph * par,
|
||||||
|
LyXParagraph::size_type pos) const;
|
||||||
///
|
///
|
||||||
void SetCursorIntern(LyXParagraph * par,
|
void SetCursorIntern(LyXParagraph * par,
|
||||||
LyXParagraph::size_type pos,
|
LyXParagraph::size_type pos,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* File: formula.h
|
* File: formula.C
|
||||||
* Purpose: Implementation of formula inset
|
* Purpose: Implementation of formula inset
|
||||||
* Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
|
* Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
|
||||||
* Created: January 1996
|
* Created: January 1996
|
||||||
@ -461,7 +461,8 @@ char const * InsetFormula::EditMessage() const
|
|||||||
void InsetFormula::Edit(BufferView * bv, int x, int y, unsigned int)
|
void InsetFormula::Edit(BufferView * bv, int x, int y, unsigned int)
|
||||||
{
|
{
|
||||||
mathcursor = new MathedCursor(par);
|
mathcursor = new MathedCursor(par);
|
||||||
bv->lockInset(this);
|
if (!bv->lockInset(this))
|
||||||
|
lyxerr[Debug::MATHED] << "Cannot lock inset!!!" << endl;
|
||||||
par->Metrics();
|
par->Metrics();
|
||||||
bv->updateInset(this, false);
|
bv->updateInset(this, false);
|
||||||
x += par->xo;
|
x += par->xo;
|
||||||
|
@ -644,6 +644,8 @@ void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
|
|||||||
"there is an inset in position: " << pos << endl;
|
"there is an inset in position: " << pos << endl;
|
||||||
else
|
else
|
||||||
insetlist.insert(it, InsetTable(pos,inset));
|
insetlist.insert(it, InsetTable(pos,inset));
|
||||||
|
if (inset_owner)
|
||||||
|
inset->setOwner(inset_owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3483,7 +3485,9 @@ LyXParagraph * LyXParagraph::TeXDeeper(ostream & os, TexRow & texrow,
|
|||||||
lyxerr[Debug::LATEX] << "TeXDeeper... " << this << endl;
|
lyxerr[Debug::LATEX] << "TeXDeeper... " << this << endl;
|
||||||
LyXParagraph * par = this;
|
LyXParagraph * par = this;
|
||||||
|
|
||||||
while (par && par->depth == depth) {
|
while (par &&
|
||||||
|
(par->depth == depth) &&
|
||||||
|
(par->footnoteflag == footnoteflag)) {
|
||||||
if (par->IsDummy())
|
if (par->IsDummy())
|
||||||
lyxerr << "ERROR (LyXParagraph::TeXDeeper)" << endl;
|
lyxerr << "ERROR (LyXParagraph::TeXDeeper)" << endl;
|
||||||
if (textclasslist.Style(current_view->buffer()->params.textclass,
|
if (textclasslist.Style(current_view->buffer()->params.textclass,
|
||||||
@ -3736,7 +3740,8 @@ LyXParagraph * LyXParagraph::TeXEnvironment(ostream & os, TexRow & texrow,
|
|||||||
} while (par
|
} while (par
|
||||||
&& par->layout == layout
|
&& par->layout == layout
|
||||||
&& par->depth == depth
|
&& par->depth == depth
|
||||||
&& par->pextra_type == pextra_type);
|
&& par->pextra_type == pextra_type
|
||||||
|
&& par->footnoteflag == footnoteflag);
|
||||||
|
|
||||||
if (style.isEnvironment()) {
|
if (style.isEnvironment()) {
|
||||||
os << "\\end{" << style.latexname() << '}';
|
os << "\\end{" << style.latexname() << '}';
|
||||||
|
276
src/table.C
276
src/table.C
@ -24,6 +24,8 @@
|
|||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/lyxmanip.h"
|
#include "support/lyxmanip.h"
|
||||||
|
#include "lyx_gui_misc.h"
|
||||||
|
#include "insets/insettext.h"
|
||||||
|
|
||||||
using std::ostream;
|
using std::ostream;
|
||||||
using std::istream;
|
using std::istream;
|
||||||
@ -32,33 +34,162 @@ using std::endl;
|
|||||||
|
|
||||||
static int const WIDTH_OF_LINE = 5;
|
static int const WIDTH_OF_LINE = 5;
|
||||||
|
|
||||||
|
/// Define a few methods for the inner structs
|
||||||
|
|
||||||
|
LyXTable::cellstruct::cellstruct(Buffer * buf)
|
||||||
|
{
|
||||||
|
cellno = 0; //should be initilaized correctly later.
|
||||||
|
width_of_cell = 0;
|
||||||
|
multicolumn = LyXTable::CELL_NORMAL;
|
||||||
|
alignment = LYX_ALIGN_CENTER;
|
||||||
|
top_line = true;
|
||||||
|
bottom_line = false;
|
||||||
|
has_cont_row = false;
|
||||||
|
rotate = false;
|
||||||
|
linebreaks = false;
|
||||||
|
buf ? inset = new InsetText(buf): inset = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::cellstruct::~cellstruct()
|
||||||
|
{
|
||||||
|
if (inset)
|
||||||
|
delete inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::cellstruct &
|
||||||
|
LyXTable::cellstruct::operator=(cellstruct const & cs)
|
||||||
|
{
|
||||||
|
cellno = cs.cellno;
|
||||||
|
width_of_cell = cs.width_of_cell;
|
||||||
|
multicolumn = cs.multicolumn;
|
||||||
|
alignment = cs.alignment;
|
||||||
|
top_line = cs.top_line;
|
||||||
|
bottom_line = cs.bottom_line;
|
||||||
|
has_cont_row = cs.has_cont_row;
|
||||||
|
rotate = cs.rotate;
|
||||||
|
linebreaks = cs.linebreaks;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::rowstruct::rowstruct()
|
||||||
|
{
|
||||||
|
top_line = true;
|
||||||
|
bottom_line = false;
|
||||||
|
is_cont_row = false;
|
||||||
|
ascent_of_row = 0;
|
||||||
|
descent_of_row = 0;
|
||||||
|
newpage = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing to do, but gcc 2.7.2.3 wants one... (JMarc)
|
||||||
|
LyXTable::rowstruct::~rowstruct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::rowstruct &
|
||||||
|
LyXTable::rowstruct::operator=(rowstruct const & rs)
|
||||||
|
{
|
||||||
|
top_line = rs.top_line;
|
||||||
|
bottom_line = rs.bottom_line;
|
||||||
|
is_cont_row = rs.is_cont_row;
|
||||||
|
ascent_of_row = rs.ascent_of_row;
|
||||||
|
descent_of_row = rs.descent_of_row;
|
||||||
|
newpage = rs.newpage;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::columnstruct::columnstruct()
|
||||||
|
{
|
||||||
|
left_line = true;
|
||||||
|
right_line = false;
|
||||||
|
alignment = LYX_ALIGN_CENTER;
|
||||||
|
width_of_column = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::columnstruct::~columnstruct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::columnstruct &
|
||||||
|
LyXTable::columnstruct::operator=(columnstruct const & cs)
|
||||||
|
{
|
||||||
|
left_line = cs.left_line;
|
||||||
|
right_line = cs.right_line;
|
||||||
|
alignment = cs.alignment;
|
||||||
|
width_of_column = cs.width_of_column;
|
||||||
|
p_width = cs.p_width;
|
||||||
|
align_special = cs.align_special;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/* konstruktor */
|
/* konstruktor */
|
||||||
LyXTable::LyXTable(int rows_arg, int columns_arg)
|
LyXTable::LyXTable(int rows_arg, int columns_arg, Buffer *buf)
|
||||||
{
|
{
|
||||||
Init(rows_arg, columns_arg);
|
buffer = buf;
|
||||||
|
Init(rows_arg, columns_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LyXTable::LyXTable(LyXLex & lex)
|
LyXTable::LyXTable(LyXTable const & lt, Buffer * buf)
|
||||||
{
|
{
|
||||||
istream & is = lex.getStream();
|
buffer = buf;
|
||||||
Read(is);
|
Init(lt.rows, lt.columns);
|
||||||
|
|
||||||
|
operator=(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
LyXTable::LyXTable(LyXLex & lex, Buffer *buf)
|
||||||
|
{
|
||||||
|
istream & is = lex.getStream();
|
||||||
|
buffer = buf;
|
||||||
|
Read(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LyXTable::~LyXTable() {
|
LyXTable::~LyXTable()
|
||||||
delete[] rowofcell;
|
{
|
||||||
delete[] columnofcell;
|
delete[] rowofcell;
|
||||||
delete[] column_info;
|
delete[] columnofcell;
|
||||||
delete[] row_info;
|
delete[] column_info;
|
||||||
for (int i = 0; i < rows; ++i) {
|
delete[] row_info;
|
||||||
delete[] cell_info[i]; // verify that this shoudn't be freed with delete
|
for (int i = 0; i < rows; ++i) {
|
||||||
}
|
delete[] cell_info[i];
|
||||||
delete[] cell_info;
|
}
|
||||||
|
delete[] cell_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LyXTable & LyXTable::operator=(LyXTable const & lt)
|
||||||
|
{
|
||||||
|
// If this and lt is not of the same size we have a serious bug
|
||||||
|
// So then it is ok to throw an exception, or for now
|
||||||
|
// call abort()
|
||||||
|
Assert(rows == lt.rows && columns == lt.columns);
|
||||||
|
|
||||||
|
int row = 0, column = 0;
|
||||||
|
|
||||||
|
for (row = 0; row < rows; ++row) {
|
||||||
|
for (column = 0; column < columns; ++column) {
|
||||||
|
cell_info[row][column] = lt.cell_info[row][column];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (row = 0; row < rows; ++row) {
|
||||||
|
row_info[row] = lt.row_info[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (column = 0; column < columns; ++column) {
|
||||||
|
column_info[column] = lt.column_info[column];
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLongTable(lt.is_long_table);
|
||||||
|
rotate = lt.rotate;
|
||||||
|
Reinit();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
LyXTable * LyXTable::Clone()
|
LyXTable * LyXTable::Clone()
|
||||||
{
|
{
|
||||||
LyXTable * result = new LyXTable(rows, columns);
|
LyXTable * result = new LyXTable(rows, columns);
|
||||||
@ -101,33 +232,15 @@ void LyXTable::Init(int rows_arg, int columns_arg)
|
|||||||
|
|
||||||
int cellno = 0;
|
int cellno = 0;
|
||||||
for (i = 0; i < rows; ++i) {
|
for (i = 0; i < rows; ++i) {
|
||||||
cell_info[i] = new cellstruct[columns];
|
cell_info[i] = new cellstruct[columns](buffer);
|
||||||
row_info[i].top_line = true;
|
|
||||||
row_info[i].bottom_line = false;
|
|
||||||
row_info[i].is_cont_row = false;
|
|
||||||
row_info[i].newpage = false;
|
|
||||||
for (j = 0; j < columns; ++j) {
|
for (j = 0; j < columns; ++j) {
|
||||||
cell_info[i][j].cellno = cellno++;
|
cell_info[i][j].cellno = cellno++;
|
||||||
cell_info[i][j].width_of_cell = 0;
|
|
||||||
cell_info[i][j].multicolumn = LyXTable::CELL_NORMAL;
|
|
||||||
cell_info[i][j].alignment = LYX_ALIGN_CENTER;
|
|
||||||
cell_info[i][j].top_line = row_info[i].top_line;
|
|
||||||
cell_info[i][j].bottom_line = row_info[i].bottom_line;
|
|
||||||
cell_info[i][j].has_cont_row = false;
|
|
||||||
cell_info[i][j].rotate = false;
|
|
||||||
cell_info[i][j].linebreaks = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
row_info[i-1].bottom_line = true;
|
row_info[i-1].bottom_line = true;
|
||||||
row_info[0].bottom_line = true;
|
row_info[0].bottom_line = true;
|
||||||
|
|
||||||
for (i = 0; i < columns; ++i) {
|
for (i = 0; i < columns; ++i) {
|
||||||
column_info[i].left_line = true;
|
|
||||||
column_info[i].right_line = false;
|
|
||||||
column_info[i].alignment = LYX_ALIGN_CENTER;
|
|
||||||
// set width_of_column to zero before it is used in
|
|
||||||
// calculate_width_of_column() (thornley)
|
|
||||||
column_info[i].width_of_column = 0;
|
|
||||||
calculate_width_of_column(i);
|
calculate_width_of_column(i);
|
||||||
}
|
}
|
||||||
column_info[i-1].right_line = true;
|
column_info[i-1].right_line = true;
|
||||||
@ -780,7 +893,7 @@ void LyXTable::calculate_width_of_table()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int LyXTable::row_of_cell(int cell)
|
int LyXTable::row_of_cell(int cell) const
|
||||||
{
|
{
|
||||||
if (cell >= numberofcells)
|
if (cell >= numberofcells)
|
||||||
return rows-1;
|
return rows-1;
|
||||||
@ -790,7 +903,7 @@ int LyXTable::row_of_cell(int cell)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int LyXTable::column_of_cell(int cell)
|
int LyXTable::column_of_cell(int cell) const
|
||||||
{
|
{
|
||||||
if (cell >= numberofcells)
|
if (cell >= numberofcells)
|
||||||
return columns-1;
|
return columns-1;
|
||||||
@ -811,29 +924,30 @@ int LyXTable::right_column_of_cell(int cell)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LyXTable::Write(ostream & os)
|
void LyXTable::Write(ostream & os, bool old_format)
|
||||||
{
|
{
|
||||||
int i, j;
|
if (old_format) {
|
||||||
os << "multicol5\n"
|
int i, j;
|
||||||
<< rows << " " << columns << " " << is_long_table << " "
|
os << "multicol5\n"
|
||||||
<< rotate << " " << endhead << " " << endfirsthead << " "
|
<< rows << " " << columns << " " << is_long_table << " "
|
||||||
<< endfoot << " " << endlastfoot << "\n";
|
<< rotate << " " << endhead << " " << endfirsthead << " "
|
||||||
for (i = 0; i < rows; ++i) {
|
<< endfoot << " " << endlastfoot << "\n";
|
||||||
|
for (i = 0; i < rows; ++i) {
|
||||||
os << row_info[i].top_line << " "
|
os << row_info[i].top_line << " "
|
||||||
<< row_info[i].bottom_line << " "
|
<< row_info[i].bottom_line << " "
|
||||||
<< row_info[i].is_cont_row << " "
|
<< row_info[i].is_cont_row << " "
|
||||||
<< row_info[i].newpage << "\n";
|
<< row_info[i].newpage << "\n";
|
||||||
}
|
}
|
||||||
for (i = 0; i < columns; ++i) {
|
for (i = 0; i < columns; ++i) {
|
||||||
os << column_info[i].alignment << " "
|
os << column_info[i].alignment << " "
|
||||||
<< column_info[i].left_line << " "
|
<< column_info[i].left_line << " "
|
||||||
<< column_info[i].right_line << " \""
|
<< column_info[i].right_line << " \""
|
||||||
<< VSpace(column_info[i].p_width).asLyXCommand() << "\" \""
|
<< VSpace(column_info[i].p_width).asLyXCommand() << "\" \""
|
||||||
<< column_info[i].align_special << "\"\n";
|
<< column_info[i].align_special << "\"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < rows; ++i) {
|
for (i = 0; i < rows; ++i) {
|
||||||
for (j = 0; j < columns; ++j) {
|
for (j = 0; j < columns; ++j) {
|
||||||
os << cell_info[i][j].multicolumn << " "
|
os << cell_info[i][j].multicolumn << " "
|
||||||
<< cell_info[i][j].alignment << " "
|
<< cell_info[i][j].alignment << " "
|
||||||
<< cell_info[i][j].top_line << " "
|
<< cell_info[i][j].top_line << " "
|
||||||
@ -843,7 +957,10 @@ void LyXTable::Write(ostream & os)
|
|||||||
<< cell_info[i][j].linebreaks << " \""
|
<< cell_info[i][j].linebreaks << " \""
|
||||||
<< cell_info[i][j].align_special << "\" \""
|
<< cell_info[i][j].align_special << "\" \""
|
||||||
<< cell_info[i][j].p_width << "\"\n";
|
<< cell_info[i][j].p_width << "\"\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lyxerr << "New format type not yet implemented!!!\n" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -871,13 +988,13 @@ void LyXTable::Read(istream & is)
|
|||||||
version = atoi(s.c_str() + 8);
|
version = atoi(s.c_str() + 8);
|
||||||
else
|
else
|
||||||
version = 1;
|
version = 1;
|
||||||
#ifdef WITH_WARNINGS
|
|
||||||
#warning Insert a error message window here that this format is not supported anymore
|
|
||||||
#endif
|
|
||||||
if (version < 5) {
|
if (version < 5) {
|
||||||
lyxerr << "Tabular format < 5 is not supported anymore\n"
|
lyxerr << "Tabular format < 5 is not supported anymore\n"
|
||||||
"Get an older version of LyX (< 1.1.x) for conversion!"
|
"Get an older version of LyX (< 1.1.x) for conversion!"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
WriteAlert(_("Warning:"),
|
||||||
|
_("Tabular format < 5 is not supported anymore\n"),
|
||||||
|
_("Get an older version of LyX (< 1.1.x) for conversion!"));
|
||||||
if (version > 2) {
|
if (version > 2) {
|
||||||
is >> rows_arg >> columns_arg >> is_long_table_arg
|
is >> rows_arg >> columns_arg >> is_long_table_arg
|
||||||
>> rotate_arg >> a >> b >> c >> d;
|
>> rotate_arg >> a >> b >> c >> d;
|
||||||
@ -1915,3 +2032,60 @@ bool LyXTable::LTNewPage(int cell)
|
|||||||
{
|
{
|
||||||
return row_info[row_of_cell(cell)].newpage;
|
return row_info[row_of_cell(cell)].newpage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LyXTable::SetAscentOfRow(int row, int height)
|
||||||
|
{
|
||||||
|
if (row >= rows)
|
||||||
|
return;
|
||||||
|
row_info[row].ascent_of_row = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LyXTable::SetDescentOfRow(int row, int height)
|
||||||
|
{
|
||||||
|
if (row >= rows)
|
||||||
|
return;
|
||||||
|
row_info[row].descent_of_row = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LyXTable::AscentOfRow(int row)
|
||||||
|
{
|
||||||
|
if (row >= rows)
|
||||||
|
return 0;
|
||||||
|
return row_info[row].ascent_of_row;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LyXTable::DescentOfRow(int row)
|
||||||
|
{
|
||||||
|
if (row >= rows)
|
||||||
|
return 0;
|
||||||
|
return row_info[row].descent_of_row;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LyXTable::HeightOfTable()
|
||||||
|
{
|
||||||
|
int
|
||||||
|
height,
|
||||||
|
row;
|
||||||
|
|
||||||
|
for(row=0,height=0;(row<rows); ++row)
|
||||||
|
height += AscentOfRow(row) + DescentOfRow(row) +
|
||||||
|
AdditionalHeight(GetCellNumber(0,row));
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LyXTable::IsPartOfMultiColumn(int row, int column)
|
||||||
|
{
|
||||||
|
if ((row >= rows) || (column >= columns))
|
||||||
|
return false;
|
||||||
|
return (cell_info[row][column].multicolumn==CELL_PART_OF_MULTICOLUMN);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LyXTable::Latex(ostream &)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
InsetText * LyXTable::GetCellInset(int cell) const
|
||||||
|
{
|
||||||
|
return cell_info[row_of_cell(cell)][column_of_cell(cell)].inset;
|
||||||
|
}
|
||||||
|
646
src/table.h
646
src/table.h
@ -20,327 +20,377 @@
|
|||||||
#include "lyxlex.h"
|
#include "lyxlex.h"
|
||||||
#include "LString.h"
|
#include "LString.h"
|
||||||
|
|
||||||
|
class InsetText;
|
||||||
|
class Buffer;
|
||||||
|
|
||||||
/* The features the text class offers for tables */
|
/* The features the text class offers for tables */
|
||||||
|
|
||||||
///
|
///
|
||||||
class LyXTable {
|
class LyXTable {
|
||||||
public:
|
public:
|
||||||
// Are the values of these enums important? (Lgb)
|
// Are the values of these enums important? (Lgb)
|
||||||
enum {
|
enum {
|
||||||
APPEND_ROW = 0,
|
APPEND_ROW = 0,
|
||||||
APPEND_COLUMN = 1,
|
APPEND_COLUMN = 1,
|
||||||
DELETE_ROW = 2,
|
DELETE_ROW = 2,
|
||||||
DELETE_COLUMN = 3,
|
DELETE_COLUMN = 3,
|
||||||
TOGGLE_LINE_TOP = 4,
|
TOGGLE_LINE_TOP = 4,
|
||||||
TOGGLE_LINE_BOTTOM = 5,
|
TOGGLE_LINE_BOTTOM = 5,
|
||||||
TOGGLE_LINE_LEFT = 6,
|
TOGGLE_LINE_LEFT = 6,
|
||||||
TOGGLE_LINE_RIGHT = 7,
|
TOGGLE_LINE_RIGHT = 7,
|
||||||
ALIGN_LEFT = 8, // what are these alignment enums used for?
|
ALIGN_LEFT = 8, // what are these alignment enums used for?
|
||||||
ALIGN_RIGHT = 9,
|
ALIGN_RIGHT = 9,
|
||||||
ALIGN_CENTER = 10,
|
ALIGN_CENTER = 10,
|
||||||
DELETE_TABLE = 11,
|
DELETE_TABLE = 11,
|
||||||
MULTICOLUMN = 12,
|
MULTICOLUMN = 12,
|
||||||
SET_ALL_LINES = 13,
|
SET_ALL_LINES = 13,
|
||||||
UNSET_ALL_LINES = 14,
|
UNSET_ALL_LINES = 14,
|
||||||
SET_LONGTABLE = 15,
|
SET_LONGTABLE = 15,
|
||||||
UNSET_LONGTABLE = 16,
|
UNSET_LONGTABLE = 16,
|
||||||
SET_PWIDTH = 17,
|
SET_PWIDTH = 17,
|
||||||
APPEND_CONT_ROW = 18,
|
APPEND_CONT_ROW = 18,
|
||||||
SET_ROTATE_TABLE = 19,
|
SET_ROTATE_TABLE = 19,
|
||||||
UNSET_ROTATE_TABLE = 20,
|
UNSET_ROTATE_TABLE = 20,
|
||||||
SET_ROTATE_CELL = 21,
|
SET_ROTATE_CELL = 21,
|
||||||
UNSET_ROTATE_CELL = 22,
|
UNSET_ROTATE_CELL = 22,
|
||||||
SET_LINEBREAKS = 23,
|
SET_LINEBREAKS = 23,
|
||||||
SET_LTHEAD = 24,
|
SET_LTHEAD = 24,
|
||||||
SET_LTFIRSTHEAD = 25,
|
SET_LTFIRSTHEAD = 25,
|
||||||
SET_LTFOOT = 26,
|
SET_LTFOOT = 26,
|
||||||
SET_LTLASTFOOT = 27,
|
SET_LTLASTFOOT = 27,
|
||||||
SET_LTNEWPAGE = 28,
|
SET_LTNEWPAGE = 28,
|
||||||
SET_SPECIAL_COLUMN = 29,
|
SET_SPECIAL_COLUMN = 29,
|
||||||
SET_SPECIAL_MULTI = 30
|
SET_SPECIAL_MULTI = 30
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CELL_NORMAL = 0,
|
CELL_NORMAL = 0,
|
||||||
CELL_BEGIN_OF_MULTICOLUMN = 1,
|
CELL_BEGIN_OF_MULTICOLUMN = 1,
|
||||||
CELL_PART_OF_MULTICOLUMN = 2
|
CELL_PART_OF_MULTICOLUMN = 2
|
||||||
};
|
};
|
||||||
/* konstruktor */
|
/* konstruktor */
|
||||||
///
|
///
|
||||||
LyXTable(int columns_arg, int rows_arg);
|
LyXTable(int columns_arg, int rows_arg, Buffer *buf = 0);
|
||||||
///
|
///
|
||||||
explicit
|
///
|
||||||
LyXTable(LyXLex & lex);
|
LyXTable(LyXTable const &, Buffer *buf = 0);
|
||||||
///
|
///
|
||||||
~LyXTable();
|
explicit
|
||||||
///
|
LyXTable(LyXLex & lex, Buffer *buf = 0);
|
||||||
LyXTable * Clone();
|
///
|
||||||
|
~LyXTable();
|
||||||
/// Returns true if there is a topline, returns false if not
|
///
|
||||||
bool TopLine(int cell);
|
LyXTable & operator=(LyXTable const &);
|
||||||
/// Returns true if there is a topline, returns false if not
|
///
|
||||||
bool BottomLine(int cell);
|
LyXTable * Clone();
|
||||||
/// Returns true if there is a topline, returns false if not
|
|
||||||
bool LeftLine(int cell);
|
/// Returns true if there is a topline, returns false if not
|
||||||
/// Returns true if there is a topline, returns false if not
|
bool TopLine(int cell);
|
||||||
bool RightLine(int cell);
|
/// Returns true if there is a topline, returns false if not
|
||||||
|
bool BottomLine(int cell);
|
||||||
|
/// Returns true if there is a topline, returns false if not
|
||||||
|
bool LeftLine(int cell);
|
||||||
|
/// Returns true if there is a topline, returns false if not
|
||||||
|
bool RightLine(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
bool TopAlreadyDrawed(int cell);
|
||||||
|
///
|
||||||
|
bool VeryLastRow(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
int AdditionalHeight(int cell);
|
||||||
|
///
|
||||||
|
int AdditionalWidth(int cell);
|
||||||
|
|
||||||
|
/* returns the maximum over all rows */
|
||||||
|
///
|
||||||
|
int WidthOfColumn(int cell);
|
||||||
|
///
|
||||||
|
int WidthOfTable();
|
||||||
|
///
|
||||||
|
int AscentOfRow(int row);
|
||||||
|
///
|
||||||
|
int DescentOfRow(int row);
|
||||||
|
///
|
||||||
|
int HeightOfTable();
|
||||||
|
///
|
||||||
|
void SetAscentOfRow(int row, int height);
|
||||||
|
///
|
||||||
|
void SetDescentOfRow(int row, int height);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetWidthOfCell(int cell, int new_width);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetAllLines(int cell, bool line);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetTopLine(int cell, bool line);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetBottomLine(int cell, bool line);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetLeftLine(int cell, bool line);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetRightLine(int cell, bool line);
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetAlignment(int cell, char align);
|
||||||
|
///
|
||||||
|
bool SetPWidth(int cell, string width);
|
||||||
|
///
|
||||||
|
bool SetAlignSpecial(int cell, string special, int what);
|
||||||
|
///
|
||||||
|
char GetAlignment(int cell); // add approp. signedness
|
||||||
|
///
|
||||||
|
string GetPWidth(int cell);
|
||||||
|
///
|
||||||
|
string GetAlignSpecial(int cell, int what);
|
||||||
|
|
||||||
|
///
|
||||||
|
int GetWidthOfCell(int cell);
|
||||||
|
///
|
||||||
|
int GetBeginningOfTextInCell(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
void AppendRow(int cell);
|
||||||
|
///
|
||||||
|
void DeleteRow(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
void AppendColumn(int cell);
|
||||||
|
///
|
||||||
|
void DeleteColumn(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
bool IsFirstCell(int cell);
|
||||||
|
///
|
||||||
|
bool IsLastCell(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
int GetNumberOfCells();
|
||||||
|
///
|
||||||
|
int AppendCellAfterCell(int append_cell, int question_cell);
|
||||||
|
///
|
||||||
|
int DeleteCellIfColumnIsDeleted(int cell, int delete_column_cell);
|
||||||
|
///
|
||||||
|
int NumberOfCellsInRow(int cell);
|
||||||
|
///
|
||||||
|
void Reinit();
|
||||||
|
|
||||||
///
|
///
|
||||||
bool TopAlreadyDrawed(int cell);
|
void Init(int columns_arg, int rows_arg);
|
||||||
///
|
|
||||||
bool VeryLastRow(int cell);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
int AdditionalHeight(int cell);
|
void Write(std::ostream &, bool old_format=true);
|
||||||
///
|
///
|
||||||
int AdditionalWidth(int cell);
|
void Read(std::istream &);
|
||||||
|
///
|
||||||
/* returns the maximum over all rows */
|
int Latex(std::ostream &);
|
||||||
///
|
|
||||||
int WidthOfColumn(int cell);
|
|
||||||
///
|
|
||||||
int WidthOfTable();
|
|
||||||
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetWidthOfCell(int cell, int new_width);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetAllLines(int cell, bool line);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetTopLine(int cell, bool line);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetBottomLine(int cell, bool line);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetLeftLine(int cell, bool line);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetRightLine(int cell, bool line);
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetAlignment(int cell, char align);
|
|
||||||
///
|
|
||||||
bool SetPWidth(int cell, string width);
|
|
||||||
///
|
|
||||||
bool SetAlignSpecial(int cell, string special, int what);
|
|
||||||
///
|
|
||||||
char GetAlignment(int cell); // add approp. signedness
|
|
||||||
///
|
|
||||||
string GetPWidth(int cell);
|
|
||||||
///
|
|
||||||
string GetAlignSpecial(int cell, int what);
|
|
||||||
|
|
||||||
///
|
// cell <0 will tex the preamble
|
||||||
int GetWidthOfCell(int cell);
|
// returns the number of printed newlines
|
||||||
///
|
///
|
||||||
int GetBeginningOfTextInCell(int cell);
|
int TexEndOfCell(std::ostream &, int cell);
|
||||||
|
///
|
||||||
///
|
int DocBookEndOfCell(std::ostream &, int cell, int & depth);
|
||||||
void AppendRow(int cell);
|
|
||||||
///
|
|
||||||
void DeleteRow(int cell);
|
|
||||||
|
|
||||||
///
|
|
||||||
void AppendColumn(int cell);
|
|
||||||
///
|
|
||||||
void DeleteColumn(int cell);
|
|
||||||
|
|
||||||
///
|
|
||||||
bool IsFirstCell(int cell);
|
|
||||||
///
|
|
||||||
bool IsLastCell(int cell);
|
|
||||||
|
|
||||||
///
|
|
||||||
int GetNumberOfCells();
|
|
||||||
///
|
|
||||||
int AppendCellAfterCell(int append_cell, int question_cell);
|
|
||||||
///
|
|
||||||
int DeleteCellIfColumnIsDeleted(int cell, int delete_column_cell);
|
|
||||||
///
|
|
||||||
int NumberOfCellsInRow(int cell);
|
|
||||||
///
|
|
||||||
void Reinit();
|
|
||||||
|
|
||||||
///
|
|
||||||
void Init(int columns_arg, int rows_arg);
|
|
||||||
|
|
||||||
///
|
|
||||||
void Write(std::ostream &);
|
|
||||||
///
|
|
||||||
void Read(std::istream &);
|
|
||||||
|
|
||||||
// cell <0 will tex the preamble
|
|
||||||
// returns the number of printed newlines
|
|
||||||
///
|
|
||||||
int TexEndOfCell(std::ostream &, int cell);
|
|
||||||
///
|
|
||||||
int DocBookEndOfCell(std::ostream &, int cell, int & depth);
|
|
||||||
#if 0
|
#if 0
|
||||||
///
|
///
|
||||||
int RoffEndOfCell(std::ostream &, int cell);
|
int RoffEndOfCell(std::ostream &, int cell);
|
||||||
#endif
|
#endif
|
||||||
///
|
///
|
||||||
char const * getDocBookAlign(int cell, bool isColumn = false);
|
char const * getDocBookAlign(int cell, bool isColumn = false);
|
||||||
|
|
||||||
///
|
///
|
||||||
bool IsMultiColumn(int cell);
|
bool IsMultiColumn(int cell);
|
||||||
///
|
///
|
||||||
void SetMultiColumn(int cell, int number);
|
void SetMultiColumn(int cell, int number);
|
||||||
///
|
///
|
||||||
int UnsetMultiColumn(int cell); // returns number of new cells
|
int UnsetMultiColumn(int cell); // returns number of new cells
|
||||||
///
|
///
|
||||||
int row_of_cell(int cell);
|
bool IsPartOfMultiColumn(int row, int column);
|
||||||
///
|
///
|
||||||
int column_of_cell(int cell);
|
int row_of_cell(int cell) const;
|
||||||
///
|
///
|
||||||
int rows;
|
int column_of_cell(int cell) const;
|
||||||
///
|
///
|
||||||
int columns;
|
int rows;
|
||||||
///
|
///
|
||||||
void SetLongTable(int what);
|
int columns;
|
||||||
///
|
///
|
||||||
bool IsLongTable();
|
void SetLongTable(int what);
|
||||||
///
|
///
|
||||||
void SetRotateTable(int what);
|
bool IsLongTable();
|
||||||
///
|
///
|
||||||
bool RotateTable();
|
void SetRotateTable(int what);
|
||||||
///
|
///
|
||||||
void SetRotateCell(int cell, int what);
|
bool RotateTable();
|
||||||
///
|
///
|
||||||
bool RotateCell(int cell);
|
void SetRotateCell(int cell, int what);
|
||||||
///
|
///
|
||||||
bool NeedRotating();
|
bool RotateCell(int cell);
|
||||||
///
|
///
|
||||||
void AppendContRow(int cell);
|
bool NeedRotating();
|
||||||
///
|
///
|
||||||
bool IsContRow(int cell);
|
void AppendContRow(int cell);
|
||||||
/// returns the number of the cell which continues
|
///
|
||||||
/// or -1 if no ContRow
|
bool IsContRow(int cell);
|
||||||
int CellHasContRow(int cell);
|
/// returns the number of the cell which continues
|
||||||
///
|
/// or -1 if no ContRow
|
||||||
bool RowHasContRow(int cell);
|
int CellHasContRow(int cell);
|
||||||
///
|
///
|
||||||
int FirstVirtualCell(int cell);
|
bool RowHasContRow(int cell);
|
||||||
///
|
///
|
||||||
int NextVirtualCell(int cell);
|
int FirstVirtualCell(int cell);
|
||||||
///
|
///
|
||||||
bool ShouldBeVeryLastCell(int cell);
|
int NextVirtualCell(int cell);
|
||||||
///
|
///
|
||||||
bool ShouldBeVeryLastRow(int cell);
|
bool ShouldBeVeryLastCell(int cell);
|
||||||
///
|
///
|
||||||
int GetCellAbove(int cell);
|
bool ShouldBeVeryLastRow(int cell);
|
||||||
///
|
///
|
||||||
int GetCellNumber(int column, int row);
|
int GetCellAbove(int cell);
|
||||||
///
|
///
|
||||||
void SetLinebreaks(int cell, bool what);
|
int GetCellNumber(int column, int row);
|
||||||
///
|
///
|
||||||
bool Linebreaks(int cell);
|
void SetLinebreaks(int cell, bool what);
|
||||||
///
|
///
|
||||||
/// Long Table Options
|
bool Linebreaks(int cell);
|
||||||
///
|
///
|
||||||
void SetLTHead(int cell, bool first);
|
/// Long Table Options
|
||||||
///
|
///
|
||||||
bool RowOfLTHead(int cell);
|
void SetLTHead(int cell, bool first);
|
||||||
///
|
///
|
||||||
bool RowOfLTFirstHead(int cell);
|
bool RowOfLTHead(int cell);
|
||||||
///
|
///
|
||||||
void SetLTFoot(int cell, bool last);
|
bool RowOfLTFirstHead(int cell);
|
||||||
///
|
///
|
||||||
bool RowOfLTFoot(int cell);
|
void SetLTFoot(int cell, bool last);
|
||||||
///
|
///
|
||||||
bool RowOfLTLastFoot(int cell);
|
bool RowOfLTFoot(int cell);
|
||||||
///
|
///
|
||||||
void SetLTNewPage(int cell, bool what);
|
bool RowOfLTLastFoot(int cell);
|
||||||
///
|
///
|
||||||
bool LTNewPage(int cell);
|
void SetLTNewPage(int cell, bool what);
|
||||||
private:
|
///
|
||||||
///
|
bool LTNewPage(int cell);
|
||||||
struct cellstruct {
|
///
|
||||||
///
|
InsetText * GetCellInset(int cell) const;
|
||||||
int cellno;
|
///
|
||||||
///
|
|
||||||
int width_of_cell;
|
|
||||||
///
|
|
||||||
int multicolumn; // add approp. signedness
|
|
||||||
///
|
|
||||||
int alignment; // add approp. signedness
|
|
||||||
///
|
|
||||||
bool top_line;
|
|
||||||
///
|
|
||||||
bool bottom_line;
|
|
||||||
///
|
|
||||||
bool has_cont_row;
|
|
||||||
///
|
|
||||||
bool linebreaks;
|
|
||||||
///
|
|
||||||
int rotate;
|
|
||||||
///
|
|
||||||
string align_special;
|
|
||||||
///
|
|
||||||
string p_width; // this is only set for multicolumn!!!
|
|
||||||
};
|
|
||||||
///
|
|
||||||
struct rowstruct {
|
|
||||||
bool top_line;
|
|
||||||
bool bottom_line;
|
|
||||||
bool is_cont_row;
|
|
||||||
/// This are for longtables only
|
|
||||||
bool newpage;
|
|
||||||
};
|
|
||||||
///
|
|
||||||
struct columnstruct {
|
|
||||||
int alignment; // add approp. signedness
|
|
||||||
bool left_line;
|
|
||||||
bool right_line;
|
|
||||||
int width_of_column;
|
|
||||||
string p_width;
|
|
||||||
string align_special;
|
|
||||||
};
|
|
||||||
///
|
|
||||||
int numberofcells;
|
|
||||||
///
|
|
||||||
int * rowofcell;
|
|
||||||
///
|
|
||||||
int * columnofcell;
|
|
||||||
///
|
|
||||||
void set_row_column_number_info();
|
|
||||||
|
|
||||||
|
private: //////////////////////////////////////////////////////////////////
|
||||||
|
///
|
||||||
|
struct cellstruct {
|
||||||
///
|
///
|
||||||
rowstruct * row_info;
|
cellstruct(Buffer * buf = 0);
|
||||||
///
|
|
||||||
columnstruct * column_info;
|
|
||||||
///
|
|
||||||
cellstruct ** cell_info;
|
|
||||||
///
|
///
|
||||||
int width_of_table;
|
~cellstruct();
|
||||||
///
|
|
||||||
/// for long tables
|
|
||||||
///
|
|
||||||
int endhead; // row of endhead
|
|
||||||
int endfirsthead; // row of endfirsthead
|
|
||||||
int endfoot; // row of endfoot
|
|
||||||
int endlastfoot; // row of endlastfoot
|
|
||||||
|
|
||||||
/// Returns true if a complete update is necessary, otherwise false
|
|
||||||
bool SetWidthOfMulticolCell(int cell, int new_width);
|
|
||||||
void recalculateMulticolCells(int cell, int new_width);
|
|
||||||
/// Returns true if change
|
|
||||||
bool calculate_width_of_column(int column);
|
|
||||||
bool calculate_width_of_column_NMC(int column); // no multi cells
|
|
||||||
///
|
///
|
||||||
void calculate_width_of_table();
|
cellstruct & operator=(cellstruct const &);
|
||||||
|
|
||||||
///
|
|
||||||
int right_column_of_cell(int cell);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
cellstruct * cellinfo_of_cell(int cell);
|
int cellno;
|
||||||
|
|
||||||
///
|
///
|
||||||
void delete_column(int column);
|
int width_of_cell;
|
||||||
|
|
||||||
///
|
///
|
||||||
int cells_in_multicolumn(int cell);
|
int multicolumn; // add approp. signedness
|
||||||
///
|
///
|
||||||
int is_long_table;
|
int alignment; // add approp. signedness
|
||||||
|
///
|
||||||
|
bool top_line;
|
||||||
|
///
|
||||||
|
bool bottom_line;
|
||||||
|
///
|
||||||
|
bool has_cont_row;
|
||||||
|
///
|
||||||
|
bool linebreaks;
|
||||||
///
|
///
|
||||||
int rotate;
|
int rotate;
|
||||||
|
///
|
||||||
|
string align_special;
|
||||||
|
///
|
||||||
|
string p_width; // this is only set for multicolumn!!!
|
||||||
|
///
|
||||||
|
InsetText *inset;
|
||||||
|
};
|
||||||
|
///
|
||||||
|
struct rowstruct {
|
||||||
|
///
|
||||||
|
rowstruct();
|
||||||
|
///
|
||||||
|
~rowstruct();
|
||||||
|
///
|
||||||
|
rowstruct & operator=(rowstruct const &);
|
||||||
|
///
|
||||||
|
bool top_line;
|
||||||
|
bool bottom_line;
|
||||||
|
bool is_cont_row;
|
||||||
|
int ascent_of_row;
|
||||||
|
int descent_of_row;
|
||||||
|
/// This are for longtables only
|
||||||
|
bool newpage;
|
||||||
|
};
|
||||||
|
///
|
||||||
|
struct columnstruct {
|
||||||
|
///
|
||||||
|
columnstruct();
|
||||||
|
///
|
||||||
|
~columnstruct();
|
||||||
|
///
|
||||||
|
columnstruct & operator=(columnstruct const &);
|
||||||
|
///
|
||||||
|
int alignment; // add approp. signedness
|
||||||
|
bool left_line;
|
||||||
|
bool right_line;
|
||||||
|
int width_of_column;
|
||||||
|
string p_width;
|
||||||
|
string align_special;
|
||||||
|
};
|
||||||
|
///
|
||||||
|
int numberofcells;
|
||||||
|
///
|
||||||
|
int * rowofcell;
|
||||||
|
///
|
||||||
|
int * columnofcell;
|
||||||
|
///
|
||||||
|
rowstruct * row_info;
|
||||||
|
///
|
||||||
|
columnstruct * column_info;
|
||||||
|
///
|
||||||
|
cellstruct ** cell_info;
|
||||||
|
///
|
||||||
|
int width_of_table;
|
||||||
|
///
|
||||||
|
/// for long tables
|
||||||
|
///
|
||||||
|
int endhead; // row of endhead
|
||||||
|
int endfirsthead; // row of endfirsthead
|
||||||
|
int endfoot; // row of endfoot
|
||||||
|
int endlastfoot; // row of endlastfoot
|
||||||
|
///
|
||||||
|
Buffer *buffer;
|
||||||
|
|
||||||
|
///
|
||||||
|
void set_row_column_number_info();
|
||||||
|
/// Returns true if a complete update is necessary, otherwise false
|
||||||
|
bool SetWidthOfMulticolCell(int cell, int new_width);
|
||||||
|
void recalculateMulticolCells(int cell, int new_width);
|
||||||
|
/// Returns true if change
|
||||||
|
bool calculate_width_of_column(int column);
|
||||||
|
bool calculate_width_of_column_NMC(int column); // no multi cells
|
||||||
|
///
|
||||||
|
void calculate_width_of_table();
|
||||||
|
|
||||||
|
///
|
||||||
|
int right_column_of_cell(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
cellstruct * cellinfo_of_cell(int cell);
|
||||||
|
|
||||||
|
///
|
||||||
|
void delete_column(int column);
|
||||||
|
|
||||||
|
///
|
||||||
|
int cells_in_multicolumn(int cell);
|
||||||
|
///
|
||||||
|
int is_long_table;
|
||||||
|
///
|
||||||
|
int rotate;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
151
src/text2.C
151
src/text2.C
@ -3156,10 +3156,136 @@ void LyXText::SetCursor(LyXParagraph * par,
|
|||||||
DeleteEmptyParagraphMechanism(old_cursor);
|
DeleteEmptyParagraphMechanism(old_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LyXText::SetCursor(LyXCursor & cur, LyXParagraph * par,
|
||||||
|
LyXParagraph::size_type pos) const
|
||||||
|
{
|
||||||
|
// correct the cursor position if impossible
|
||||||
|
if (pos > par->Last()){
|
||||||
|
LyXParagraph * tmppar = par->ParFromPos(pos);
|
||||||
|
pos = par->PositionInParFromPos(pos);
|
||||||
|
par = tmppar;
|
||||||
|
}
|
||||||
|
if (par->IsDummy() && par->previous &&
|
||||||
|
par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
|
||||||
|
while (par->previous &&
|
||||||
|
((par->previous->IsDummy() &&
|
||||||
|
(par->previous->previous->footnoteflag ==
|
||||||
|
LyXParagraph::CLOSED_FOOTNOTE)) ||
|
||||||
|
(par->previous->footnoteflag ==
|
||||||
|
LyXParagraph::CLOSED_FOOTNOTE))) {
|
||||||
|
par = par->previous ;
|
||||||
|
if (par->IsDummy() &&
|
||||||
|
(par->previous->footnoteflag ==
|
||||||
|
LyXParagraph::CLOSED_FOOTNOTE))
|
||||||
|
pos += par->size() + 1;
|
||||||
|
}
|
||||||
|
if (par->previous) {
|
||||||
|
par = par->previous;
|
||||||
|
}
|
||||||
|
pos += par->size() + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur.par = par;
|
||||||
|
cur.pos = pos;
|
||||||
|
|
||||||
|
/* get the cursor y position in text */
|
||||||
|
long y = 0;
|
||||||
|
Row * row = GetRow(par, pos, y);
|
||||||
|
/* y is now the beginning of the cursor row */
|
||||||
|
y += row->baseline;
|
||||||
|
/* y is now the cursor baseline */
|
||||||
|
cur.y = y;
|
||||||
|
|
||||||
|
/* now get the cursors x position */
|
||||||
|
float x;
|
||||||
|
float fill_separator, fill_hfill, fill_label_hfill;
|
||||||
|
PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
|
||||||
|
LyXParagraph::size_type cursor_vpos;
|
||||||
|
LyXParagraph::size_type last = RowLastPrintable(row);
|
||||||
|
|
||||||
|
if (pos > last + 1) // This shouldn't happen.
|
||||||
|
pos = last+1;
|
||||||
|
|
||||||
|
if (last < row->pos)
|
||||||
|
cursor_vpos = 0;
|
||||||
|
else if ((pos > last) ||
|
||||||
|
((pos - 1 >= row->pos) &&
|
||||||
|
(row->par->IsSeparator(pos) ||
|
||||||
|
(row->par->table && row->par->IsNewline(pos)))))
|
||||||
|
/// Place cursor after char at (logical) position pos-1
|
||||||
|
cursor_vpos = !(bidi_level(pos-1) % 2)
|
||||||
|
? log2vis(pos-1) + 1 : log2vis(pos-1);
|
||||||
|
else
|
||||||
|
/// Place cursor before char at (logical) position pos
|
||||||
|
cursor_vpos = !(bidi_level(pos) % 2)
|
||||||
|
? log2vis(pos) : log2vis(pos) + 1;
|
||||||
|
|
||||||
|
/* table stuff -- begin*/
|
||||||
|
if (row->par->table) {
|
||||||
|
int cell = NumberOfCell(row->par, row->pos);
|
||||||
|
float x_old = x;
|
||||||
|
x += row->par->table->GetBeginningOfTextInCell(cell);
|
||||||
|
for (LyXParagraph::size_type vpos = row->pos;
|
||||||
|
vpos < cursor_vpos; ++vpos) {
|
||||||
|
pos = vis2log(vpos);
|
||||||
|
if (row->par->IsNewline(pos)) {
|
||||||
|
x = x_old + row->par->table->WidthOfColumn(cell);
|
||||||
|
x_old = x;
|
||||||
|
++cell;
|
||||||
|
x += row->par->table->GetBeginningOfTextInCell(cell);
|
||||||
|
} else {
|
||||||
|
x += SingleWidth(row->par, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* table stuff -- end*/
|
||||||
|
LyXParagraph::size_type main_body =
|
||||||
|
BeginningOfMainBody(row->par);
|
||||||
|
if ((main_body > 0) &&
|
||||||
|
((main_body-1 > last) ||
|
||||||
|
!row->par->IsLineSeparator(main_body-1)))
|
||||||
|
main_body = 0;
|
||||||
|
|
||||||
|
for (LyXParagraph::size_type vpos = row->pos;
|
||||||
|
vpos < cursor_vpos; ++vpos) {
|
||||||
|
pos = vis2log(vpos);
|
||||||
|
if (main_body > 0 && pos == main_body-1) {
|
||||||
|
x += fill_label_hfill +
|
||||||
|
lyxfont::width(textclasslist.Style(
|
||||||
|
buffer->params.textclass,
|
||||||
|
row->par->GetLayout())
|
||||||
|
.labelsep,
|
||||||
|
GetFont(row->par, -2));
|
||||||
|
if (row->par->IsLineSeparator(main_body-1))
|
||||||
|
x -= SingleWidth(row->par,main_body-1);
|
||||||
|
}
|
||||||
|
if (HfillExpansion(row, pos)) {
|
||||||
|
x += SingleWidth(row->par, pos);
|
||||||
|
if (pos >= main_body)
|
||||||
|
x += fill_hfill;
|
||||||
|
else
|
||||||
|
x += fill_label_hfill;
|
||||||
|
} else if (row->par->IsSeparator(pos)) {
|
||||||
|
x += SingleWidth(row->par, pos);
|
||||||
|
if (pos >= main_body)
|
||||||
|
x += fill_separator;
|
||||||
|
} else
|
||||||
|
x += SingleWidth(row->par, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cur.x = int(x);
|
||||||
|
cur.x_fix = cur.x;
|
||||||
|
cur.row = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LyXText::SetCursorIntern(LyXParagraph * par,
|
void LyXText::SetCursorIntern(LyXParagraph * par,
|
||||||
LyXParagraph::size_type pos, bool setfont) const
|
LyXParagraph::size_type pos, bool setfont) const
|
||||||
{
|
{
|
||||||
|
SetCursor(cursor, par, pos);
|
||||||
|
#warning Remove this when verified working (Jug 20000413)
|
||||||
|
#if 0
|
||||||
// correct the cursor position if impossible
|
// correct the cursor position if impossible
|
||||||
if (pos > par->Last()){
|
if (pos > par->Last()){
|
||||||
LyXParagraph * tmppar = par->ParFromPos(pos);
|
LyXParagraph * tmppar = par->ParFromPos(pos);
|
||||||
@ -3185,18 +3311,6 @@ void LyXText::SetCursorIntern(LyXParagraph * par,
|
|||||||
cursor.par = par;
|
cursor.par = par;
|
||||||
cursor.pos = pos;
|
cursor.pos = pos;
|
||||||
|
|
||||||
if (setfont)
|
|
||||||
if (cursor.pos &&
|
|
||||||
(cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
|
|
||||||
|| (cursor.par->table && cursor.par->IsNewline(cursor.pos))
|
|
||||||
)) {
|
|
||||||
current_font = cursor.par->GetFontSettings(cursor.pos - 1);
|
|
||||||
real_current_font = GetFont(cursor.par, cursor.pos - 1);
|
|
||||||
} else {
|
|
||||||
current_font = cursor.par->GetFontSettings(cursor.pos);
|
|
||||||
real_current_font = GetFont(cursor.par, cursor.pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the cursor y position in text */
|
/* get the cursor y position in text */
|
||||||
long y = 0;
|
long y = 0;
|
||||||
Row * row = GetRow(par, pos, y);
|
Row * row = GetRow(par, pos, y);
|
||||||
@ -3287,6 +3401,19 @@ void LyXText::SetCursorIntern(LyXParagraph * par,
|
|||||||
|
|
||||||
cursor.x_fix = cursor.x;
|
cursor.x_fix = cursor.x;
|
||||||
cursor.row = row;
|
cursor.row = row;
|
||||||
|
#endif
|
||||||
|
if (setfont) {
|
||||||
|
if (cursor.pos &&
|
||||||
|
(cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
|
||||||
|
|| (cursor.par->table && cursor.par->IsNewline(cursor.pos))
|
||||||
|
)) {
|
||||||
|
current_font = cursor.par->GetFontSettings(cursor.pos - 1);
|
||||||
|
real_current_font = GetFont(cursor.par, cursor.pos - 1);
|
||||||
|
} else {
|
||||||
|
current_font = cursor.par->GetFontSettings(cursor.pos);
|
||||||
|
real_current_font = GetFont(cursor.par, cursor.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user