lyx_mirror/src/BufferView.h

296 lines
7.1 KiB
C
Raw Normal View History

// -*- C++ -*-
/**
* \file BufferView.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Alfredo Braustein
* \author Lars Gullik Bj<EFBFBD>nnes
* \author John Levon
* \author J<EFBFBD>rgen Vigna
*
* Full author contact details are available in file CREDITS.
*/
#ifndef BUFFER_VIEW_H
#define BUFFER_VIEW_H
#include "coordcache.h"
#include "cursor.h"
#include "metricsinfo.h"
#include "support/types.h"
#include <boost/utility.hpp>
#include <boost/signal.hpp>
#include <string>
class Buffer;
class Change;
class DocIterator;
class FuncRequest;
class FuncStatus;
class Intl;
class Language;
class LCursor;
class LyXText;
class ParIterator;
class ViewMetricsInfo;
namespace Update {
enum flags {
FitCursor = 1,
Force = 2,
SinglePar = 4,
MultiParSel = 8
};
inline flags operator|(flags const f, flags const g)
{
return static_cast<flags>(int(f) | int(g));
}
inline flags operator&(flags const f, flags const g)
{
return static_cast<flags>(int(f) & int(g));
}
} // namespace
/// Scrollbar Parameters
struct ScrollbarParameters
{
void reset(int h = 0, int p = 0, int l = 0)
{
height = h;
position = p;
lineScrollHeight = l;
}
/// The total document height in pixels
int height;
/// The current position in the document, in pixels
int position;
/// the line-scroll amount, in pixels
int lineScrollHeight;
};
/**
* A buffer view encapsulates a view onto a particular
* buffer, and allows access to operate upon it. A view
* is a sliding window of the entire document rendering.
*
* Eventually we will allow several views onto a single
* buffer, but not yet.
*/
class BufferView : boost::noncopyable {
public:
BufferView();
~BufferView();
/// set the buffer we are viewing
void setBuffer(Buffer * b);
/// return the buffer being viewed
Buffer * buffer() const;
/// resize event has happened
void resize();
/// reload the contained buffer
void reload();
/// load a buffer into the view
bool loadLyXFile(std::string const & name, bool tolastfiles = true);
/** perform pending painting updates. \c fitcursor means first
* to do a fitcursor, and to force an update if screen
* position changes. \c forceupdate means to force an update
* in any case.
* \return true if a full updateMetrics() is needed.
*/
bool update(Update::flags flags = Update::FitCursor | Update::Force);
/// move the screen to fit the cursor. Only to be called with
/// good y coordinates (after a bv::metrics)
bool fitCursor();
/// reset the scrollbar to reflect current view position
void updateScrollbar();
/// return the Scrollbar Parameters
ScrollbarParameters const & scrollbarParameters() const;
/// Save the current position as bookmark i
void savePosition(unsigned int i);
/// Restore the position from bookmark i
void restorePosition(unsigned int i);
/// does the given bookmark have a saved position ?
bool isSavedPosition(unsigned int i);
/// save bookmarks to .lyx/session
void saveSavedPositions();
/// return the current change at the cursor
Change const getCurrentChange() const;
/// return the lyxtext we are using
LyXText * getLyXText();
/// return the lyxtext we are using
LyXText const * getLyXText() const;
/// move cursor to the named label
void gotoLabel(lyx::docstring const & label);
/// set the cursor based on the given TeX source row
void setCursorFromRow(int row);
/// center the document view around the cursor
void center();
/// scroll document by the given number of lines of default height
void scroll(int lines);
/// Scroll the view by a number of pixels
void scrollDocView(int pixels);
/// Set the cursor position based on the scrollbar one.
void setCursorFromScrollbar();
/// return the pixel width of the document view
int workWidth() const;
/// return the pixel height of the document view
int workHeight() const;
/// switch between primary and secondary keymaps for RTL entry
void switchKeyMap();
/// return true for events that will handle
FuncStatus getStatus(FuncRequest const & cmd);
/// execute the given function
bool dispatch(FuncRequest const & argument);
///
lyx::docstring const requestSelection();
///
void clearSelection();
///
void workAreaResize(int width, int height);
/// a function should be executed from the workarea
bool workAreaDispatch(FuncRequest const & ev);
/// access to anchor
lyx::pit_type anchor_ref() const;
/// access to full cursor
LCursor & cursor();
/// access to full cursor
LCursor const & cursor() const;
/// sets cursor and open all relevant collapsable insets.
void setCursor(DocIterator const &);
/// sets cursor; this is used when handling LFUN_MOUSE_PRESS.
void mouseSetCursor(LCursor & cur);
/* Sets the selection. When \c backwards == false, set anchor
* to \c cur and cursor to \c cur + \c length. When \c
* backwards == true, set anchor to \c cur and cursor to \c
* cur + \c length.
*/
void putSelectionAt(DocIterator const & cur,
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
int length, bool backwards);
///
ViewMetricsInfo const & viewMetricsInfo();
///
void updateMetrics(bool singlepar = false);
///
lyx::CoordCache & coordCache() {
return coord_cache_;
}
///
lyx::CoordCache const & coordCache() const {
return coord_cache_;
}
/// get this view's keyboard map handler
Intl & getIntl() { return *intl_.get(); }
///
Intl const & getIntl() const { return *intl_.get(); }
/// This signal is emitted when some message shows up.
boost::signal<void(lyx::docstring)> message;
/// This signal is emitted when some dialog needs to be shown.
boost::signal<void(std::string name)> showDialog;
/// This signal is emitted when some dialog needs to be shown with
/// some data
boost::signal<void(std::string name,
std::string data)> showDialogWithData;
/// This signal is emitted when some inset dialogs needs to be shown.
boost::signal<void(std::string name, std::string data,
InsetBase * inset)> showInsetDialog;
/// This signal is emitted when some dialogs needs to be updated.
boost::signal<void(std::string name,
std::string data)> updateDialog;
/// This signal is emitted when the layout at the cursor is changed.
boost::signal<void(std::string layout)> layoutChanged;
private:
///
bool multiParSel();
///
int width_;
///
int height_;
///
ScrollbarParameters scrollbarParameters_;
///
ViewMetricsInfo metrics_info_;
lyx::CoordCache coord_cache_;
///
Buffer * buffer_;
/// Estimated average par height for scrollbar
int wh_;
///
class Position {
public:
/// Filename
std::string filename;
/// Cursor paragraph Id
int par_id;
/// Cursor position
lyx::pos_type par_pos;
///
Position() : par_id(0), par_pos(0) {}
///
Position(std::string const & f, int id, lyx::pos_type pos)
: filename(f), par_id(id), par_pos(pos) {}
};
///
std::vector<Position> saved_positions;
///
void menuInsertLyXFile(std::string const & filen);
/// this is used to handle XSelection events in the right manner
struct {
CursorSlice cursor;
CursorSlice anchor;
bool set;
} xsel_cache_;
///
LCursor cursor_;
///
bool multiparsel_cache_;
///
lyx::pit_type anchor_ref_;
///
int offset_ref_;
/// keyboard mapping object
boost::scoped_ptr<Intl> const intl_;
};
#endif // BUFFERVIEW_H