252 lines
8.9 KiB
C++
252 lines
8.9 KiB
C++
// Scintilla source code edit control
|
|
/** @file ViewStyle.h
|
|
** Store information on how the document is to be viewed.
|
|
**/
|
|
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
|
// The License.txt file describes the conditions under which this software may be distributed.
|
|
|
|
#ifndef VIEWSTYLE_H
|
|
#define VIEWSTYLE_H
|
|
|
|
namespace Scintilla::Internal {
|
|
|
|
/**
|
|
*/
|
|
class MarginStyle {
|
|
public:
|
|
Scintilla::MarginType style;
|
|
ColourRGBA back;
|
|
int width;
|
|
int mask;
|
|
bool sensitive;
|
|
Scintilla::CursorShape cursor;
|
|
MarginStyle(Scintilla::MarginType style_= Scintilla::MarginType::Symbol, int width_=0, int mask_=0) noexcept;
|
|
bool ShowsFolding() const noexcept;
|
|
};
|
|
|
|
/**
|
|
*/
|
|
|
|
|
|
class FontRealised {
|
|
public:
|
|
FontMeasurements measurements;
|
|
std::shared_ptr<Font> font;
|
|
void Realise(Surface &surface, int zoomLevel, Scintilla::Technology technology, const FontSpecification &fs, const char *localeName);
|
|
};
|
|
|
|
typedef std::map<FontSpecification, std::unique_ptr<FontRealised>> FontMap;
|
|
|
|
inline std::optional<ColourRGBA> OptionalColour(Scintilla::uptr_t wParam, Scintilla::sptr_t lParam) {
|
|
if (wParam) {
|
|
return ColourRGBA::FromIpRGB(lParam);
|
|
} else {
|
|
return {};
|
|
}
|
|
}
|
|
|
|
struct SelectionAppearance {
|
|
// Whether to draw on base layer or over text
|
|
Scintilla::Layer layer = Layer::Base;
|
|
// Draw selection past line end characters up to right border
|
|
bool eolFilled = false;
|
|
};
|
|
|
|
struct CaretLineAppearance {
|
|
// Whether to draw on base layer or over text
|
|
Scintilla::Layer layer = Layer::Base;
|
|
// Also show when non-focused
|
|
bool alwaysShow = false;
|
|
// highlight sub line instead of whole line
|
|
bool subLine = false;
|
|
// Non-0: draw a rectangle around line instead of filling line. Value is pixel width of frame
|
|
int frame = 0;
|
|
};
|
|
|
|
struct CaretAppearance {
|
|
// Line, block, over-strike bar ...
|
|
Scintilla::CaretStyle style = CaretStyle::Line;
|
|
// Width in pixels
|
|
int width = 1;
|
|
};
|
|
|
|
struct WrapAppearance {
|
|
// No wrapping, word, character, whitespace appearance
|
|
Scintilla::Wrap state = Wrap::None;
|
|
// Show indication of wrap at line end, line start, or in margin
|
|
Scintilla::WrapVisualFlag visualFlags = WrapVisualFlag::None;
|
|
// Show indication near margin or near text
|
|
Scintilla::WrapVisualLocation visualFlagsLocation = WrapVisualLocation::Default;
|
|
// How much indentation to show wrapping
|
|
int visualStartIndent = 0;
|
|
// WrapIndentMode::Fixed, Same, Indent, DeepIndent
|
|
Scintilla::WrapIndentMode indentMode = WrapIndentMode::Fixed;
|
|
};
|
|
|
|
struct EdgeProperties {
|
|
int column = 0;
|
|
ColourRGBA colour;
|
|
constexpr EdgeProperties(int column_ = 0, ColourRGBA colour_ = ColourRGBA::FromRGB(0)) noexcept :
|
|
column(column_), colour(colour_) {
|
|
}
|
|
};
|
|
|
|
// This is an old style enum so that its members can be used directly as indices without casting
|
|
enum StyleIndices {
|
|
StyleDefault = static_cast<int>(Scintilla::StylesCommon::Default),
|
|
StyleLineNumber = static_cast<int>(Scintilla::StylesCommon::LineNumber),
|
|
StyleBraceLight = static_cast<int>(Scintilla::StylesCommon::BraceLight),
|
|
StyleBraceBad = static_cast<int>(Scintilla::StylesCommon::BraceBad),
|
|
StyleControlChar = static_cast<int>(Scintilla::StylesCommon::ControlChar),
|
|
StyleIndentGuide = static_cast<int>(Scintilla::StylesCommon::IndentGuide),
|
|
StyleCallTip = static_cast<int>(Scintilla::StylesCommon::CallTip),
|
|
StyleFoldDisplayText = static_cast<int>(Scintilla::StylesCommon::FoldDisplayText),
|
|
};
|
|
|
|
/**
|
|
*/
|
|
class ViewStyle {
|
|
UniqueStringSet fontNames;
|
|
FontMap fonts;
|
|
public:
|
|
std::vector<Style> styles;
|
|
int nextExtendedStyle;
|
|
std::vector<LineMarker> markers;
|
|
int largestMarkerHeight;
|
|
std::vector<Indicator> indicators;
|
|
bool indicatorsDynamic;
|
|
bool indicatorsSetFore;
|
|
Scintilla::Technology technology;
|
|
int lineHeight;
|
|
int lineOverlap;
|
|
XYPOSITION maxAscent;
|
|
XYPOSITION maxDescent;
|
|
XYPOSITION aveCharWidth;
|
|
XYPOSITION spaceWidth;
|
|
XYPOSITION tabWidth;
|
|
|
|
SelectionAppearance selection;
|
|
|
|
int controlCharSymbol;
|
|
XYPOSITION controlCharWidth;
|
|
ColourRGBA selbar;
|
|
ColourRGBA selbarlight;
|
|
std::optional<ColourRGBA> foldmarginColour;
|
|
std::optional<ColourRGBA> foldmarginHighlightColour;
|
|
bool hotspotUnderline;
|
|
/// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
|
|
int leftMarginWidth; ///< Spacing margin on left of text
|
|
int rightMarginWidth; ///< Spacing margin on right of text
|
|
int maskInLine = 0; ///< Mask for markers to be put into text because there is nowhere for them to go in margin
|
|
int maskDrawInText = 0; ///< Mask for markers that always draw in text
|
|
std::vector<MarginStyle> ms;
|
|
int fixedColumnWidth = 0; ///< Total width of margins
|
|
bool marginInside; ///< true: margin included in text view, false: separate views
|
|
int textStart; ///< Starting x position of text within the view
|
|
int zoomLevel;
|
|
Scintilla::WhiteSpace viewWhitespace;
|
|
Scintilla::TabDrawMode tabDrawMode;
|
|
int whitespaceSize;
|
|
Scintilla::IndentView viewIndentationGuides;
|
|
bool viewEOL;
|
|
|
|
CaretAppearance caret;
|
|
|
|
CaretLineAppearance caretLine;
|
|
|
|
bool someStylesProtected;
|
|
bool someStylesForceCase;
|
|
Scintilla::FontQuality extraFontFlag;
|
|
int extraAscent;
|
|
int extraDescent;
|
|
int marginStyleOffset;
|
|
Scintilla::AnnotationVisible annotationVisible;
|
|
int annotationStyleOffset;
|
|
Scintilla::EOLAnnotationVisible eolAnnotationVisible;
|
|
int eolAnnotationStyleOffset;
|
|
bool braceHighlightIndicatorSet;
|
|
int braceHighlightIndicator;
|
|
bool braceBadLightIndicatorSet;
|
|
int braceBadLightIndicator;
|
|
Scintilla::EdgeVisualStyle edgeState;
|
|
EdgeProperties theEdge;
|
|
std::vector<EdgeProperties> theMultiEdge;
|
|
int marginNumberPadding; // the right-side padding of the number margin
|
|
int ctrlCharPadding; // the padding around control character text blobs
|
|
int lastSegItalicsOffset; // the offset so as not to clip italic characters at EOLs
|
|
|
|
using ElementMap = std::map<Scintilla::Element, std::optional<ColourRGBA>>;
|
|
ElementMap elementColours;
|
|
ElementMap elementBaseColours;
|
|
std::set<Scintilla::Element> elementAllowsTranslucent;
|
|
|
|
WrapAppearance wrap;
|
|
|
|
std::string localeName;
|
|
|
|
ViewStyle(size_t stylesSize_=256);
|
|
ViewStyle(const ViewStyle &source);
|
|
ViewStyle(ViewStyle &&) = delete;
|
|
// Can only be copied through copy constructor which ensures font names initialised correctly
|
|
ViewStyle &operator=(const ViewStyle &) = delete;
|
|
ViewStyle &operator=(ViewStyle &&) = delete;
|
|
~ViewStyle();
|
|
void CalculateMarginWidthAndMask() noexcept;
|
|
void Refresh(Surface &surface, int tabInChars);
|
|
void ReleaseAllExtendedStyles() noexcept;
|
|
int AllocateExtendedStyles(int numberStyles);
|
|
void EnsureStyle(size_t index);
|
|
void ResetDefaultStyle();
|
|
void ClearStyles();
|
|
void SetStyleFontName(int styleIndex, const char *name);
|
|
void SetFontLocaleName(const char *name);
|
|
bool ProtectionActive() const noexcept;
|
|
int ExternalMarginWidth() const noexcept;
|
|
int MarginFromLocation(Point pt) const noexcept;
|
|
bool ValidStyle(size_t styleIndex) const noexcept;
|
|
void CalcLargestMarkerHeight() noexcept;
|
|
int GetFrameWidth() const noexcept;
|
|
bool IsLineFrameOpaque(bool caretActive, bool lineContainsCaret) const;
|
|
std::optional<ColourRGBA> Background(int marksOfLine, bool caretActive, bool lineContainsCaret) const;
|
|
bool SelectionBackgroundDrawn() const noexcept;
|
|
bool SelectionTextDrawn() const;
|
|
bool WhitespaceBackgroundDrawn() const;
|
|
ColourRGBA WrapColour() const;
|
|
|
|
void AddMultiEdge(int column, ColourRGBA colour);
|
|
|
|
std::optional<ColourRGBA> ElementColour(Scintilla::Element element) const;
|
|
bool ElementAllowsTranslucent(Scintilla::Element element) const;
|
|
bool ResetElement(Scintilla::Element element);
|
|
bool SetElementColour(Scintilla::Element element, ColourRGBA colour);
|
|
bool SetElementColourOptional(Scintilla::Element element, Scintilla::uptr_t wParam, Scintilla::sptr_t lParam);
|
|
void SetElementRGB(Scintilla::Element element, int rgb);
|
|
void SetElementAlpha(Scintilla::Element element, int alpha);
|
|
bool ElementIsSet(Scintilla::Element element) const;
|
|
bool SetElementBase(Scintilla::Element element, ColourRGBA colour);
|
|
|
|
bool SetWrapState(Scintilla::Wrap wrapState_) noexcept;
|
|
bool SetWrapVisualFlags(Scintilla::WrapVisualFlag wrapVisualFlags_) noexcept;
|
|
bool SetWrapVisualFlagsLocation(Scintilla::WrapVisualLocation wrapVisualFlagsLocation_) noexcept;
|
|
bool SetWrapVisualStartIndent(int wrapVisualStartIndent_) noexcept;
|
|
bool SetWrapIndentMode(Scintilla::WrapIndentMode wrapIndentMode_) noexcept;
|
|
|
|
bool WhiteSpaceVisible(bool inIndent) const noexcept;
|
|
|
|
enum class CaretShape { invisible, line, block, bar };
|
|
bool IsBlockCaretStyle() const noexcept;
|
|
bool IsCaretVisible(bool isMainSelection) const noexcept;
|
|
bool DrawCaretInsideSelection(bool inOverstrike, bool imeCaretBlockOverride) const noexcept;
|
|
CaretShape CaretShapeForMode(bool inOverstrike, bool isMainSelection) const noexcept;
|
|
|
|
private:
|
|
void AllocStyles(size_t sizeNew);
|
|
void CreateAndAddFont(const FontSpecification &fs);
|
|
FontRealised *Find(const FontSpecification &fs);
|
|
void FindMaxAscentDescent() noexcept;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|