Datei: NDOPackage/Commands/AddAccessorVb.cs
Last Commit (946ad0e)
| 1 | // |
| 2 | // Copyright (c) 2002-2019 Mirko Matytschak |
| 3 | // (www.netdataobjects.de) |
| 4 | // |
| 5 | // Author: Mirko Matytschak |
| 6 | // |
| 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated |
| 8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation |
| 9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the |
| 10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following |
| 11 | // conditions: |
| 12 | |
| 13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions |
| 14 | // of the Software. |
| 15 | // |
| 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
| 17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF |
| 19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 20 | // DEALINGS IN THE SOFTWARE. |
| 21 | |
| 22 | |
| 23 | using System; |
| 24 | using System.IO; |
| 25 | using System. Windows. Forms; |
| 26 | using EnvDTE; |
| 27 | using EnvDTE80; |
| 28 | using Microsoft.VisualStudio.CommandBars; |
| 29 | using System.Text.RegularExpressions; |
| 30 | |
| 31 | namespace NDOVsPackage.Commands |
| 32 | { |
| 33 | ····/// <summary> |
| 34 | ····/// Zusammenfassung für AddAccessorCs. |
| 35 | ····/// </summary> |
| 36 | ····internal class AddAccessorVb |
| 37 | ····{ |
| 38 | ········TextDocument textDoc; |
| 39 | ········Document document; |
| 40 | |
| 41 | ········public AddAccessorVb(TextDocument textDoc, Document document) |
| 42 | ········{ |
| 43 | ············this.document = document; |
| 44 | ············this.textDoc = textDoc; |
| 45 | ········} |
| 46 | |
| 47 | ········public void DoIt() |
| 48 | ········{ |
| 49 | ············bool genChangeEvent = false; |
| 50 | |
| 51 | ············try |
| 52 | ············{ |
| 53 | ················string result; |
| 54 | ················int textLine = textDoc.Selection.TopLine; |
| 55 | ················if (textLine != textDoc.Selection.BottomLine) |
| 56 | ····················return; |
| 57 | ················textDoc.Selection.SelectLine(); |
| 58 | ················string original = textDoc.Selection.Text; |
| 59 | ················Regex regex = new Regex(@"<[^\>]+\>"); |
| 60 | ················Match match = regex.Match(original); |
| 61 | ················string attrtext; |
| 62 | ················if (match.Success) |
| 63 | ················{ |
| 64 | ····················attrtext = match.Value; |
| 65 | ················} |
| 66 | ················else |
| 67 | ················{ |
| 68 | ····················textDoc.Selection.LineUp(false, 1); |
| 69 | ····················textDoc.Selection.SelectLine(); |
| 70 | ····················match = regex.Match(textDoc.Selection.Text); |
| 71 | ····················attrtext = match.Value; |
| 72 | ················} |
| 73 | ················bool hasAttribute = match.Success; |
| 74 | ················textDoc.Selection.CharRight(false, 1); |
| 75 | ················textDoc.Selection.LineDown(false, 1); |
| 76 | |
| 77 | //················int i = 0; |
| 78 | //················string bl = string.Empty; |
| 79 | //················while (char.IsWhiteSpace(original[i])) |
| 80 | //····················bl += original[i++]; |
| 81 | ················TabProperty tp = TabProperties.Instance.VBasic; |
| 82 | ················string bl = tp.Indent; |
| 83 | |
| 84 | ················string selLine = original.Trim(); |
| 85 | ················regex = new Regex(@"(Dim|Private)\s([^\s]+)\sAs\s(New\s|)([^\s^(]+)(\s*|)(\(Of\s*([^\s]+)\)|)", RegexOptions.IgnoreCase); |
| 86 | ················match = regex.Match(selLine); |
| 87 | ················if (!match.Success) |
| 88 | ················{ |
| 89 | ····················MessageBox.Show("Please select a private member variable declaration"); |
| 90 | ····················return; |
| 91 | ················} |
| 92 | ················string typeStr = match.Groups[4].Value; |
| 93 | ················string bigname; |
| 94 | ················string name = match.Groups[2].Value; |
| 95 | ················string genericParameter = match.Groups[6].Value; |
| 96 | ················string genericArgumentType = match.Groups[7].Value; |
| 97 | ················ |
| 98 | ················bool hasPrefix = false; |
| 99 | |
| 100 | ················if (name.StartsWith("_")) |
| 101 | ················{ |
| 102 | ····················bigname = name.Substring(1); |
| 103 | ····················hasPrefix = true; |
| 104 | ················} |
| 105 | ················else if (name.StartsWith("m_")) |
| 106 | ················{ |
| 107 | ····················bigname = name.Substring(2); |
| 108 | ····················hasPrefix = true; |
| 109 | ················} |
| 110 | ················else |
| 111 | ····················bigname = name; |
| 112 | |
| 113 | ················if (!hasPrefix) |
| 114 | ····················bigname = "P" + bigname; |
| 115 | ················else |
| 116 | ····················bigname = bigname.Substring(0, 1).ToUpper() + bigname.Substring(1); |
| 117 | |
| 118 | ················bool isContainer = (typeStr == "IList" || typeStr == "List" || typeStr == "ArrayList" || typeStr == "NDOArrayList" || typeStr == "NDOGenericList"); |
| 119 | ················isContainer = hasAttribute && isContainer; |
| 120 | ················ |
| 121 | ················bool isGenericList = genericParameter != string.Empty && genericArgumentType != string.Empty; |
| 122 | ················if (isGenericList) |
| 123 | ····················typeStr += genericParameter; |
| 124 | |
| 125 | ················if (isContainer) |
| 126 | ················{ |
| 127 | ····················attrtext = attrtext.Trim(); |
| 128 | ····················string elementTyp = null; |
| 129 | ····················if (!isGenericList) |
| 130 | ························elementTyp = GetElementTyp(attrtext); |
| 131 | ····················else |
| 132 | ························elementTyp = genericArgumentType; |
| 133 | ····················string relationName = GetRelationName(attrtext); |
| 134 | |
| 135 | ····················if (relationName == null) |
| 136 | ····················{ |
| 137 | ························int p = elementTyp.LastIndexOf("."); |
| 138 | ························relationName = elementTyp.Substring(p + 1); |
| 139 | ····················} |
| 140 | |
| 141 | ····················bool isComposite = (attrtext.IndexOf("RelationInfo.Composite") > -1); |
| 142 | ····················string parameter = elementTyp.Substring(0, 1).ToLower(); |
| 143 | ····················result = string.Empty; |
| 144 | ····················if (isComposite) |
| 145 | ····················{ |
| 146 | ························result += bl + "Public Function New" + relationName + "() As " + elementTyp + "\n"; |
| 147 | ························result += bl + "\tDim " + parameter + " As " + elementTyp + " = New " + elementTyp + "\n"; |
| 148 | ························result += bl + "\t" + name + ".Add(" + parameter + ")\n"; |
| 149 | ························result += bl + "\t" + "return " + parameter + "\n"; |
| 150 | ························result += bl + "End Function\n"; |
| 151 | ····················} |
| 152 | ····················else |
| 153 | ····················{ |
| 154 | ························result += bl + "Public Sub Add" + relationName + "(" + parameter + " As " + elementTyp + ")\n"; |
| 155 | ························result += bl + "\t" + name + ".Add(" + parameter + ")\n"; |
| 156 | ························result += bl + "End Sub\n"; |
| 157 | ····················} |
| 158 | ····················result += bl + "Public Sub Remove" + relationName + "(" + parameter + " As " + elementTyp + ")\n"; |
| 159 | ····················result += bl + "\tIf " + name + ".Contains(" + parameter + ") Then\n"; |
| 160 | ····················result += bl + "\t\t" + name + ".Remove(" + parameter + ")\n"; |
| 161 | ····················result += bl + "\tEnd If\n"; |
| 162 | ····················result += bl + "End Sub\n"; |
| 163 | ····················textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 164 | ················} |
| 165 | ················else // wir haben es mit einer Elementbeziehung bzw. einem Feld zu tun |
| 166 | ················{ |
| 167 | ····················ConfigurationOptions options = new ConfigurationOptions(document.ProjectItem.ContainingProject); |
| 168 | ····················if (options.GenerateChangeEvents) |
| 169 | ····················{ |
| 170 | ························genChangeEvent = true; |
| 171 | ························result = bl + "Public Event " + bigname + "Changed As EventHandler\n"; |
| 172 | ························textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 173 | ····················} |
| 174 | ················} |
| 175 | |
| 176 | ················string ilistType = isGenericList ? "IEnumerable " + genericParameter : "IEnumerable" ;···································· |
| 177 | |
| 178 | ················result = string.Empty; |
| 179 | ················if (isContainer) |
| 180 | ····················result += bl + "Public Property " + bigname + "() As " + ilistType + "\n"; |
| 181 | ················else |
| 182 | ····················result += bl + "Public Property " + bigname + "() As " + typeStr + "\n"; |
| 183 | ················result += bl + "\tGet\n"; |
| 184 | ················result += bl + "\t\tReturn " + name + "\n"; |
| 185 | ················result += bl + "\tEnd Get\n"; |
| 186 | ················if (isContainer) |
| 187 | ····················result += bl + "\tSet(ByVal Value As " + ilistType +")\n"; |
| 188 | ················else |
| 189 | ····················result += bl + "\tSet(ByVal Value As " + typeStr + ")\n"; |
| 190 | ················if (isContainer) |
| 191 | ····················if (!isGenericList) |
| 192 | ························result += bl + "\t\t" + name + " = New ArrayList(CType(Value, ICollection))\n"; |
| 193 | ····················else |
| 194 | ························result += bl + "\t\t" + name + " = Value.ToList()\n"; |
| 195 | ················else |
| 196 | ····················result += bl + "\t\t" + name + " = Value\n"; |
| 197 | ················if (genChangeEvent) |
| 198 | ····················result += bl + "\t\tRaiseEvent " + bigname + "Changed(Me, EventArgs.Empty)\n"; |
| 199 | ················result += bl + "\tEnd Set\n"; |
| 200 | ················result += bl + "End Property\n"; |
| 201 | ················textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 202 | ············}················ |
| 203 | ············catch (Exception e) |
| 204 | ············{ |
| 205 | ················MessageBox.Show(e.Message, "Add Accessor Add-in"); |
| 206 | ············} |
| 207 | ········} |
| 208 | |
| 209 | ········private string GetElementTyp(string attrtext) |
| 210 | ········{ |
| 211 | ············Regex regex = new Regex(@"<NDORelation\(GetType\(([^\)]+)"); |
| 212 | ············Match match = regex.Match(attrtext); |
| 213 | ············if (match.Success) |
| 214 | ············{ |
| 215 | ················return match.Groups[1].Value; |
| 216 | ············} |
| 217 | ············return null; |
| 218 | ········} |
| 219 | |
| 220 | ········private string GetRelationName(string attrtext) |
| 221 | ········{ |
| 222 | ············string result; |
| 223 | ············if (attrtext.IndexOf(@"NDORelation") == -1) |
| 224 | ················return null; |
| 225 | |
| 226 | ············Regex regex = new Regex(@"("")([^""]+)("")"); |
| 227 | ············Match match = regex.Match(attrtext); |
| 228 | ············if (match.Success) // wir haben einen Relationsnamen |
| 229 | ············{ |
| 230 | ················result = match.Groups[2].Value; |
| 231 | ················if (char.IsLower(result[0])) |
| 232 | ····················result = result.Substring(0, 1).ToUpper() + result.Substring(1); |
| 233 | ················return result; |
| 234 | ············} |
| 235 | ············return null; |
| 236 | ········} |
| 237 | |
| 238 | ····} |
| 239 | } |
| 240 |
New Commit (33e9857)
| 1 | // |
| 2 | // Copyright (c) 2002-2019 Mirko Matytschak |
| 3 | // (www.netdataobjects.de) |
| 4 | // |
| 5 | // Author: Mirko Matytschak |
| 6 | // |
| 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated |
| 8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation |
| 9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the |
| 10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following |
| 11 | // conditions: |
| 12 | |
| 13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions |
| 14 | // of the Software. |
| 15 | // |
| 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
| 17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF |
| 19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| 20 | // DEALINGS IN THE SOFTWARE. |
| 21 | |
| 22 | |
| 23 | using System; |
| 24 | using System.IO; |
| 25 | using MessageBox = System. Windows. Forms. MessageBox; |
| 26 | using EnvDTE; |
| 27 | using System.Text.RegularExpressions; |
| 28 | |
| 29 | #pragma warning disable VSTHRD010 // Invoke single-threaded types on Main thread |
| 30 | |
| 31 | namespace NDOVsPackage.Commands |
| 32 | { |
| 33 | ····/// <summary> |
| 34 | ····/// Zusammenfassung für AddAccessorCs. |
| 35 | ····/// </summary> |
| 36 | ····internal class AddAccessorVb |
| 37 | ····{ |
| 38 | ········TextDocument textDoc; |
| 39 | ········Document document; |
| 40 | |
| 41 | ········public AddAccessorVb(TextDocument textDoc, Document document) |
| 42 | ········{ |
| 43 | ············this.document = document; |
| 44 | ············this.textDoc = textDoc; |
| 45 | ········} |
| 46 | |
| 47 | ········public void DoIt() |
| 48 | ········{ |
| 49 | ············bool genChangeEvent = false; |
| 50 | |
| 51 | ············try |
| 52 | ············{ |
| 53 | ················string result; |
| 54 | ················int textLine = textDoc.Selection.TopLine; |
| 55 | ················if (textLine != textDoc.Selection.BottomLine) |
| 56 | ····················return; |
| 57 | ················textDoc.Selection.SelectLine(); |
| 58 | ················string original = textDoc.Selection.Text; |
| 59 | ················Regex regex = new Regex(@"<[^\>]+\>"); |
| 60 | ················Match match = regex.Match(original); |
| 61 | ················string attrtext; |
| 62 | ················if (match.Success) |
| 63 | ················{ |
| 64 | ····················attrtext = match.Value; |
| 65 | ················} |
| 66 | ················else |
| 67 | ················{ |
| 68 | ····················textDoc.Selection.LineUp(false, 1); |
| 69 | ····················textDoc.Selection.SelectLine(); |
| 70 | ····················match = regex.Match(textDoc.Selection.Text); |
| 71 | ····················attrtext = match.Value; |
| 72 | ················} |
| 73 | ················bool hasAttribute = match.Success; |
| 74 | ················textDoc.Selection.CharRight(false, 1); |
| 75 | ················textDoc.Selection.LineDown(false, 1); |
| 76 | |
| 77 | //················int i = 0; |
| 78 | //················string bl = string.Empty; |
| 79 | //················while (char.IsWhiteSpace(original[i])) |
| 80 | //····················bl += original[i++]; |
| 81 | ················TabProperty tp = TabProperties.Instance.VBasic; |
| 82 | ················string bl = tp.Indent; |
| 83 | |
| 84 | ················string selLine = original.Trim(); |
| 85 | ················regex = new Regex(@"(Dim|Private)\s([^\s]+)\sAs\s(New\s|)([^\s^(]+)(\s*|)(\(Of\s*([^\s]+)\)|)", RegexOptions.IgnoreCase); |
| 86 | ················match = regex.Match(selLine); |
| 87 | ················if (!match.Success) |
| 88 | ················{ |
| 89 | ····················MessageBox.Show("Please select a private member variable declaration"); |
| 90 | ····················return; |
| 91 | ················} |
| 92 | ················string typeStr = match.Groups[4].Value; |
| 93 | ················string bigname; |
| 94 | ················string name = match.Groups[2].Value; |
| 95 | ················string genericParameter = match.Groups[6].Value; |
| 96 | ················string genericArgumentType = match.Groups[7].Value; |
| 97 | ················ |
| 98 | ················bool hasPrefix = false; |
| 99 | |
| 100 | ················if (name.StartsWith("_")) |
| 101 | ················{ |
| 102 | ····················bigname = name.Substring(1); |
| 103 | ····················hasPrefix = true; |
| 104 | ················} |
| 105 | ················else if (name.StartsWith("m_")) |
| 106 | ················{ |
| 107 | ····················bigname = name.Substring(2); |
| 108 | ····················hasPrefix = true; |
| 109 | ················} |
| 110 | ················else |
| 111 | ····················bigname = name; |
| 112 | |
| 113 | ················if (!hasPrefix) |
| 114 | ····················bigname = "P" + bigname; |
| 115 | ················else |
| 116 | ····················bigname = bigname.Substring(0, 1).ToUpper() + bigname.Substring(1); |
| 117 | |
| 118 | ················bool isContainer = (typeStr == "IList" || typeStr == "List" || typeStr == "ArrayList" || typeStr == "NDOArrayList" || typeStr == "NDOGenericList"); |
| 119 | ················isContainer = hasAttribute && isContainer; |
| 120 | ················ |
| 121 | ················bool isGenericList = genericParameter != string.Empty && genericArgumentType != string.Empty; |
| 122 | ················if (isGenericList) |
| 123 | ····················typeStr += genericParameter; |
| 124 | |
| 125 | ················if (isContainer) |
| 126 | ················{ |
| 127 | ····················attrtext = attrtext.Trim(); |
| 128 | ····················string elementTyp = null; |
| 129 | ····················if (!isGenericList) |
| 130 | ························elementTyp = GetElementTyp(attrtext); |
| 131 | ····················else |
| 132 | ························elementTyp = genericArgumentType; |
| 133 | ····················string relationName = GetRelationName(attrtext); |
| 134 | |
| 135 | ····················if (relationName == null) |
| 136 | ····················{ |
| 137 | ························int p = elementTyp.LastIndexOf("."); |
| 138 | ························relationName = elementTyp.Substring(p + 1); |
| 139 | ····················} |
| 140 | |
| 141 | ····················bool isComposite = (attrtext.IndexOf("RelationInfo.Composite") > -1); |
| 142 | ····················string parameter = elementTyp.Substring(0, 1).ToLower(); |
| 143 | ····················result = string.Empty; |
| 144 | ····················if (isComposite) |
| 145 | ····················{ |
| 146 | ························result += bl + "Public Function New" + relationName + "() As " + elementTyp + "\n"; |
| 147 | ························result += bl + "\tDim " + parameter + " As " + elementTyp + " = New " + elementTyp + "\n"; |
| 148 | ························result += bl + "\t" + name + ".Add(" + parameter + ")\n"; |
| 149 | ························result += bl + "\t" + "return " + parameter + "\n"; |
| 150 | ························result += bl + "End Function\n"; |
| 151 | ····················} |
| 152 | ····················else |
| 153 | ····················{ |
| 154 | ························result += bl + "Public Sub Add" + relationName + "(" + parameter + " As " + elementTyp + ")\n"; |
| 155 | ························result += bl + "\t" + name + ".Add(" + parameter + ")\n"; |
| 156 | ························result += bl + "End Sub\n"; |
| 157 | ····················} |
| 158 | ····················result += bl + "Public Sub Remove" + relationName + "(" + parameter + " As " + elementTyp + ")\n"; |
| 159 | ····················result += bl + "\tIf " + name + ".Contains(" + parameter + ") Then\n"; |
| 160 | ····················result += bl + "\t\t" + name + ".Remove(" + parameter + ")\n"; |
| 161 | ····················result += bl + "\tEnd If\n"; |
| 162 | ····················result += bl + "End Sub\n"; |
| 163 | ····················textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 164 | ················} |
| 165 | ················else // wir haben es mit einer Elementbeziehung bzw. einem Feld zu tun |
| 166 | ················{ |
| 167 | ····················ConfigurationOptions options = new ConfigurationOptions(document.ProjectItem.ContainingProject); |
| 168 | ····················if (options.GenerateChangeEvents) |
| 169 | ····················{ |
| 170 | ························genChangeEvent = true; |
| 171 | ························result = bl + "Public Event " + bigname + "Changed As EventHandler\n"; |
| 172 | ························textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 173 | ····················} |
| 174 | ················} |
| 175 | |
| 176 | ················string ilistType = isGenericList ? "IEnumerable " + genericParameter : "IEnumerable" ;···································· |
| 177 | |
| 178 | ················result = string.Empty; |
| 179 | ················if (isContainer) |
| 180 | ····················result += bl + "Public Property " + bigname + "() As " + ilistType + "\n"; |
| 181 | ················else |
| 182 | ····················result += bl + "Public Property " + bigname + "() As " + typeStr + "\n"; |
| 183 | ················result += bl + "\tGet\n"; |
| 184 | ················result += bl + "\t\tReturn " + name + "\n"; |
| 185 | ················result += bl + "\tEnd Get\n"; |
| 186 | ················if (isContainer) |
| 187 | ····················result += bl + "\tSet(ByVal Value As " + ilistType +")\n"; |
| 188 | ················else |
| 189 | ····················result += bl + "\tSet(ByVal Value As " + typeStr + ")\n"; |
| 190 | ················if (isContainer) |
| 191 | ····················if (!isGenericList) |
| 192 | ························result += bl + "\t\t" + name + " = New ArrayList(CType(Value, ICollection))\n"; |
| 193 | ····················else |
| 194 | ························result += bl + "\t\t" + name + " = Value.ToList()\n"; |
| 195 | ················else |
| 196 | ····················result += bl + "\t\t" + name + " = Value\n"; |
| 197 | ················if (genChangeEvent) |
| 198 | ····················result += bl + "\t\tRaiseEvent " + bigname + "Changed(Me, EventArgs.Empty)\n"; |
| 199 | ················result += bl + "\tEnd Set\n"; |
| 200 | ················result += bl + "End Property\n"; |
| 201 | ················textDoc.Selection.Insert(result, (int)vsInsertFlags.vsInsertFlagsInsertAtStart); |
| 202 | ············}················ |
| 203 | ············catch (Exception e) |
| 204 | ············{ |
| 205 | ················MessageBox.Show(e.Message, "Add Accessor Add-in"); |
| 206 | ············} |
| 207 | ········} |
| 208 | |
| 209 | ········private string GetElementTyp(string attrtext) |
| 210 | ········{ |
| 211 | ············Regex regex = new Regex(@"<NDORelation\(GetType\(([^\)]+)"); |
| 212 | ············Match match = regex.Match(attrtext); |
| 213 | ············if (match.Success) |
| 214 | ············{ |
| 215 | ················return match.Groups[1].Value; |
| 216 | ············} |
| 217 | ············return null; |
| 218 | ········} |
| 219 | |
| 220 | ········private string GetRelationName(string attrtext) |
| 221 | ········{ |
| 222 | ············string result; |
| 223 | ············if (attrtext.IndexOf(@"NDORelation") == -1) |
| 224 | ················return null; |
| 225 | |
| 226 | ············Regex regex = new Regex(@"("")([^""]+)("")"); |
| 227 | ············Match match = regex.Match(attrtext); |
| 228 | ············if (match.Success) // wir haben einen Relationsnamen |
| 229 | ············{ |
| 230 | ················result = match.Groups[2].Value; |
| 231 | ················if (char.IsLower(result[0])) |
| 232 | ····················result = result.Substring(0, 1).ToUpper() + result.Substring(1); |
| 233 | ················return result; |
| 234 | ············} |
| 235 | ············return null; |
| 236 | ········} |
| 237 | |
| 238 | ····} |
| 239 | } |
| 240 | #pragma warning restore VSTHRD010 // Invoke single-threaded types on Main thread |
| 241 |