// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2000 The LyX Team.
+/**
+ * \file BufferView.h
+ * Copyright 2002 the LyX Team
+ * Read the file COPYING
*
- * ====================================================== */
+ * \author Lars Gullik Bjønnes
+*/
#ifndef BUFFER_VIEW_H
#define BUFFER_VIEW_H
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#include FORMS_H_LOCATION
-#include "BackStack.h"
-#include "LaTeX.h"
+#include "LString.h"
#include "undo.h"
-#include "UpdateInset.h"
+#include "insets/inset.h"
+
+#include <boost/utility.hpp>
+
+class Change;
class LyXView;
+class LyXText;
+class TeXErrors;
class Buffer;
class LyXScreen;
-class Inset;
-class LyXText;
-class WorkArea;
+class Language;
+class Painter;
+class UpdatableInset;
+class WordLangTuple;
+class Encoding;
-///
-class BufferView {
+/**
+ * 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(LyXView * owner, int , int , int, int);
- ///
+ /**
+ * Codes to store necessary pending updates
+ * of the document rendering.
+ */
+ enum UpdateCodes {
+ UPDATE = 0, //< FIXME
+ SELECT = 1, //< selection change
+ FITCUR = 2, //< the cursor needs fitting into the view
+ CHANGE = 4 //< document data has changed
+ };
+
+ /**
+ * Create a view with the given owner main window,
+ * of the given dimensions.
+ */
+ BufferView(LyXView * owner, int x, int y, int w, int h);
+
~BufferView();
- ///
- Buffer * buffer() const { return buffer_; }
- ///
- Painter & painter();
- ///
- Painter & getPainter() const;
- ///
+
+ /// set the buffer we are viewing
void buffer(Buffer * b);
- ///
- void resize(int, int, int, int);
- ///
+ /// return the buffer being viewed
+ Buffer * buffer() const;
+
+ /// return the painter object for drawing onto the view
+ Painter & painter() const;
+ /// return the screen object for handling re-drawing
+ LyXScreen & screen() const;
+ /// return the owning main view
+ LyXView * owner() const;
+
+ /// resize event has happened
void resize();
- ///
- void redraw();
- ///
- void fitCursor();
- ///
+ /**
+ * Repaint the pixmap. Used for when we don't want
+ * to go through the full update() logic, just a simple
+ * repaint of the whole screen.
+ */
+ void repaint();
+
+ /// fit the user cursor within the visible view
+ bool fitCursor();
+ /// perform pending painting updates
void update();
- ///
- void update(signed char f);
- ///
- void smallUpdate(signed char f);
- ///
+ // update for a particular lyxtext
+ void update(LyXText *, UpdateCodes uc);
+ /// update for a particular inset
+ void updateInset(Inset * inset, bool mark_dirty);
+ /// reset the scrollbar to reflect current view position
void updateScrollbar();
- ///
+ /// FIXME
void redoCurrentBuffer();
- ///
- int resizeCurrentBuffer();
- ///
- void gotoError();
- ///
- void cursorPrevious();
- ///
- void cursorNext();
- ///
+
+ /// FIXME
bool available() const;
- ///
- LyXView * owner() const { return owner_; }
- ///
- void beforeChange();
- ///
- void savePosition();
- ///
- void restorePosition();
- /** This holds the mapping between buffer paragraphs and screen rows.
- This should be private...but not yet. (Lgb)
- */
+
+ /// FIXME
+ void beforeChange(LyXText *);
+
+ /// 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);
+
+ /// return the current change at the cursor
+ Change const getCurrentChange();
+
+ /**
+ * This holds the mapping between buffer paragraphs and screen rows.
+ * This should be private...but not yet. (Lgb)
+ */
LyXText * text;
- ///
- unsigned short paperWidth() const;
- ///
- UpdatableInset * the_locking_inset;
- ///
- void updateInset(Inset * inset, bool mark_dirty);
- ///
- bool inset_slept;
- ///
- int slx;
- ///
- int sly;
- ///
+ /// return the lyxtext we are using
+ LyXText * getLyXText() const;
+
+ /// Return the current inset we are "locked" in
+ UpdatableInset * theLockingInset() const;
+ /// lock the given inset FIXME: return value ?
+ bool lockInset(UpdatableInset * inset);
+ /// unlock the given inset
+ int unlockInset(UpdatableInset * inset);
+ /// unlock the currently locked inset
void insetUnlock();
- ///
- void insetSleep();
- ///
- void insetWakeup();
- ///
+
+ /// return the current encoding at the cursor
+ Encoding const * getEncoding() const;
+
+ /// return the parent language of the given inset
+ Language const * getParentLanguage(Inset * inset) const;
+
+ /// Select the "current" word
+ void selectLastWord();
+ /// replace the currently selected word
void replaceWord(string const & replacestring);
- ///
+ /// Update after spellcheck finishes
void endOfSpellCheck();
- ///
- void selectLastWord();
- ///
- char * nextWord(float & value);
- ///
- void insertCorrectQuote();
- ///
- void gotoNote();
- ///
+ /// return the next word
+ WordLangTuple const nextWord(float & value);
+
+ /// move cursor to the named label
bool gotoLabel(string const & label);
- ///
- void paste();
- ///
- void cut();
- ///
- void copy();
- ///
- void pasteEnvironment();
- ///
+
+ /// copy the environment type from current paragraph
void copyEnvironment();
- ///
- void hfill();
- ///
- void protectedBlank();
- ///
- void newline();
- ///
- void menuSeparator();
- ///
- void endOfSentenceDot();
- ///
- void ldots();
- ///
- void hyphenationPoint();
- ///
- void menuUndo();
- ///
- void menuRedo();
- ///
- void toggleFloat();
- ///
- void openStuff();
- ///
- void insertNote();
- ///
- void allFloats(char flag, char figmar);
+ /// set the current paragraph's environment type
+ void pasteEnvironment();
+
+ /// undo last action
+ void undo();
+ /// redo last action
+ void redo();
+
/// removes all autodeletable insets
bool removeAutoInsets();
- ///
+ /// insert all errors found when running latex
void insertErrors(TeXErrors & terr);
- ///
+ /// set the cursor based on the given TeX source row
void setCursorFromRow(int row);
- /** Insert an inset into the buffer
- Insert inset into buffer, placing it in a layout of lout,
- if no_table make sure that it doesn't end up in a table. */
- void insertInset(Inset * inset, string const & lout = string(),
- bool no_table = false);
- /// open and lock an updatable inset
- void open_new_inset(UpdatableInset * new_inset);
- /// Inserts a lyx file at cursor position. Returns false if it fails.
+
+ /**
+ * Insert an inset into the buffer.
+ * Place it in a layout of lout,
+ */
+ bool insertInset(Inset * inset, string const & lout = string());
+
+ /// Inserts a lyx file at cursor position. return false if it fails
bool insertLyXFile(string const & file);
- ///
- int lockInset(UpdatableInset * inset);
- ///
- void showLockedInsetCursor(long x, long y, int asc, int desc);
- ///
- void hideLockedInsetCursor();
- ///
- void fitLockedInsetCursor(long x, long y, int asc, int desc);
- ///
- int unlockInset(UpdatableInset * inset);
- ///
- void lockedInsetStoreUndo(Undo::undo_kind kind);
- ///
+
+ /// show the user cursor
void showCursor();
- ///
+ /// hide the user cursor
void hideCursor();
- ///
+ /// FIXME
+ void showLockedInsetCursor(int x, int y, int asc, int desc);
+ /// FIXME
+ void hideLockedInsetCursor();
+ /// FIXME
+ bool fitLockedInsetCursor(int x, int y, int asc, int desc);
+ /// FIXME
+ void lockedInsetStoreUndo(Undo::undo_kind kind);
+ /// FIXME
void toggleSelection(bool = true);
- ///
+ /// FIXME: my word !
void toggleToggle();
- ///
+
+ /// center the document view around the cursor
void center();
-
-private:
- friend class WorkArea;
-
- /// Update pixmap of screen
- void updateScreen();
- ///
- void workAreaExpose();
- ///
- void scrollUpOnePage();
- ///
- void scrollDownOnePage();
- ///
- void create_view();
- ///
- Inset * checkInsetHit(int & x, int & y);
- ///
- int scrollUp(long time);
- ///
- int scrollDown(long time);
+ /// 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);
-public:
- ///
- bool focus() const;
- ///
- void focus(bool);
- ///
- bool active() const;
- ///
- bool belowMouse() const;
- /// A callback for the up arrow in the scrollbar.
- void upCB(long time, int button);
- /// A callback for the slider in the scrollbar.
- void scrollCB(double);
- /// A callback for the down arrow in the scrollbar.
- void downCB(long time, int button);
-
- ///
- static void cursorToggleCB(FL_OBJECT * ob, long);
-
- ///
- void setState();
+ /// 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();
+
+ /// FIXME
+ bool ChangeRefsIfUnique(string const & from, string const & to);
+ /// FIXME
+ bool ChangeCitationsIfUnique(string const & from, string const & to);
+
+ /// get the contents of the window system clipboard
+ string const getClipboard() const;
+ /// fill the window system clipboard
+ void stuffClipboard(string const &) const;
+ /// tell the window system we have a selection
+ void haveSelection(bool sel);
+
+ /// execute the given function
+ bool dispatch(FuncRequest const & argument);
private:
- ///
- void workAreaMotionNotify(int x, int y, unsigned int state);
- ///
- void workAreaButtonPress(int x, int y, unsigned int button);
- ///
- void workAreaButtonRelease(int x, int y, unsigned int button);
- ///
- void workAreaSelectionNotify(Window win, XEvent * event);
- ///
- void doubleClick(int x, int y, unsigned int button);
- ///
- void trippleClick(int x, int y, unsigned int button);
- ///
- LyXView * owner_;
- ///
- Buffer * buffer_;
- ///
- LyXScreen * screen;
- ///
- long current_scrollbar_value;
- ///
- bool lyx_focus;
- ///
- bool work_area_focus;
- ///
- FL_OBJECT * figinset_canvas;
- ///
- FL_OBJECT * timer_cursor;
- ///
- BackStack backstack;
- ///
- int last_click_x, last_click_y;
- ///
- WorkArea * workarea;
- ///
- UpdateInset updatelist;
-public:
- ///
- void pushIntoUpdateList(Inset * i) {
- updatelist.push(i);
- }
+ /// Set the current locking inset
+ void theLockingInset(UpdatableInset * inset);
+
+ /// return the lyxtext containing this inset
+ LyXText * getParentText(Inset * inset) const;
+
+ /**
+ * Change all insets with the given code's contents to a new
+ * string. May only be used with InsetCommand-derived insets
+ * Returns true if a screen update is needed.
+ */
+ bool ChangeInsets(Inset::Code code, string const & from,
+ string const & to);
+
+
+ struct Pimpl;
+ friend struct BufferView::Pimpl;
+
+ Pimpl * pimpl_;
};
-#endif
+
+BufferView::UpdateCodes operator|(BufferView::UpdateCodes uc1,
+ BufferView::UpdateCodes uc2);
+
+#endif // BUFFERVIEW_H