Home > Services > DXCore Services – Source (SourceModel)

DXCore Services – Source (SourceModel)

April 7th, 2011

Provides access to the source model services. This DXCore service contains lots of useful APIs for working with the source code of the entire solution hierarchy.

Methods of this service:

AddPrototype(Method, String) Adds a prototype for the given Method language element instance, if needed (e.g. in C++ language).
AssemblyReferenced(String) Returns true, if the specified assembly is referenced in the active project.
BeginUpdate This method suspends parsing and is useful if you plan to make several repeated changes to the code. If you call this inside plug-in, you must guarantee a call to EndUpdate() (e.g., placed in a finally block), so normal parsing can resume.
ChangeVisibility( AccessSpecifiedElement, MemberVisibility) Changes the visibility of the specified element in the active text document.
ChangeVisibility( AccessSpecifiedElement[], MemberVisibility) Changes the visibility of an array of the elements in the active text document.
ContainsAnonymousType(ICollection) Returns true, if the given collection contains at least one anonymous type or anonymous type reference.
ContainsAnonymousType(IElement) Returns true, if the given element contains at least one anonymous type or anonymous type reference inside its children.
CutNamespaceFromFullTypeName( String, String) Removes namespace name from the full type name. Note that it is hidden from Intellisense.
DeclareNamespaceReference(String) Declares the specified namespace reference (e.g., inside a using statement for C# or an imports statement for VB) if not yet declared.
DeclaresLocal(String) Returns true, if the specified identifier is declared locally inside the active method or property. Refactor! product must be installed for this method to work.
DeclaresLocalOfType(String) Returns true, if a local variable of the specified type is declared inside the active method or property. Refactor! product must be installed for this method to work.
DeclaresMember(String) Returns true, if the active type declares a member with the specified name.
DescendsFrom(String) Returns true, if the active class descends from the specified ancestor type.
ElementFromLocation(String) Returns a language element corresponding to the specified location. Note that it is hidden from Intellisense.
EndUpdate Marks the end of an update session. You must call this once for every call to BeginUpdate().
EndUpdate(Boolean) Marks the end of an update session. You must call this once for every call to BeginUpdate(). Takes a boolean parameter which specifies whether any changes were made during the update.
FindElement( LanguageElementCollection, String) Finds an element with the given name inside the specified collection of language elements. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindElementByFullName( LanguageElementCollection, String) Performs a recursive search for an element with the given name inside the specified collection of language elements. Note that it is hidden from Intellisense.
FindElementByLocation( LanguageElementCollection, String) Finds an element with the given location inside the specified collection of language elements. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindElements( LanguageElementCollection, String) Finds elements with the given name inside the specified collection of language elements. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindMember(LanguageElement, String) Finds a member with the given name inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindMembers(LanguageElement, String) Finds members with the given name inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindNamespaceByLocation( LanguageElement, String) Recursively searches for a namespace with the given location inside the specified language element. Note that it is hidden from Intellisense.
FindType(String) Finds the ITypeElement instance by the specified type name. The returned type will be in the scope of the active language element.
FindTypeOrNamespace( LanguageElement, String) Finds a type or namespace with the given name inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
FindTypeOrNamespace( LanguageElement, String, Boolean) Recursively searches for a type or namespace with the given name inside the specified language element. Note that it is hidden from Intellisense.
FindTypeOrNamespaceByLocation( LanguageElement, String) Recursively searches for a type or namespace with the given location inside the specified language element. Note that it is hidden from Intellisense.
FindTypes(String) Returns a list of ITypeElement instances specified by the given name.
GetActiveClassInterfaceOrStruct( LanguageElement) Gets the class, interface, struct or module that contains the language element. Returns null if the language element is not located inside a class, interface, struct or module.
GetActiveMethod( LanguageElement) Gets the Method instance that contains the language element. Returns null if the language element is not located inside a method.
GetActiveMethodOrProperty( LanguageElement) Gets the Property instance that contains the language element. Returns null if the language element is not located inside a property.
GetActiveMethodOrPropertyAccessor( LanguageElement) Gets the method or property’s accessor instance that contains the language element. Returns null if the language element is not located inside a method or property’s accessor.
GetActiveOrNodeBefore(SourcePoint) Returns the language element that ends before the specified point. Note that it is hidden from Intellisense.
GetActiveOrNodeBeforeCaret Returns the language element that ends before the editor caret position. Note that it is hidden from Intellisense.
GetAjaxAssemblyName Returns the name of the ASP.NET AJAX Extensions assembly.
GetAllBaseTypes(ITypeElement) Returns all base types for the pointed type declaration.
GetAllCodeMetricProviders Retrieves all available code metric providers.
GetAspImportedNamespaces( ProjectElement) Returns a string collection of imported namespaces for the specified ASP.NET project. Note that it is hidden from Intellisense.
GetBaseTypes(ITypeElement) Returns a list of all base types for the given type declaration instance.
GetBlockNecessityAt(SourcePoint) Gets the necessity of the start and end blocks (e.g. “{” and “}”) after inserting a new text at the specified source point
GetBuildAction(SourceFile) Gets the source file build action.
GetCodeActive( LanguageElement, SourcePoint) Returns the active language element inside an ASP code embedding element.
GetCodeMetricProvider(String) Retrieves a code metric provider by name.
GetCodeMetricValue(String, LanguageElement) Retrieves a code metric value for the given LanguageElement instance using the specified code metric provider.
GetComments Returns a collection of comments inside the given scope.
GetCommentsFromNodes Returns a collection of comments inside the given nodes list.
GetCommonParent( LanguageElement, LanguageElement) Gets the common parent of the two specified nodes. Returns null if the two nodes do not have a common parent.
GetCommonParent( LanguageElement, LanguageElement, Boolean) Gets the common parent of the two specified nodes. Returns null if the two nodes do not have a common parent. If the ‘checkNodes’ boolean parameter is true, the method will check the language element nodes of the passed in first and second elements. If the first node parents the second one, the first node will be returned. If the second node parents the first one, then the first node will be returned.
GetDeclaration(IElement) Returns declaration for the given language element. Language element is restored for the declaration.
GetDeclaration(IElement, Boolean) Returns declaration for the given language element.
GetDeclaration(IElement, String) Returns declaration for the given identifier starting from the given element. Language element is restored for the declaration.
GetDeclaration(IElement, String, Boolean) Returns declaration for the given identifier starting from the given element.
GetDeclaration(SourcePoint, String) Returns declaration for the given identifier starting from the editor caret position.
GetDeclarationAtCaret(String) Returns declaration for the given identifier starting from the editor caret position.
GetDefineDirectiveDeclaration( SourceFile, SourcePoint) Returns a declaration of the define directive at the specified location. Note that it is hidden from Intellisense.
GetExpressionInRange( LanguageElement, SourceRange) Returns an expression inside of the specified language element and restricted within the given source range.
GetFileNode(Text document) Returns the source file language element for the specified text document.
GetFirstStatement(LanguageElement) Returns the first statement inside the given one.
GetIdentifierDeclaration(String) Finds the declaration for the specified identifier. Note that it is hidden from Intellisense.
GetIdentifierDeclaration(String, IdentifierList) Finds the declaration for the specified identifier. Note that it is hidden from Intellisense.
GetIdentifierDeclaration(String, LanguageElement, Int32, Int32) Finds the declaration for the specified identifier. Note that it is hidden from Intellisense.
GetIdentifierList( LanguageElement, Int32, Int32) Returns an IdentifierList suitable for iterating through nodes visible to the specified location.
GetLanguageElement(IElement) Gets the LanguageElement instance from the given IElement instance.
GetMember(ITypeElement, String) Finds the specified member in the specified type or an ancestor class. Returns null, if not found.
GetMember(ITypeElement, String, Boolean) Finds the specified member in the specified type. Optionally searches inside ancestor classes. Returns null, if not found.
GetMember(ITypeElement, String, IElementFilter, Boolean) Finds and returns the specified member in the specified type. Optionally searches ancestor classes, and also allows you to pass an IElementFilter descendant to filter out possible elements. Returns null, if not found.
GetMembers(LanguageElement) Returns a collection of members defined inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
GetMembers(LanguageElement, Boolean) Returns a collection of members defined inside the specified language element. Note that it is hidden from Intellisense.
GetMethod(ITypeElement, String) Finds the specified method in the specified type or inside an ancestor class. Returns null if not found.
GetMethod(ITypeElement, String, Boolean) Finds the specified method in the specified type. Optionally searches ancestor classes. Returns null if not found.
GetNamespaces(LanguageElement) Returns a collection of namespaces defined inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
GetNamespaces(LanguageElement, Boolean) Returns a collection of namespaces defined inside the specified language element. Note that it is hidden from Intellisense.
GetNamespaces(String) Returns the collection of all namespace declarations specified by the given name. Note that it is hidden from Intellisense.
GetNearestParentingStatement( SourcePoint) Returns the first PartingStatement instance that parents the element at the given source point.
GetNextStatementToExecute( LanguageElement) Returns the next statement that will be executed. Returns null if the control flow will leave current method or property accessor.
GetNodeAt(EditPoint) Returns the node at the specified edit point.
GetNodeAt(Int32, Int32) Returns the node at the specified line and column position in the active document.
GetNodeAt(LanguageElement, Int32, Int32) Returns the node at the specified line and column position in the specified file node.
GetNodeAt(SourcePoint) Returns the node at the specified SourcePoint.
GetNodeAt(TextPoint) Returns the node at the specified TextPoint.
GetNodeBefore(SourcePoint) Gets the node that ends prior to the specified SourcePoint in the active text document.
GetNodeBefore(SourcePoint, LanguageElement) Gets the node that ends prior to the specified SourcePoint in the active text document.
GetNonBorderingParent(SourceRange) Gets a parent of the specified SourceRange that does not immediately border the SourceRange’s Start or End points. There must be at least one character between the parent’s boundaries and the specified SourceRange.
GetParentsThatAreSiblings( LanguageElement, LanguageElement, LanguageElement, LanguageElement) Gets the parent nodes to the specified nodes that are siblings to each other. This method is useful when you need to select a range of code that spans two sibling nodes, and you have two non-sibling nodes that must be included in that selection.
GetProjectConfigurationName( ProjectElement) Returns the name of the project configuration.
GetProperty(ITypeElement, String) Finds a property in the specified type or inside an ancestor class. Returns null, if not found.
GetProperty(ITypeElement, String, Boolean) Finds a property in the specified type. Optionally searches inside ancestor classes. Returns null, if not found.
GetReferencedDeclarationInRange( LanguageElement, SourceRange) Returns the reference to the declaration mapping for all elements inside the specified scope at the given source range.
GetRegionAt(Int32, Int32) Returns the region directive at the specified line and column position in the active Text document.
GetRegionAt(SourcePoint) Returns the region directive at the specified SourcePoint in the active text document.
GetReturnTypeName Returns the name of the type of the active method or property.
GetSelectedExpression( TextDocument, TextView, SourceRange) Returns the currently selected expression. If there is no expression selected, then this property returns null.
GetSelectedNodes Retrieves an array, containing the currently selected nodes of the active text document’s parse tree.
GetStartWordRange( LanguageElement) Returns the source range of the language element’s starting word.
GetStorage(ProjectElement, String) Returns the project specific decoupled storage for the given options page.
GetStorage(ProjectElement, String, String) Returns the project specific decoupled storage for the given options page.
GetStorage(SolutionElement, String) Returns the solution specific decoupled storage for the given options page.
GetStorage(SolutionElement, String, String) Returns the solution specific decoupled storage for the given options page.
GetStringAt(EditPoint) Returns the TextString at the specified EditPoint.
GetStringAt(Int32, Int32) Returns the TextString at the specified line and column position.
GetStringAt(SourcePoint) Returns the TextString at the specified SourcePoint.
GetStrings(LanguageElement) Returns a collection of strings inside the language element.
GetSupportedCodeMetricProviders( String) Retrieves all code metric providers that support the specified language.
GetTypeName(LanguageElement) Returns the type (as a string) of the specified language element.
GetTypeName(String) Returns the type (as a string) of the specified identifier.
GetTypes(LanguageElement) Returns a collection of types defined inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
GetTypes(LanguageElement, Boolean) Returns a collection of types defined inside the specified language element. Note that it is hidden from Intellisense.
GetTypesOrNamespaces( LanguageElement) Returns a collection of types or namespaces defined inside the specified language element. Only first level nodes are checked. Note that it is hidden from Intellisense.
GetTypesOrNamespaces( LanguageElement, Boolean) Returns a collection of types or namespaces defined inside the specified language element. Note that it is hidden from Intellisense.
GetWordRangeAt(SourcePoint) Returns the source range of the word at the given location.
GetXmlDocComments Returns a collection of XML doc comments inside the given scope.
GetXmlDocCommentsFromNodes Returns a collection of XML doc comments inside the given collection of nodes.
HasMember(String) Returns true, if the active type or an ancestor class declares a member with the specified name.
HasMethod(String) Returns true, if the active type or an ancestor class declares a method with the specified name.
HasProperty(IElement, String) Returns true, if the specified IElement instance is a type that declares the specified property.
HasProperty(String, String) Returns true, if the specified identifier (whose declaration is visible from the editor caret position) has the specified property.
HasStaticInitializer(String) Returns true, if the specified type is a value type and has a static property of the same type (e.g., Empty, MinValue, etc.).
ImplementInterface( TypeDeclaration, Interface) Implements the interface for the given type.
Implements(ITypeElement, String) Returns true if the specified type implements the specified interface.
Implements(String, String) Returns true if the specified type implements the specified interface.
IncludeDirectiveDeclared(String) Returns true if the ‘include’ directive with the given name is declared.
InheritType(TypeDeclaration, TypeDeclaration) Inherits the specified type for the given type (makes given type a descendant of the specified type).
InMacroCall(LanguageElement) Returns true if the language element is located inside a macro call (C++).
Is(ITypeElement, String) Returns true if the specified type is or descends from the specified ancestor class.
Is(String, String) Returns true if the specified type is or descends from the specified ancestor class.
IsAnonymousType(IElement) Returns true if the given element is an anonymous type or an anonymous type reference.
IsLocal(LanguageElement) Returns true if the specified language element is a local variable.
IsStatement(LanguageElement) Returns true if the given element is a statement and can be executed.
IsStatic(LanguageElement) Returns true if the specified language element is a static method or property.
IsType(LanguageElement) Returns true if the specified language element is a class, struct, or interface.
IsXmlDocNode(LanguageElement) Returns true if the given element is an xml doc node (xml element, xml attribute or xml text).
IterateNodesInRange Iterates through the nodes in the specified range. Parent nodes that overlap the range will be included in the iteration.
IterateVisibleNodesInRange Iterates through the visible nodes in the specified range. Parent nodes that overlap the range will be included in the iteration, however, nodes contained inside collapsed regions will not.
Parse Parses the active text document. Plug-in authors should never need to call this method, as parsing is handled automatically by DXCore. Note that it is hidden from Intellisense.
ParseIfNeeded Parses the active text document if changes have been committed since the last parse of the active file. This is a low-level method that normally should not need to be called by plug-in writers.
ParseIfNeeded(TextDocument) Parses the active text document if changes have been committed since the last parse of the active file. This is a low-level method that normally should not need to be called by plug-in writers.
ParseIfTextChanged Parses the active document if the text has been changed (but not necessarily committed) since the last parse. Plug-in authors can call this method to ensure that the DXCore structural image is in sync with the file.
ParseIfTextChanged(TextDocument) Parses the specified text document if the text has been changed (but not necessarily committed) since the last parse. Plug-in authors can call this method to ensure that the DXCore structural image is in sync with the file.
PromoteToSiblings( LanguageElement, LanguageElement) Converts the first and the second passed in, non-sibling elements, to their closest parents which are siblings. Returns true, if successful, or false if the first element and the second element do not share a common parent. Note that if one of these elements parents the other, then both of these elements will point to the same parent. If the specified elements are already siblings, they will leave this method unchanged. If one element is a detail node and the other is a child node, each will be set to the common parent.
ReferenceDeclared(String) Determines whether the specified namespace reference is declared (e.g., a using reference in C#, or an imports statement in VB).
RegionNodeIsValid( LanguageElement) Returns true, if the specified node is a valid region node. This method is useful for iterating through parent nodes of regions. The topmost region node is used simply as a container for all other regions in the file, and if that node is passed, this method will return false.
ReplacePrototype(Method, String) Replaces the prototype of the given method to the new one.
ResetSourceUpdate Resets the internal source update counter, so parsing can be normally resumed.
StatementCount(LanguageElement) Returns the number of statements inside the given element.
StripNamespace Gets the simple type (as a string) of the specified type element.

Properties:

Active Gets the language element at the editor caret.
ActiveAnonymousExpression Gets the anonymous method expression, containing the editor caret. Returns null if the editor caret is not inside an AnonymousMethodExpression or LambdaExpression element instance.
ActiveClass Gets the class, containing the editor caret. Returns null if the editor caret is not inside a class.
ActiveClassInterfaceOrStruct Gets the class, interface, or struct that contains the editor caret. Returns null if the editor caret is not located inside a class, interface, or struct.
ActiveClassInterfaceStructOrModule Gets the class, interface, struct or module that contains the editor caret. Returns null if the editor caret is not located inside a class, interface, struct or module.
ActiveClassName Gets the name of the active class. Note that if the editor caret is inside a nested class (e.g., a class inside a class), only the name of the innermost class is returned. Returns an empty string, if the editor caret is not inside a class.
ActiveComment Gets the Comment or XMLDocComment instance that contains the editor caret.
ActiveDeclaration Gets the variable, initialized variable, implicit variable or constant declaration that contains the editor caret. Returns null if the editor caret is not contained inside a declaration.
ActiveDefineDirective Gets the DefineDirective instance at the editor caret. Returns null if the editor caret is not contained inside a ‘define’ directive.
ActiveEvent Gets the Event instance containing the editor caret. Returns null if the editor caret is not inside an event.
ActiveEventAccessor Gets the EventAccessor instance containing the editor caret. Returns null if the editor caret is not inside an event add or event remove accessor.
ActiveFileNode Gets the SourceFile instance that represents the active text document.
ActiveFileNodeWithoutParse Gets the SourceFile instance that represents the active text document without parsing it before returning.
ActiveInterface Gets the Interface containing the editor caret. Returns null if the editor caret is not inside an interface.
ActiveMacroInfo Gets the macro info from the editor caret location. Returns null if the editor caret is not contained inside a macro reference.
ActiveMember Gets the active Method, Property, Event, Field, etc., that is immediately parented by a Class, Struct, or Interface.
ActiveMemberName Gets the name of the active member (Method, Property, Event, Field, etc.), that is immediately parented by a Class, Struct, or Interface.
ActiveMethod Gets the Method containing the editor caret. Returns null if the editor caret is not inside a method.
ActiveMethodName Returns the name of the active method. Returns an empty string if the editor caret is not inside a method.
ActiveMethodOrProperty Gets the active method or property at the editor caret. Returns null if the editor caret is not contained inside a method or property.
ActiveMethodOrPropertyAccessor Gets the active method, property get/set accessor or event add/remove block at the editor caret. Returns null if the editor caret is not contained inside a method or property accessor.
ActiveMethodOrPropertyAccessorName Returns the name of the method or property accessor containing the editor caret.
ActiveMethodPropertyOrEvent Gets the active method, property or event at the editor caret. Returns null if the editor caret is not contained inside a method, property or event.
ActiveNamespace Gets the active namespace language element.
ActiveNamespaceName Gets the name of the active namespace. Note that if the editor caret is inside an nested namespace (e.g., a namespace inside a namespace), only the name of the innermost namespace is returned. Returns an empty string if the editor caret is not inside a namespace.
ActiveProject Gets the ProjectElement instance containing the active text document.
ActiveProjectWithoutParse Gets the ProjectElement instance containing the active text document without parsing it before returning.
ActiveProperty Gets the Property containing the editor caret. Returns null if the editor caret is not inside a property.
ActivePropertyAccessor Gets the PropertyAccessor containing the editor caret. Returns null if the editor caret is not inside a property’s get or set accessor.
ActiveRefType Gets the RefType instance (C++) containing the editor caret. Returns null if the editor caret is not inside a reference type.
ActiveRegion Gets the region that contains the editor caret.
ActiveSolution Gets the active Solution instance.
ActiveSourceFile Gets the SourceFile instance that represents the active text document.
ActiveString Gets the TextString instance containing the editor caret. Returns null if the editor caret is not inside a quoted text string.
ActiveStruct Gets the Struct instance containing the editor caret. Returns null if the editor caret is not inside a struct.
ActiveType Gets the class, interface, struct, enum, module, or delegate that contains the editor caret. Returns null if the editor caret is not contained inside a class, interface, struct, enum, module, or delegate.
ActiveTypeName Gets the name of the active class, struct or interface. Note that if the editor caret is inside a nested type (e.g., a type inside a type), only the name of the innermost type is returned. Returns an empty string if the editor caret is outside a type.
ActiveValueType Gets the ValueType instance containing the editor caret. Returns null if the editor caret is not inside a value type.
ActiveXMLDocComment Returns the XMLDocComment instance for the active node (or for the first parent of the active node that an XML documentation comment can be bound to). Note, this method can return XMLDocComment instance that does not contain the editor caret.
Aliases Returns the reference aliases for the current file, or null if the current language does not support using/import aliases.
AllNamespaces Gets an array of all namespaces. Note that it is hidden from Intellisense.
CodeActive Gets the active LanguageElement for the active IAspSourceFile instance.
CompilerDirectiveRootNode Gets the compiler directive root node for the current file, or null, if the current language does not support compiler directives. The root node’s children (accessed through its Nodes property) are the CompilerDirectives for this file. This root node itself, however, is not an actual CompilerDirective for this file (even though its type is CompilerDirective, it does not represent an actual CompilerDirective – it is merely the parent of the CompilerDirectives in this file).
CompilerDirectives Gets the compiler directives for the current file, or null if the current language does not support compiler directives.
FirstSelectedNode Gets the first selected node.
Identifiers Gets an IEnumerable member suitable for use in a ‘foreach’ statement. Identifier iterates through identifiers visible to the current node.
IncludeDirectives Returns the list of the ‘include’ directives from the active source file.
InsideAttribute Returns true, if the editor caret is inside an attribute or attribute section.
InsideClassInterfaceOrStruct Returns true, if the editor caret is inside a class, interface, or struct.
InsideClassInterfaceStructOrModule Returns true, if the editor caret is inside a class, interface, struct or module.
InsideComment Returns true, if the editor caret is inside a comment or xml doc comment. This property reflects the current state as determined by the parse tree, but it may not match recent edits on the current line. If you need to know if immediate recent changes on the line have placed the editor caret inside a comment, use CodeRush.Caret.InsideComment call.
InsideInterface Returns true, if the editor caret is inside an interface, interface class or interface struct.
InsideMethodOrPropertyAccessor Returns true, if the editor caret is inside a method, property get/set accessor, or event add/remove block.
InsideString Returns true, if the editor caret is inside a string. This property reflects the current state as determined by the parse tree, but it may not match recent edits on the current line. If you need to know if immediate recent changes on the line have placed the editor caret inside a string, use CodeRush.Caret.InsideString call.
InsideType Returns true, if the editor caret is inside a class, interface, struct, enum, or delegate.
InsideXMLDocComment Returns true, if caret is inside xml doc comment.
IsAjaxInstalled Returns true, if Ajax is installed.
IsUpdating If true, the source model cache will report that parsing is unnecessary.
LastSelectedNode Gets the last selected node.
MiscFiles Returns the list of opened miscellaneous files that do not belong to the current project.
NamespaceReferences Returns the using/import references for the current file, or null, if the current language does not support using/import references.
RegionRootNode Returns the region root node for the current file, or null, if the current language does not support regions. The root node’s children (accessed through its Nodes property) are the RegionDirectives for this file. This root node itself, however, is not an actual RegionDirectives for this file (even though its type is RegionDirectives, it does not represent an actual RegionDirectives – it is merely the parent of the regions in this file).
Regions Returns the regions list for the current file, or null, if the current language does not support regions.
SelectedExpression Returns the currently selected expression. If there is no expression selected, then this property returns null.
Strings Returns the strings for the current file, or null, if the current language does not support strings.
—–
Products: DXCore
Versions: 10.2 and up
VS IDEs: any
Updated: Apr/07/2011
ID: D073

Similar Posts: