Skip to content

Commit 3e2fbce

Browse files
authored
Merge pull request #2615 from comintern/next
Clean up Indenter settings UI, add syntax highlighting. Closes #2543
2 parents b0687e1 + acf65e4 commit 3e2fbce

File tree

9 files changed

+642
-217
lines changed

9 files changed

+642
-217
lines changed

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@
232232
<Reference Include="extensibility, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
233233
<EmbedInteropTypes>True</EmbedInteropTypes>
234234
</Reference>
235+
<Reference Include="ICSharpCode.AvalonEdit">
236+
<HintPath>..\packages\AvalonEdit.5.0.3\lib\Net40\ICSharpCode.AvalonEdit.dll</HintPath>
237+
</Reference>
235238
<Reference Include="Infralution.Localization.Wpf">
236239
<HintPath>..\libs\Infralution.Localization.Wpf.dll</HintPath>
237240
</Reference>
@@ -504,6 +507,7 @@
504507
<Compile Include="UI\Command\MenuItems\RegexAssistantCommand.cs" />
505508
<Compile Include="UI\Command\MenuItems\RegexAssistantCommandMenuItem.cs" />
506509
<Compile Include="UI\Command\MenuItems\ParentMenus\ToolsParentMenu.cs" />
510+
<Compile Include="UI\Controls\BindableTextEditor.cs" />
507511
<Compile Include="UI\Controls\LinkButton.xaml.cs">
508512
<DependentUpon>LinkButton.xaml</DependentUpon>
509513
</Compile>
@@ -1155,6 +1159,7 @@
11551159
<SubType>Designer</SubType>
11561160
</None>
11571161
<None Include="packages.config" />
1162+
<EmbeddedResource Include="UI\Controls\vba.xshd" />
11581163
</ItemGroup>
11591164
<ItemGroup>
11601165
<Resource Include="Resources\minus-circle.png" />

RetailCoder.VBE/UI/About/AboutDialog.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,19 @@ private AboutControlViewModel ViewModel
2121
AboutControl.DataContext = _viewModel;
2222
}
2323
}
24+
25+
private void AboutDialog_Load(object sender, System.EventArgs e)
26+
{
27+
28+
}
29+
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
30+
{
31+
if (keyData == Keys.Escape)
32+
{
33+
this.Close();
34+
return true;
35+
}
36+
return base.ProcessCmdKey(ref msg, keyData);
37+
}
2438
}
2539
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System;
2+
using System.ComponentModel;
3+
using System.Reflection;
4+
using System.Windows;
5+
using System.Windows.Media;
6+
using System.Xml;
7+
using ICSharpCode.AvalonEdit;
8+
using ICSharpCode.AvalonEdit.Highlighting;
9+
using ICSharpCode.AvalonEdit.Highlighting.Xshd;
10+
11+
namespace Rubberduck.UI.Controls
12+
{
13+
//see http://stackoverflow.com/a/20823917/4088852
14+
public class BindableTextEditor : TextEditor, INotifyPropertyChanged
15+
{
16+
public BindableTextEditor()
17+
{
18+
WordWrap = false;
19+
20+
var highlighter = LoadHighlighter("Rubberduck.UI.Controls.vba.xshd");
21+
SyntaxHighlighting = highlighter;
22+
23+
//Style hyperlinks so they look like comments. Note - this needs to move if used for user code.
24+
TextArea.TextView.LinkTextUnderline = false;
25+
TextArea.TextView.LinkTextForegroundBrush = new SolidColorBrush(Colors.Green);
26+
Options.RequireControlModifierForHyperlinkClick = false;
27+
Options.EnableHyperlinks = true;
28+
Options.EnableEmailHyperlinks = true;
29+
}
30+
31+
public new string Text
32+
{
33+
get { return base.Text; }
34+
set { base.Text = value; }
35+
}
36+
37+
public static readonly DependencyProperty TextProperty =
38+
DependencyProperty.Register("Text", typeof(string), typeof(BindableTextEditor), new PropertyMetadata((obj, args) =>
39+
{
40+
var target = (BindableTextEditor)obj;
41+
target.Text = (string)args.NewValue;
42+
}));
43+
44+
protected override void OnTextChanged(EventArgs e)
45+
{
46+
RaisePropertyChanged("Text");
47+
base.OnTextChanged(e);
48+
}
49+
50+
public void RaisePropertyChanged(string property)
51+
{
52+
if (PropertyChanged != null)
53+
{
54+
PropertyChanged(this, new PropertyChangedEventArgs(property));
55+
}
56+
}
57+
58+
public event PropertyChangedEventHandler PropertyChanged;
59+
60+
private static IHighlightingDefinition LoadHighlighter(string resource)
61+
{
62+
var assembly = Assembly.GetExecutingAssembly();
63+
using (var stream = assembly.GetManifestResourceStream(resource))
64+
{
65+
if (stream == null)
66+
{
67+
return null;
68+
}
69+
using (var reader = new XmlTextReader(stream))
70+
{
71+
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
72+
}
73+
}
74+
}
75+
}
76+
}

