#ifndef INSETBASE_H
#define INSETBASE_H
+#include "ColorCode.h"
#include "InsetCode.h"
-#include "Dimension.h"
+#include "support/strfwd.h"
-#include "support/docstream.h"
+#include <boost/shared_ptr.hpp>
-#include <memory>
#include <vector>
namespace lyx {
class BufferParams;
class BufferView;
class Change;
-class Color_color;
class Cursor;
class CursorSlice;
+class Dimension;
class FuncRequest;
class FuncStatus;
+class InsetCollapsable;
class InsetIterator;
class InsetLayout;
class InsetList;
class Text;
class TocList;
class EmbeddedFile;
-class EmbeddedFiles;
+class EmbeddedFileList;
namespace graphics { class PreviewLoader; }
class Inset {
public:
+ ///
+ enum EntryDirection {
+ ENTRY_DIRECTION_IGNORE,
+ ENTRY_DIRECTION_RIGHT,
+ ENTRY_DIRECTION_LEFT,
+ };
///
typedef ptrdiff_t difference_type;
/// short of anything else reasonable
virtual InsetMath * asInsetMath() { return 0; }
/// true for 'math' math inset, but not for e.g. mbox
virtual bool inMathed() const { return false; }
- /// is this inset based on the TextInset class?
- virtual InsetText * asTextInset() { return 0; }
- /// is this inset based on the TextInset class?
- virtual InsetText const * asTextInset() const { return 0; }
-
+ /// is this inset based on the InsetText class?
+ virtual InsetText * asInsetText() { return 0; }
+ /// is this inset based on the InsetText class?
+ virtual InsetText const * asInsetText() const { return 0; }
+ /// is this inset based on the InsetCollapsable class?
+ virtual InsetCollapsable * asInsetCollapsable() { return 0; }
+ /// is this inset based on the InsetCollapsable class?
+ virtual InsetCollapsable const * asInsetCollapsable() const { return 0; }
+
/// the real dispatcher
void dispatch(Cursor & cur, FuncRequest & cmd);
/**
FuncStatus & status) const;
/// cursor enters
- virtual void edit(Cursor & cur, bool left);
+ virtual void edit(Cursor & cur, bool front,
+ EntryDirection entry_from = ENTRY_DIRECTION_IGNORE);
/// cursor enters
virtual Inset * editXY(Cursor & cur, int x, int y);
/// draw inset selection if necessary
virtual void drawSelection(PainterInfo &, int, int) const {}
///
- virtual bool editing(BufferView * bv) const;
+ virtual bool editing(BufferView const * bv) const;
///
virtual bool showInsetDialog(BufferView *) const { return false; }
virtual bool isFreeSpacing() const { return false; }
///
virtual bool allowEmpty() const { return false; }
+ /// Force inset into LTR environment if surroundings are RTL?
+ virtual bool forceLTR() const { return false; }
/// is this an inset that can be moved into?
/// FIXME: merge with editable()
virtual bool isActive() const { return nargs() > 0; }
/// Where should we go when we press the up or down cursor key?
virtual bool idxUpDown(Cursor & cur, bool up) const;
- /// Move one cell to the left
- virtual bool idxLeft(Cursor &) const { return false; }
- /// Move one cell to the right
- virtual bool idxRight(Cursor &) const { return false; }
+ /// Move one cell backwards
+ virtual bool idxBackward(Cursor &) const { return false; }
+ /// Move one cell forward
+ virtual bool idxForward(Cursor &) const { return false; }
- /// Move one physical cell up
+ /// Move to the next cell
virtual bool idxNext(Cursor &) const { return false; }
- /// Move one physical cell down
+ /// Move to the previous cell
virtual bool idxPrev(Cursor &) const { return false; }
- /// Target pos when we enter the inset from the left by pressing "Right"
+ /// Target pos when we enter the inset while moving forward
virtual bool idxFirst(Cursor &) const { return false; }
- /// Target pos when we enter the inset from the right by pressing "Left"
+ /// Target pos when we enter the inset while moving backwards
virtual bool idxLast(Cursor &) const { return false; }
/// Delete a cell and move cursor
/// number of columns in gridlike structures
virtual size_t ncols() const { return 0; }
/// is called when the cursor leaves this inset
- // returns true if cursor is now invalid.
+ /// returns true if cursor is now invalid. The cursor parameter
+ /// is _not_ necessarily pointing to the inset.
virtual bool notifyCursorLeaves(Cursor &) { return false; }
/// is called when the mouse enter or leave this inset
/// return true if this inset needs repaint
/// return true if the inset should be removed automatically
virtual bool autoDelete() const;
+ class CompletionList {
+ public:
+ ///
+ virtual ~CompletionList() {}
+ ///
+ virtual size_t size() const =0;
+ /// returns the string shown in the gui.
+ virtual docstring data(size_t idx) const =0;
+ /// returns the resource string used to load an icon.
+ virtual std::string icon(size_t /*idx*/) const { return std::string(); }
+ };
+
+ /// Returns true if the inset supports completions.
+ virtual bool completionSupported(Cursor const &) const { return false; }
+ /// Returns true if the inset supports inline completions at the
+ /// cursor position. In this case the completion might be stored
+ /// in the BufferView's inlineCompletion property.
+ virtual bool inlineCompletionSupported(Cursor const & /*cur*/) const
+ { return false; }
+ /// Return true if the inline completion should be automatic.
+ virtual bool automaticInlineCompletion() const { return true; }
+ /// Return true if the popup completion should be automatic.
+ virtual bool automaticPopupCompletion() const { return true; }
+ /// Returns completion suggestions at cursor position. Return an
+ /// null pointer if no completion is a available or possible.
+ /// The caller is responsible to free the returned object!
+ virtual CompletionList const * completionList(Cursor const &) const
+ { return 0; }
+ /// Returns the completion prefix to filter the suggestions for completion.
+ /// This is only called if completionList returned a non-null list.
+ virtual docstring completionPrefix(Cursor const &) const
+ { return docstring(); }
+ /// Do a completion at the cursor position. Return true on success.
+ /// The completion does not contain the prefix. If finished is true, the
+ /// completion is final. If finished is false, completion might only be
+ /// a partial completion.
+ virtual bool insertCompletion(Cursor & /*cur*/,
+ docstring const & /*completion*/, bool /*finished*/)
+ { return false; }
+ /// Get the completion inset position and size
+ virtual void completionPosAndDim(Cursor const &, int & /*x*/, int & /*y*/,
+ Dimension & /*dim*/) const {}
+
/// returns true if the inset can hold an inset of given type
virtual bool insetAllowed(InsetCode) const { return false; }
- /// if this inset has paragraphs should they be output all as default
- /// paragraphs with the default layout of the text class?
- virtual bool forceDefaultParagraphs(idx_type) const { return false; }
+ /// should this inset use the empty layout by default rather than
+ /// the standard layout? (default: only if that is forced.)
+ virtual bool useEmptyLayout() const { return forceEmptyLayout(); }
+ /// if this inset has paragraphs should they be forced to use the
+ /// empty layout?
+ virtual bool forceEmptyLayout() const { return false; }
+ /// if this inset has paragraphs should the user be allowed to
+ /// customize alignment, etc?
+ virtual bool allowParagraphCustomization(idx_type) const { return true; }
/// Is the width forced to some value?
virtual bool hasFixedWidth() const { return false; }
+ /// \return Tool tip for this inset.
+ /// This default implementation returns an empty string.
+ virtual docstring toolTip(BufferView const & bv, int x, int y) const;
+
+ /// \return Context menu identifier for this inset.
+ /// This default implementation returns an empty string.
+ virtual docstring contextMenu(BufferView const & bv, int x, int y) const;
+
+ // FIXME This should really disappear in favor of
+ // docstring name() const { return from_ascii(insetName(lyxCode()))); }
+ // There's no reason to be using different names in different places.
+ // But to do this we would need to change the file format, since the names
+ // used there don't correspond to what is used here.
///
- virtual docstring name() const { return from_ascii("unknown"); }
+ virtual docstring name() const;
///
virtual InsetLayout const & getLayout(BufferParams const & bp) const;
/// used to toggle insets
virtual void addPreview(graphics::PreviewLoader &) const {}
/// Add an entry to the TocList
/// pit is the ParConstIterator of the paragraph containing the inset
- virtual void addToToc(TocList &, Buffer const &, ParConstIterator const &) const {}
+ virtual void addToToc(Buffer const &, ParConstIterator const &) const {}
/// report files that can be embedded with the lyx file
- virtual void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const {};
+ virtual void registerEmbeddedFiles(Buffer const &, EmbeddedFileList &) const {}
/// use embedded or external file after the embedding status of a file is changed
virtual void updateEmbeddedFile(Buffer const &, EmbeddedFile const &) {}
/// Fill keys with BibTeX information
virtual void fillWithBibKeys(Buffer const &,
- BiblioInfo &, InsetIterator const &) const { return; }
+ BiblioInfo &, InsetIterator const &) const {}
/// Update the counters of this inset and of its contents
virtual void updateLabels(Buffer const &, ParIterator const &) {}
+ /// Updates the inset's dialog
+ virtual Buffer const * updateFrontend() const;
public:
/// returns LyX code associated with the inset. Used for TOC, ...)
///
int scroll() const { return 0; }
///
- virtual Color_color backgroundColor() const;
+ virtual ColorCode backgroundColor() const;
///
enum CollapseStatus {
Collapsed,
enum { TEXT_TO_INSET_OFFSET = 4 };
protected:
- Inset();
+ Inset() {}
/// replicate ourselves
friend class InsetList;