/// <summary>
        /// Called to check if ContextAction is available.
        /// ReadLock is taken
        /// Will not be called if <c>PsiManager</c>, ProjectFile of Solution == null
        /// </summary>
        /// <param name="element">
        /// The element.
        /// </param>
        /// <returns>
        /// The is available.
        /// </returns>
        protected override bool IsAvailable(IElement element)
        {
            this.name = null;

              var localVariableDeclaration = this.Provider.GetSelectedElement<ILocalVariableDeclaration>(true, true);
              var assignmentExpression = this.Provider.GetSelectedElement<IAssignmentExpression>(true, true);

              if (assignmentExpression == null && localVariableDeclaration == null)
              {
            return false;
              }

              global::JetBrains.Util.TextRange range;
              IType declaredType;

              if (assignmentExpression != null)
              {
            var destination = assignmentExpression.Dest;
            if (destination == null)
            {
              return false;
            }

            if (!destination.IsClassifiedAsVariable)
            {
              return false;
            }

            declaredType = destination.GetExpressionType() as IDeclaredType;

            var referenceExpression = destination as IReferenceExpression;
            if (referenceExpression == null)
            {
              return false;
            }

            var reference = referenceExpression.Reference;
            var source = assignmentExpression.Source;
            if (source == null)
            {
              return false;
            }

            this.name = reference.GetName();

            range = new global::JetBrains.Util.TextRange(destination.GetTreeStartOffset().Offset, source.GetTreeStartOffset().Offset);
              }
              else
              {
            var localVariable = localVariableDeclaration.DeclaredElement as ILocalVariable;
            if (localVariable == null)
            {
              return false;
            }

            declaredType = localVariable.Type;

            var declNode = localVariableDeclaration.ToTreeNode();
            if (declNode.AssignmentSign == null)
            {
              return false;
            }

            this.name = localVariable.ShortName;

            IIdentifierNode identifier = declNode.NameIdentifier;
            if (identifier == null)
            {
              return false;
            }

            var initial = localVariableDeclaration.Initial;
            if (initial == null)
            {
              return false;
            }

            range = new global::JetBrains.Util.TextRange(identifier.GetTreeStartOffset().Offset, initial.GetTreeStartOffset().Offset);
              }

              if (declaredType == null)
              {
            return false;
              }

              if (!declaredType.IsReferenceType())
              {
            return false;
              }

              return range.IsValid() && range.Contains(this.Provider.CaretOffset.Offset);
        }
        /// <summary>
        /// Gets the name of the template.
        /// </summary>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <returns>
        /// The items.
        /// </returns>
        IEnumerable<LiveTemplateItem> ILiveTemplate.GetItems(SmartGenerateParameters parameters)
        {
            var element = parameters.Element;

              var result = new List<LiveTemplateItem>();

              var hasString = false;
              var hasInt = false;
              var hasBool = false;

              var expression = element.GetContainingElement(typeof(IExpression), false) as IExpression;
              while (expression != null)
              {
            var type = expression.Type();

            var typeName = type.GetPresentableName(element.Language);

            var treeTextRange = expression.GetTreeTextRange();
            var textRange = new global::JetBrains.Util.TextRange(treeTextRange.StartOffset.Offset, treeTextRange.EndOffset.Offset);

            if (typeName == "string" && !hasString)
            {
              result.Add(new LiveTemplateItem
              {
            MenuText = "Surround string expression",
            Description = "Surround string expression",
            Shortcut = "Surround string expression",
            Range = textRange
              });

              hasString = true;
            }

            if (typeName == "int" && !hasInt)
            {
              result.Add(new LiveTemplateItem
              {
            MenuText = "Surround integer expression",
            Description = "Surround integer expression",
            Shortcut = "Surround integer expression",
            Range = textRange
              });

              hasInt = true;
            }

            if (typeName == "bool" && !hasBool)
            {
              result.Add(new LiveTemplateItem
              {
            MenuText = "Surround boolean expression",
            Description = "Surround boolean expression",
            Shortcut = "Surround boolean expression",
            Range = textRange
              });

              hasBool = true;
            }

            expression = expression.GetContainingElement(typeof(IExpression), false) as IExpression;
              }

              return result;
        }