summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basctl/source/basicide/BasicColorConfig.cxx31
-rw-r--r--basctl/source/basicide/baside2.cxx1
-rw-r--r--basctl/source/basicide/baside2.hxx7
-rw-r--r--basctl/source/basicide/baside2b.cxx51
-rw-r--r--basctl/source/basicide/linenumberwindow.cxx26
-rw-r--r--basctl/source/basicide/linenumberwindow.hxx1
-rw-r--r--basctl/source/inc/colorscheme.hxx1
-rw-r--r--officecfg/registry/data/org/openoffice/Office/BasicIDE.xcu30
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/BasicIDE.xcs10
9 files changed, 149 insertions, 9 deletions
diff --git a/basctl/source/basicide/BasicColorConfig.cxx b/basctl/source/basicide/BasicColorConfig.cxx
index 21ff95bc0f8e..ab17b164934b 100644
--- a/basctl/source/basicide/BasicColorConfig.cxx
+++ b/basctl/source/basicide/BasicColorConfig.cxx
@@ -49,13 +49,16 @@ ColorScheme BasicColorConfig::GetColorScheme(const OUString& rScheme)
return GetAutomaticColorScheme();
}
- std::vector<OUString> aVecPropNames = {
- OUString(rScheme + "/GenericColor/Color"), OUString(rScheme + "/IdentifierColor/Color"),
- OUString(rScheme + "/NumberColor/Color"), OUString(rScheme + "/StringColor/Color"),
- OUString(rScheme + "/CommentColor/Color"), OUString(rScheme + "/ErrorColor/Color"),
- OUString(rScheme + "/OperatorColor/Color"), OUString(rScheme + "/KeywordColor/Color"),
- OUString(rScheme + "/BackgroundColor/Color")
- };
+ std::vector<OUString> aVecPropNames = { OUString(rScheme + "/GenericColor/Color"),
+ OUString(rScheme + "/IdentifierColor/Color"),
+ OUString(rScheme + "/NumberColor/Color"),
+ OUString(rScheme + "/StringColor/Color"),
+ OUString(rScheme + "/CommentColor/Color"),
+ OUString(rScheme + "/ErrorColor/Color"),
+ OUString(rScheme + "/OperatorColor/Color"),
+ OUString(rScheme + "/KeywordColor/Color"),
+ OUString(rScheme + "/BackgroundColor/Color"),
+ OUString(rScheme + "/LineHighlightColor/Color") };
css::uno::Sequence<OUString> aPropNames(aVecPropNames.size());
OUString* pPropNames = aPropNames.getArray();
@@ -77,12 +80,22 @@ ColorScheme BasicColorConfig::GetColorScheme(const OUString& rScheme)
aColors[6] >>= aColorScheme.m_aOperatorColor;
aColors[7] >>= aColorScheme.m_aKeywordColor;
aColors[8] >>= aColorScheme.m_aBackgroundColor;
+ aColors[9] >>= aColorScheme.m_aLineHighlightColor;
return aColorScheme;
}
ColorScheme BasicColorConfig::GetAutomaticColorScheme()
{
+ // Application Colors do not define a line highlight color, so here we adjust
+ // the background color to get a highlight color
+ Color aBackgroundColor = aColorConfig.GetColorValue(svtools::BASICEDITOR).nColor;
+ Color aHighlightColor(aBackgroundColor);
+ if (aBackgroundColor.IsDark())
+ aHighlightColor.ApplyTintOrShade(1000);
+ else
+ aHighlightColor.ApplyTintOrShade(-1000);
+
ColorScheme aScheme = { DEFAULT_SCHEME,
false,
aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor,
@@ -93,7 +106,9 @@ ColorScheme BasicColorConfig::GetAutomaticColorScheme()
aColorConfig.GetColorValue(svtools::BASICERROR).nColor,
aColorConfig.GetColorValue(svtools::BASICOPERATOR).nColor,
aColorConfig.GetColorValue(svtools::BASICKEYWORD).nColor,
- aColorConfig.GetColorValue(svtools::BASICEDITOR).nColor };
+ aBackgroundColor,
+ aHighlightColor };
+
return aScheme;
}
diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx
index a36cec6fe245..74c25d6f4631 100644
--- a/basctl/source/basicide/baside2.cxx
+++ b/basctl/source/basicide/baside2.cxx
@@ -1618,6 +1618,7 @@ void ModulWindowLayout::SyntaxColors::ApplyColorScheme(OUString aSchemeId, bool
{
pEditor->ChangeFontColor(aFontColor);
pEditor->SetBackground(Wallpaper(aDocColor));
+ pEditor->SetLineHighlightColor(aColorScheme.m_aLineHighlightColor);
pEditor->Invalidate();
}
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
index c07141b7079f..cd0485c46b4b 100644
--- a/basctl/source/basicide/baside2.hxx
+++ b/basctl/source/basicide/baside2.hxx
@@ -105,6 +105,11 @@ private:
bool bDoSyntaxHighlight;
bool bDelayHighlight;
+ // Used to determine if the highlighted line has changed, which would require redrawing the highlight
+ sal_uInt32 m_nLastHighlightPara;
+
+ Color m_aLineHighlightColor;
+
virtual css::uno::Reference< css::awt::XVclWindowPeer > GetComponentInterface(bool bCreate = true) override;
CodeCompleteDataCache aCodeCompleteCache;
VclPtr<CodeCompleteWindow> pCodeCompleteWnd;
@@ -130,6 +135,7 @@ private:
void DoSyntaxHighlight( sal_uInt32 nPara );
OUString GetWordAtCursor();
bool ImpCanModify();
+ void HighlightCurrentLine(vcl::RenderContext& rRenderContext);
public:
EditorWindow (vcl::Window* pParent, ModulWindow*);
@@ -156,6 +162,7 @@ public:
void ChangeFontColor( Color aColor );
void UpdateSyntaxHighlighting ();
+ void SetLineHighlightColor(Color aColor);
void SetEditorZoomLevel(sal_uInt16 nNewZoomLevel);
sal_uInt16 GetCurrentZoom() { return nCurrentZoomLevel; }
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index 0cb13161178b..52b2194a93d9 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -71,6 +71,7 @@
#include "uiobject.hxx"
#include <basegfx/utils/zoomtools.hxx>
#include <svl/itemset.hxx>
+#include <BasicColorConfig.hxx>
namespace basctl
{
@@ -248,12 +249,14 @@ EditorWindow::EditorWindow (vcl::Window* pParent, ModulWindow* pModulWindow) :
bHighlighting(false),
bDoSyntaxHighlight(true),
bDelayHighlight(true),
+ m_nLastHighlightPara(0),
pCodeCompleteWnd(VclPtr<CodeCompleteWindow>::Create(this))
{
set_id("EditorWindow");
const Wallpaper aBackground(rModulWindow.GetLayout().GetSyntaxBackgroundColor());
SetBackground(aBackground);
GetWindow(GetWindowType::Border)->SetBackground(aBackground);
+ SetLineHighlightColor(GetShell()->GetColorConfig()->GetCurrentColorScheme().m_aLineHighlightColor);
SetPointer( PointerStyle::Text );
SetHelpId( HID_BASICIDE_EDITORWINDOW );
@@ -729,6 +732,11 @@ void EditorWindow::HandleAutoCorrect()
}
}
+void EditorWindow::SetLineHighlightColor(Color aColor)
+{
+ m_aLineHighlightColor = aColor;
+}
+
TextSelection EditorWindow::GetLastHighlightPortionTextSelection() const
{//creates a text selection from the highlight portion on the cursor
const sal_uInt32 nLine = GetEditView()->GetSelection().GetStart().GetPara();
@@ -976,9 +984,34 @@ void EditorWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectan
if (!pEditEngine) // We need it now at latest
CreateEditEngine();
+ HighlightCurrentLine(rRenderContext);
+
pEditView->Paint(rRenderContext, rRect);
}
+void EditorWindow::HighlightCurrentLine(vcl::RenderContext& rRenderContext)
+{
+ // If the cursor is in a single line and nothing is selected, then a highlight color
+ // is applied to the background of the current line
+ TextPaM aStartPaM = pEditView->GetSelection().GetStart();
+ TextPaM aEndPaM = pEditView->GetSelection().GetEnd();
+ if (aStartPaM == aEndPaM)
+ {
+ Size aWinSize(GetOutputSizePixel());
+ sal_Int16 nDocPosY = pEditView->GetStartDocPos().Y();
+ sal_Int16 nY1 = pEditEngine->PaMtoEditCursor(aStartPaM).TopLeft().Y();
+ sal_Int16 nY2 = pEditEngine->PaMtoEditCursor(aStartPaM).BottomRight().Y();
+ // Only draw if the cursor is in a visible position
+ if ((nY1 >= nDocPosY && nY1 <= nDocPosY + aWinSize.Height())
+ || (nY2 >= nDocPosY && nY2 <= nDocPosY + aWinSize.Height()))
+ {
+ tools::Rectangle aRect(Point(0, nY1 - nDocPosY), Point(aWinSize.Width(), nY2 - nDocPosY));
+ rRenderContext.SetFillColor(m_aLineHighlightColor);
+ rRenderContext.DrawRect(aRect);
+ }
+ }
+}
+
void EditorWindow::LoseFocus()
{
// tdf#114258 wait until the next event loop cycle to do this so it doesn't
@@ -1169,6 +1202,24 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
pBindings->Invalidate( SID_COPY );
}
}
+ else if( rTextHint.GetId() == SfxHintId::TextViewCaretChanged )
+ {
+ // Check whether the line number where the caret is has changed and the
+ // highlight needs to be redrawn
+ sal_uInt32 nStartPara = pEditView->GetSelection().GetStart().GetPara();
+ sal_uInt32 nEndPara = pEditView->GetSelection().GetEnd().GetPara();
+ if (nStartPara == nEndPara && nStartPara != m_nLastHighlightPara)
+ {
+ m_nLastHighlightPara = nStartPara;
+ Invalidate();
+ rModulWindow.GetLineNumberWindow().Invalidate();
+ }
+ else if (nStartPara != nEndPara)
+ {
+ // If multiple lines are selected, then update the line number window
+ rModulWindow.GetLineNumberWindow().Invalidate();
+ }
+ }
}
OUString EditorWindow::GetActualSubName( sal_uInt32 nLine )
diff --git a/basctl/source/basicide/linenumberwindow.cxx b/basctl/source/basicide/linenumberwindow.cxx
index 18420199e2a9..7b4b07da726f 100644
--- a/basctl/source/basicide/linenumberwindow.cxx
+++ b/basctl/source/basicide/linenumberwindow.cxx
@@ -25,6 +25,7 @@ LineNumberWindow::LineNumberWindow(vcl::Window* pParent, ModulWindow* pModulWind
SetBackground(aBackground);
GetWindow(GetWindowType::Border)->SetBackground(aBackground);
m_FontColor = GetSettings().GetStyleSettings().GetWindowTextColor();
+ m_HighlightColor = GetSettings().GetStyleSettings().GetFaceColor();
m_nBaseWidth = GetTextWidth("8");
m_nWidth = m_nBaseWidth * 3 + m_nBaseWidth / 2;
}
@@ -51,6 +52,7 @@ void LineNumberWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Re
return;
int windowHeight = rRenderContext.GetOutputSize().Height();
+ int windowWidth = rRenderContext.GetOutputSize().Width();
int nLineHeight = rRenderContext.GetTextHeight();
if (!nLineHeight)
{
@@ -78,16 +80,38 @@ void LineNumberWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Re
m_nWidth += m_nBaseWidth;
}
+ vcl::Font aNormalFont = rRenderContext.GetFont();
+ vcl::Font aBoldFont(aNormalFont);
+ aBoldFont.SetWeight(FontWeight::WEIGHT_BOLD);
+
+ sal_uInt32 nParaEnd = txtView->GetSelection().GetEnd().GetPara() + 1;
sal_Int64 y = (nStartLine - 1) * static_cast<sal_Int64>(nLineHeight);
- rRenderContext.SetTextColor(m_FontColor);
+
for (sal_uInt32 n = nStartLine; n <= nEndLine; ++n, y += nLineHeight)
{
+ // Font weight for the selected lines is bold
+ if (n == nParaEnd)
+ {
+ tools::Rectangle aRect(Point(0, y - m_nCurYOffset),
+ Point(windowWidth, y - m_nCurYOffset + nLineHeight));
+ rRenderContext.SetFillColor(m_HighlightColor);
+ rRenderContext.DrawRect(aRect);
+ rRenderContext.SetFont(aBoldFont);
+ }
+ else
+ {
+ rRenderContext.SetFont(aNormalFont);
+ }
+
+ rRenderContext.SetTextColor(m_FontColor);
const OUString aLineNumber = OUString::number(n);
// tdf#153798 - align line numbers to the right
rRenderContext.DrawText(
Point(m_nWidth - GetTextWidth(aLineNumber) - m_nBaseWidth / 2, y - m_nCurYOffset),
aLineNumber);
}
+ // Restore the original font
+ rRenderContext.SetFont(aNormalFont);
// Resize the parent after calculating the new width and height values
GetParent()->Resize();
diff --git a/basctl/source/basicide/linenumberwindow.hxx b/basctl/source/basicide/linenumberwindow.hxx
index a2e457f71103..5f5ab744f0f0 100644
--- a/basctl/source/basicide/linenumberwindow.hxx
+++ b/basctl/source/basicide/linenumberwindow.hxx
@@ -23,6 +23,7 @@ private:
tools::Long m_nCurYOffset;
int m_nBaseWidth;
Color m_FontColor;
+ Color m_HighlightColor;
virtual void DataChanged(DataChangedEvent const& rDCEvt) override;
protected:
diff --git a/basctl/source/inc/colorscheme.hxx b/basctl/source/inc/colorscheme.hxx
index 5f7514febe3c..96567f79f7ff 100644
--- a/basctl/source/inc/colorscheme.hxx
+++ b/basctl/source/inc/colorscheme.hxx
@@ -37,6 +37,7 @@ typedef struct
Color m_aOperatorColor;
Color m_aKeywordColor;
Color m_aBackgroundColor;
+ Color m_aLineHighlightColor;
} ColorScheme;
} // namespace basctl
diff --git a/officecfg/registry/data/org/openoffice/Office/BasicIDE.xcu b/officecfg/registry/data/org/openoffice/Office/BasicIDE.xcu
index 0448b5570987..c62a2d6af7dd 100644
--- a/officecfg/registry/data/org/openoffice/Office/BasicIDE.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/BasicIDE.xcu
@@ -65,6 +65,11 @@
<value>16777215</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>15658734</value>
+ </prop>
+ </node>
</node>
<node oor:name="COLORSCHEME_LIBREOFFICE_DARK" oor:op="replace">
<node oor:name="GenericColor">
@@ -112,6 +117,11 @@
<value>0</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>2236962</value>
+ </prop>
+ </node>
</node>
<node oor:name="COLORSCHEME_BREEZE_LIGHT" oor:op="replace">
<node oor:name="GenericColor">
@@ -159,6 +169,11 @@
<value>16777215</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>16316406</value>
+ </prop>
+ </node>
</node>
<node oor:name="COLORSCHEME_BREEZE_DARK" oor:op="replace">
<node oor:name="GenericColor">
@@ -206,6 +221,11 @@
<value>2303529</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>2764338</value>
+ </prop>
+ </node>
</node>
<node oor:name="COLORSCHEME_SOLARIZED_LIGHT" oor:op="replace">
<node oor:name="GenericColor">
@@ -253,6 +273,11 @@
<value>16643811</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>15657173</value>
+ </prop>
+ </node>
</node>
<node oor:name="COLORSCHEME_SOLARIZED_DARK" oor:op="replace">
<node oor:name="GenericColor">
@@ -300,6 +325,11 @@
<value>11062</value>
</prop>
</node>
+ <node oor:name="LineHighlightColor">
+ <prop oor:name="Color">
+ <value>472642</value>
+ </prop>
+ </node>
</node>
</node>
</oor:component-data>
diff --git a/officecfg/registry/schema/org/openoffice/Office/BasicIDE.xcs b/officecfg/registry/schema/org/openoffice/Office/BasicIDE.xcs
index 1fe9af67f78f..cc783b837046 100644
--- a/officecfg/registry/schema/org/openoffice/Office/BasicIDE.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/BasicIDE.xcs
@@ -116,6 +116,16 @@
</info>
</prop>
</group>
+ <group oor:name="LineHighlightColor">
+ <info>
+ <desc>Specifies the formatting to highlight the selected line.</desc>
+ </info>
+ <prop oor:name="Color" oor:type="xs:int">
+ <info>
+ <desc>Specifies the color used to highlight the selected line.</desc>
+ </info>
+ </prop>
+ </group>
</group>
</templates>
<component>