RetailCoder.VBE/UI/Controls/vba.xshd

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
<?xml version="1.0"?>
2+
3+
<!-- Syntaxdefinition for VBA -->
4+
<!-- Adapted from ICSharpCode.AvalonEdit VB.NET Syntaxdefinition by Siegfried Oleg Pammer et.al. -->
5+
<!-- https://github.com/icsharpcode/AvalonEdit -->
6+
<SyntaxDefinition name="VBA" extensions=".vb" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
7+
<Color name="Comment" foreground="Green" exampleText="' comment" />
8+
<Color name="String" exampleText="text = &quot;Hello, World!&quot;" />
9+
<Color name="DateLiteral" foreground="Black" exampleText="endOfWorld = #2012-12-21#" />
10+
<Color name="Preprocessor" foreground="DarkBlue" exampleText="#If WIN32 Then" />
11+
<Color name="DataTypes" foreground="DarkBlue" exampleText="Dim foo As Boolean" />
12+
<Color name="Operators" foreground="Black" exampleText="If foo And bar Then"/>
13+
<Color name="Constants" foreground="Black" exampleText="bar = False" />
14+
<Color name="Keywords" foreground="DarkBlue" exampleText="Select Case foo" />
15+
<Color name="DebugCommands" foreground="DarkBlue" exampleText="Debug.Print foo" />
16+
<Color name="ConversionFunctions" foreground="DarkBlue" exampleText="CInt(foo)" />
17+
<Color name="ContextKeywords" foreground="DarkBlue" exampleText="Option Explicit" />
18+
19+
<Property name="DocCommentMarker" value="'''" />
20+
21+
<RuleSet ignoreCase="true">
22+
<Span color="String">
23+
<Begin>"</Begin>
24+
<End>"</End>
25+
<RuleSet>
26+
<Span begin="&quot;&quot;" end="" />
27+
</RuleSet>
28+
</Span>
29+
30+
<Span color="Preprocessor" ruleSet="PreprocessorSet">
31+
<Begin>(?&lt;=(^\s*))\#</Begin>
32+
</Span>
33+
34+
<Span color="DateLiteral">
35+
<Begin>(?&lt;!(^\s*))\#</Begin>
36+
<End>\#</End>
37+
</Span>
38+
39+
<Span color="Comment" multiline="true">
40+
<Begin>'|^\s*Rem</Begin>
41+
<End>(?&lt;!\s_)$</End>
42+
</Span>
43+
44+
<Keywords color="DebugCommands">
45+
<Word>Assert</Word>
46+
<Word>Debug</Word>
47+
<Word>Print</Word>
48+
<Word>Stop</Word>
49+
</Keywords>
50+
51+
<Keywords color="DataTypes">
52+
<Word>Any</Word>
53+
<Word>Boolean</Word>
54+
<Word>Byte</Word>
55+
<Word>Currency</Word>
56+
<Word>Date</Word>
57+
<Word>Decimal</Word>
58+
<Word>Double</Word>
59+
<Word>Integer</Word>
60+
<Word>Long</Word>
61+
<Word>LongLong</Word>
62+
<Word>LongPtr</Word>
63+
<Word>Object</Word>
64+
<Word>Short</Word>
65+
<Word>Single</Word>
66+
<Word>String</Word>
67+
<Word>Variant</Word>
68+
</Keywords>
69+
70+
<Keywords color="Operators">
71+
<Word>AddressOf</Word>
72+
<Word>And</Word>
73+
<Word>Eqv</Word>
74+
<Word>Imp</Word>
75+
<Word>Is</Word>
76+
<Word>Like</Word>
77+
<Word>Mod</Word>
78+
<Word>New</Word>
79+
<Word>Not</Word>
80+
<Word>Or</Word>
81+
<Word>TypeOf</Word>
82+
<Word>Xor</Word>
83+
</Keywords>
84+
85+
<Keywords color="Constants">
86+
<Word>Empty</Word>
87+
<Word>False</Word>
88+
<Word>Nothing</Word>
89+
<Word>Null</Word>
90+
<Word>True</Word>
91+
</Keywords>
92+
93+
<Keywords color="ConversionFunctions">
94+
<Word>CBool</Word>
95+
<Word>CByte</Word>
96+
<Word>CCur</Word>
97+
<Word>CDate</Word>
98+
<Word>CDbl</Word>
99+
<Word>CDec</Word>
100+
<Word>CInt</Word>
101+
<Word>CLng</Word>
102+
<Word>CLngLng</Word>
103+
<Word>CLngPtr</Word>
104+
<Word>CObj</Word>
105+
<Word>CSng</Word>
106+
<Word>CStr</Word>
107+
<Word>CVar</Word>
108+
<Word>CVErr</Word>
109+
</Keywords>
110+
111+
<Keywords color="Keywords">
112+
<Word>Alias</Word>
113+
<Word>Append</Word>
114+
<Word>As</Word>
115+
<Word>ByRef</Word>
116+
<Word>ByVal</Word>
117+
<Word>Call</Word>
118+
<Word>Case</Word>
119+
<Word>Close</Word>
120+
<Word>Const</Word>
121+
<Word>Command</Word>
122+
<Word>Declare</Word>
123+
<Word>DefBool</Word>
124+
<Word>DefByte</Word>
125+
<Word>DefCur</Word>
126+
<Word>DefDate</Word>
127+
<Word>DefDbl</Word>
128+
<Word>DefInt</Word>
129+
<Word>DefLng</Word>
130+
<Word>DefObj</Word>
131+
<Word>DefSng</Word>
132+
<Word>DefStr</Word>
133+
<Word>DefVar</Word>
134+
<Word>Dim</Word>
135+
<Word>Do</Word>
136+
<Word>Each</Word>
137+
<Word>Else</Word>
138+
<Word>ElseIf</Word>
139+
<Word>End</Word>
140+
<Word>EndIf</Word>
141+
<Word>Enum</Word>
142+
<Word>EOF</Word>
143+
<Word>Erase</Word>
144+
<Word>Error</Word>
145+
<Word>Event</Word>
146+
<Word>Exit</Word>
147+
<Word>For</Word>
148+
<Word>Friend</Word>
149+
<Word>Function</Word>
150+
<Word>Get</Word>
151+
<Word>Global</Word>
152+
<Word>GoSub</Word>
153+
<Word>GoTo</Word>
154+
<Word>If</Word>
155+
<Word>Implements</Word>
156+
<Word>In</Word>
157+
<Word>Input</Word>
158+
<Word>Let</Word>
159+
<Word>Lib</Word>
160+
<Word>Line</Word>
161+
<Word>LOC</Word>
162+
<Word>Lock</Word>
163+
<Word>LOF</Word>
164+
<Word>Loop</Word>
165+
<Word>LSet</Word>
166+
<Word>Name</Word>
167+
<Word>New</Word>
168+
<Word>Next</Word>
169+
<Word>On</Word>
170+
<Word>Open</Word>
171+
<Word>Optional</Word>
172+
<Word>Output</Word>
173+
<Word>ParamArray</Word>
174+
<Word>Private</Word>
175+
<Word>Property</Word>
176+
<Word>Public</Word>
177+
<Word>Put</Word>
178+
<Word>RaiseEvent</Word>
179+
<Word>Random</Word>
180+
<Word>Read</Word>
181+
<Word>ReDim</Word>
182+
<Word>Resume</Word>
183+
<Word>Return</Word>
184+
<Word>RSet</Word>
185+
<Word>Seek</Word>
186+
<Word>Select</Word>
187+
<Word>Set</Word>
188+
<Word>Shared</Word>
189+
<Word>Spc</Word>
190+
<Word>Static</Word>
191+
<Word>Step</Word>
192+
<Word>Sub</Word>
193+
<Word>Tab</Word>
194+
<Word>Then</Word>
195+
<Word>To</Word>
196+
<Word>Type</Word>
197+
<Word>Unlock</Word>
198+
<Word>Until</Word>
199+
<Word>Wend</Word>
200+
<Word>While</Word>
201+
<Word>Width</Word>
202+
<Word>With</Word>
203+
<Word>WithEvents</Word>
204+
<Word>Write</Word>
205+
</Keywords>
206+
207+
<Keywords color="ContextKeywords">
208+
<Word>Base</Word>
209+
<Word>Binary</Word>
210+
<Word>Compare</Word>
211+
<Word>Database</Word>
212+
<Word>Explicit</Word>
213+
<Word>Module</Word>
214+
<Word>Option</Word>
215+
<Word>Preserve</Word>
216+
<Word>Text</Word>
217+
</Keywords>
218+
</RuleSet>
219+
220+
<RuleSet name="PreprocessorSet" ignoreCase="true">
221+
<Keywords>
222+
<Word>Const</Word>
223+
<Word>Else</Word>
224+
<Word>ElseIf</Word>
225+
<Word>End</Word>
226+
<Word>If</Word>
227+
</Keywords>
228+
</RuleSet>
229+
230+
</SyntaxDefinition>

RetailCoder.VBE/UI/FindSymbol/FindSymbolDialog.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,15 @@ public FindSymbolDialog()
2929

3030
Text = string.Format("Rubberduck - {0}", RubberduckUI.FindSymbolDialog_Caption);
3131
}
32+
33+
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
34+
{
35+
if (keyData == Keys.Escape)
36+
{
37+
Close();
38+
return true;
39+
}
40+
return base.ProcessCmdKey(ref msg, keyData);
41+
}
3242
}
3343
}

RetailCoder.VBE/UI/RubberduckUI.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/UI/RubberduckUI.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,4 +1911,7 @@ Would you like to import them to Rubberduck?</value>
19111911
<data name="DeclarationType_BracketedExpression" xml:space="preserve">
19121912
<value>runtime expression</value>
19131913
</data>
1914+
<data name="IndenterSettings_CodeSampleHeader" xml:space="preserve">
1915+
<value>Indented Code Sample</value>
1916+
</data>
19141917
</root>

0 commit comments

Comments
 (0)