Skip to content

Commit dc1799b

Browse files
committed
Improved ScrollBarEx update 2
Added settings option to change the usage mode of ScrollBarEx (Off, Auto, On). Defaults to Auto.
1 parent db2b533 commit dc1799b

File tree

9 files changed

+184
-28
lines changed

9 files changed

+184
-28
lines changed

FlashDevelop/Settings/Accessors.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Xml.Serialization;
88
using Ookii.Dialogs;
99
using PluginCore;
10+
using PluginCore.Controls;
1011
using PluginCore.Localization;
1112
using ScintillaNet.Enums;
1213

@@ -372,7 +373,7 @@ public HighlightMatchingWordsMode HighlightMatchingWordsMode
372373
[LocalizedDescription("FlashDevelop.Description.HighlightMatchingWordsDelay")]
373374
public Int32 HighlightMatchingWordsDelay
374375
{
375-
get
376+
get
376377
{
377378
// Make sure this is not an invalid value
378379
if (this.highlightMatchingWordsDelay <= 0) this.highlightMatchingWordsDelay = 1200;
@@ -381,6 +382,23 @@ public Int32 HighlightMatchingWordsDelay
381382
set { this.highlightMatchingWordsDelay = value; }
382383
}
383384

385+
[DefaultValue(ScrollBarMode.Auto)]
386+
[DisplayName("Use Custom Scroll Bar")]
387+
[LocalizedCategory("FlashDevelop.Category.Editor")]
388+
[LocalizedDescription("FlashDevelop.Description.UseCustomScrollBar")]
389+
public ScrollBarMode UseCustomScrollBar
390+
{
391+
get { return this.useCustomScrollBar; }
392+
set
393+
{
394+
if (this.useCustomScrollBar != value)
395+
{
396+
this.useCustomScrollBar = value;
397+
ScrollBarEx.NotifySettingsChanged(this.useCustomScrollBar);
398+
}
399+
}
400+
}
401+
384402
#endregion
385403

386404
#region Locale
@@ -445,10 +463,10 @@ public Boolean TabIndents
445463
[LocalizedDescription("FlashDevelop.Description.IndentView")]
446464
public IndentView IndentView
447465
{
448-
get
466+
get
449467
{
450468
if ((Int32)this.indentView == 0) this.indentView = IndentView.Real;
451-
return this.indentView;
469+
return this.indentView;
452470
}
453471
set
454472
{

FlashDevelop/Settings/Properties.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Windows.Forms;
1010
using PluginCore.Managers;
1111
using PluginCore;
12+
using PluginCore.Controls;
1213

1314
namespace FlashDevelop.Settings
1415
{
@@ -103,7 +104,7 @@ public partial class SettingObject : ISettings
103104
private Boolean uiWrapList = false;
104105
private Boolean uiDisableSmartMatch = false;
105106
private String uiInsertionTriggers = "";
106-
107+
private ScrollBarMode useCustomScrollBar = ScrollBarMode.Auto;
107108
}
108109

109110
}

PluginCore/PluginCore/Controls/ScrollBarEx.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,26 @@ namespace PluginCore.Controls
1818
[DefaultProperty("Value")]
1919
public class ScrollBarEx : Control
2020
{
21+
#region scroll bar settings
22+
23+
public delegate void SettingsChangedEventHandler(ScrollBarMode value);
24+
public static event SettingsChangedEventHandler SettingsChanged;
25+
26+
private static ScrollBarMode settingsMode = ScrollBarMode.Auto;
27+
28+
public static ScrollBarMode SettingsMode
29+
{
30+
get { return settingsMode; }
31+
}
32+
33+
public static void NotifySettingsChanged(ScrollBarMode value)
34+
{
35+
settingsMode = value;
36+
if (SettingsChanged != null) SettingsChanged.Invoke(settingsMode);
37+
}
38+
39+
#endregion
40+
2141
#region drawing
2242

2343
private Color curPosColor/* = Color.DarkBlue*/;
@@ -2227,6 +2247,27 @@ public enum ScrollBarOrientation
22272247
Vertical
22282248
}
22292249

2250+
/// <summary>
2251+
/// Enum for scrollbar usage settings.
2252+
/// </summary>
2253+
public enum ScrollBarMode
2254+
{
2255+
/// <summary>
2256+
/// Turn off the usage of <see cref="ScrollBarEx"/> completely.
2257+
/// </summary>
2258+
Off,
2259+
2260+
/// <summary>
2261+
/// Use <see cref="ScrollBarEx"/> only when explicit theme is defined for scroll bars.
2262+
/// </summary>
2263+
Auto,
2264+
2265+
/// <summary>
2266+
/// Always use <see cref="ScrollBarEx"/> instead of the system scroll bar.
2267+
/// </summary>
2268+
On
2269+
}
2270+
22302271
/// <summary>
22312272
/// The scrollbar states.
22322273
/// </summary>

PluginCore/PluginCore/Resources/de_DE.resX

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5964,4 +5964,8 @@ Eigene Sprachumgebungen müssen eine Erweiterung der Standard-Sprachumgebung sei
59645964
<value>Highlight word:</value>
59655965
<comment>Added after 5.0.2</comment>
59665966
</data>
5967+
<data name="FlashDevelop.Description.UseCustomScrollBar" xml:space="preserve">
5968+
<value>Whether to use the custom scroll bar for text editors. Set to 'On' to always enable the custom scroll bar, 'Off' to disable it completely, or 'Auto' to use the custom scroll bar only when the current theme has scroll bar color definitions.</value>
5969+
<comment>REQUIRES TRANSLATION</comment>
5970+
</data>
59675971
</root>

PluginCore/PluginCore/Resources/en_US.resX

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5980,4 +5980,7 @@ Custom locales must be an extension of a default locale, e.g. en-US.</value>
59805980
<value>Highlight word:</value>
59815981
<comment>Added after 5.0.2</comment>
59825982
</data>
5983+
<data name="FlashDevelop.Description.UseCustomScrollBar" xml:space="preserve">
5984+
<value>Whether to use the custom scroll bar for text editors. Set to 'On' to always enable the custom scroll bar, 'Off' to disable it completely, or 'Auto' to use the custom scroll bar only when the current theme has scroll bar color definitions.</value>
5985+
</data>
59835986
</root>

PluginCore/PluginCore/Resources/eu_ES.resX

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5961,4 +5961,8 @@ Lokalizazio pertsonalizatuek lehenetsiaren luzapen bat izan behar dute, adb. en-
59615961
<value>Highlight word:</value>
59625962
<comment>Added after 5.0.2</comment>
59635963
</data>
5964+
<data name="FlashDevelop.Description.UseCustomScrollBar" xml:space="preserve">
5965+
<value>Whether to use the custom scroll bar for text editors. Set to 'On' to always enable the custom scroll bar, 'Off' to disable it completely, or 'Auto' to use the custom scroll bar only when the current theme has scroll bar color definitions.</value>
5966+
<comment>REQUIRES TRANSLATION</comment>
5967+
</data>
59645968
</root>

PluginCore/PluginCore/Resources/ja_JP.resX

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6022,4 +6022,8 @@ UseData:"</value>
60226022
<value>Highlight word:</value>
60236023
<comment>Added after 5.0.2</comment>
60246024
</data>
6025+
<data name="FlashDevelop.Description.UseCustomScrollBar" xml:space="preserve">
6026+
<value>Whether to use the custom scroll bar for text editors. Set to 'On' to always enable the custom scroll bar, 'Off' to disable it completely, or 'Auto' to use the custom scroll bar only when the current theme has scroll bar color definitions.</value>
6027+
<comment>REQUIRES TRANSLATION</comment>
6028+
</data>
60256029
</root>

PluginCore/PluginCore/Resources/zh_CN.resx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5974,4 +5974,8 @@
59745974
<value>Highlight word:</value>
59755975
<comment>Added after 5.0.2</comment>
59765976
</data>
5977+
<data name="FlashDevelop.Description.UseCustomScrollBar" xml:space="preserve">
5978+
<value>Whether to use the custom scroll bar for text editors. Set to 'On' to always enable the custom scroll bar, 'Off' to disable it completely, or 'Auto' to use the custom scroll bar only when the current theme has scroll bar color definitions.</value>
5979+
<comment>REQUIRES TRANSLATION</comment>
5980+
</data>
59775981
</root>

PluginCore/ScintillaNet/ScintillaControl.cs

Lines changed: 101 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,17 @@ public class ScintillaControl : Control, IEventHandler
4545
private ScrollBarEx vScrollBar;
4646
private ScrollBarEx hScrollBar;
4747

48+
/// <summary>
49+
/// Gets the custom vertical scroll bar.
50+
/// </summary>
4851
public ScrollBarEx VScrollBar
4952
{
5053
get { return this.vScrollBar; }
5154
}
5255

56+
/// <summary>
57+
/// Gets the custom horizontal scroll bar.
58+
/// </summary>
5359
public ScrollBarEx HScrollBar
5460
{
5561
get { return this.hScrollBar; }
@@ -96,15 +102,25 @@ public void HandleEvent(Object sender, NotifyEvent e, HandlingPriority priority)
96102
{
97103
if (e.Type == EventType.ApplyTheme)
98104
{
99-
vScrollBar.ValidateColors();
100-
hScrollBar.ValidateColors();
105+
switch (ScrollBarEx.SettingsMode)
106+
{
107+
case ScrollBarMode.Auto:
108+
AutoAddRemoveScrollBars(this);
109+
break;
110+
case ScrollBarMode.On:
111+
this.vScrollBar.ValidateColors();
112+
this.hScrollBar.ValidateColors();
113+
break;
114+
case ScrollBarMode.Off:
115+
break;
116+
}
101117
}
102118
}
103119

104120
/// <summary>
105121
/// Init the custom scrollbars
106122
/// </summary>
107-
private void InitScrollBars(ScintillaControl sender)
123+
private static void InitScrollBars(ScintillaControl sender)
108124
{
109125
sender.vScrollBar = new ScrollBarEx();
110126
sender.vScrollBar.OverScroll = true;
@@ -118,17 +134,35 @@ private void InitScrollBars(ScintillaControl sender)
118134
sender.hScrollBar.Orientation = ScrollBarOrientation.Horizontal;
119135
sender.hScrollBar.ContextMenuStrip.Renderer = new DockPanelStripRenderer();
120136
sender.hScrollBar.Dock = DockStyle.Bottom;
121-
//Color foreColor = PluginBase.MainForm.GetThemeColor("ScrollBar.ForeColor");
122-
/*if (foreColor != Color.Empty) */sender.AddScrollBars(sender);
123-
PluginBase.MainForm.ThemeControls(sender.vScrollBar);
124-
PluginBase.MainForm.ThemeControls(sender.hScrollBar);
125-
EventManager.AddEventHandler(this, EventType.ApplyTheme);
137+
sender.ScrollBarEx_SettingsChanged(ScrollBarEx.SettingsMode);
138+
ScrollBarEx.SettingsChanged += sender.ScrollBarEx_SettingsChanged;
139+
EventManager.AddEventHandler(sender, EventType.ApplyTheme);
140+
}
141+
142+
/// <summary>
143+
/// Turn on/off the scroll bars according to the new settings value.
144+
/// </summary>
145+
/// <param name="value">A <see cref="ScrollBarMode"/> enum value.</param>
146+
private void ScrollBarEx_SettingsChanged(ScrollBarMode value)
147+
{
148+
switch (value)
149+
{
150+
case ScrollBarMode.Off:
151+
TurnOffScrollBars(this);
152+
break;
153+
case ScrollBarMode.Auto:
154+
AutoAddRemoveScrollBars(this);
155+
break;
156+
case ScrollBarMode.On:
157+
TurnOnScrollBars(this);
158+
break;
159+
}
126160
}
127161

128162
/// <summary>
129163
/// Update the scrollbars on sci control ui update
130164
/// </summary>
131-
private void OnScrollUpdate(ScintillaControl sender)
165+
private static void OnScrollUpdate(ScintillaControl sender)
132166
{
133167
Int32 vMax = sender.LinesVisible;
134168
Int32 vPage = sender.LinesOnScreen;
@@ -153,31 +187,73 @@ private void OnScrollUpdate(ScintillaControl sender)
153187
/// </summary>
154188
private void OnScrollBarScroll(Object sender, ScrollEventArgs e)
155189
{
156-
this.Painted -= this.OnScrollUpdate;
190+
this.Painted -= OnScrollUpdate;
157191
if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
158192
{
159193
if (e.OldValue != -1) this.FirstVisibleLine = e.NewValue;
160194
}
161195
else this.XOffset = this.hScrollBar.Value;
162-
this.Painted += this.OnScrollUpdate;
196+
this.Painted += OnScrollUpdate;
197+
}
198+
199+
/// <summary>
200+
/// Automatically add or remove scroll bars.
201+
/// </summary>
202+
/// <param name="sender">The <see cref="ScintillaControl"/> object.</param>
203+
private static void AutoAddRemoveScrollBars(ScintillaControl sender)
204+
{
205+
if (PluginBase.MainForm.GetThemeColor("ScrollBar.ForeColor").IsEmpty)
206+
{
207+
TurnOffScrollBars(sender);
208+
}
209+
else
210+
{
211+
TurnOnScrollBars(sender);
212+
}
213+
}
214+
215+
/// <summary>
216+
/// Add scroll bars and theme them.
217+
/// </summary>
218+
/// <param name="sender">The <see cref="ScintillaControl"/> object.</param>
219+
private static void TurnOnScrollBars(ScintillaControl sender)
220+
{
221+
if (!sender.Controls.Contains(sender.vScrollBar))
222+
AddScrollBars(sender);
223+
224+
PluginBase.MainForm.ThemeControls(sender.vScrollBar);
225+
PluginBase.MainForm.ThemeControls(sender.hScrollBar);
226+
sender.vScrollBar.ValidateColors();
227+
sender.hScrollBar.ValidateColors();
228+
}
229+
230+
/// <summary>
231+
/// Remove scroll bars from the container.
232+
/// </summary>
233+
/// <param name="sender">The <see cref="ScintillaControl"/> object.</param>
234+
private static void TurnOffScrollBars(ScintillaControl sender)
235+
{
236+
if (sender.Controls.Contains(sender.vScrollBar))
237+
RemoveScrollBars(sender);
163238
}
164239

165240
/// <summary>
166241
/// Add controls to container
167242
/// </summary>
168-
private void AddScrollBars(ScintillaControl sender)
243+
/// <param name="sender">The <see cref="ScintillaControl"/> object.</param>
244+
private static void AddScrollBars(ScintillaControl sender)
169245
{
170-
Boolean vScroll = sender.IsVScrollBar;
171-
Boolean hScroll = sender.IsHScrollBar;
246+
bool vScroll = sender.IsVScrollBar;
247+
bool hScroll = sender.IsHScrollBar;
172248
sender.IsVScrollBar = false; // Hide builtin
173249
sender.IsHScrollBar = false; // Hide builtin
174-
sender.vScrollBar.VisibleChanged += OnResize;
175-
sender.hScrollBar.VisibleChanged += OnResize;
250+
sender.vScrollBar.VisibleChanged += sender.OnResize;
251+
sender.hScrollBar.VisibleChanged += sender.OnResize;
176252
sender.vScrollBar.Scroll += sender.OnScrollBarScroll;
177253
sender.hScrollBar.Scroll += sender.OnScrollBarScroll;
178254
sender.Controls.Add(sender.hScrollBar);
179255
sender.Controls.Add(sender.vScrollBar);
180-
sender.Painted += sender.OnScrollUpdate;
256+
sender.Painted += OnScrollUpdate;
181257
sender.IsVScrollBar = vScroll;
182258
sender.IsHScrollBar = hScroll;
183259
sender.OnResize(null, null);
@@ -186,17 +262,18 @@ private void AddScrollBars(ScintillaControl sender)
186262
/// <summary>
187263
/// Remove controls from container
188264
/// </summary>
189-
private void RemoveScrollBars(ScintillaControl sender)
265+
/// <param name="sender">The <see cref="ScintillaControl"/> object.</param>
266+
private static void RemoveScrollBars(ScintillaControl sender)
190267
{
191-
Boolean vScroll = sender.IsVScrollBar;
192-
Boolean hScroll = sender.IsHScrollBar;
193-
sender.vScrollBar.VisibleChanged -= OnResize;
194-
sender.hScrollBar.VisibleChanged -= OnResize;
268+
bool vScroll = sender.IsVScrollBar;
269+
bool hScroll = sender.IsHScrollBar;
270+
sender.vScrollBar.VisibleChanged -= sender.OnResize;
271+
sender.hScrollBar.VisibleChanged -= sender.OnResize;
195272
sender.vScrollBar.Scroll -= sender.OnScrollBarScroll;
196273
sender.hScrollBar.Scroll -= sender.OnScrollBarScroll;
197274
sender.Controls.Remove(sender.hScrollBar);
198275
sender.Controls.Remove(sender.vScrollBar);
199-
sender.Painted -= sender.OnScrollUpdate;
276+
sender.Painted -= OnScrollUpdate;
200277
sender.IsVScrollBar = vScroll;
201278
sender.IsHScrollBar = hScroll;
202279
sender.OnResize(null, null);
@@ -228,7 +305,7 @@ public ScintillaControl(string fullpath)
228305
DoubleClick += new DoubleClickHandler(OnBlockSelect);
229306
CharAdded += new CharAddedHandler(OnSmartIndent);
230307
Resize += new EventHandler(OnResize);
231-
this.InitScrollBars(this);
308+
InitScrollBars(this);
232309
}
233310
catch (Exception ex)
234311
{

0 commit comments

Comments
 (0)