コード例 #1
0
        protected virtual string GenerateFieldDeclaration(CodeDOMGenerator domGenerator, CodeMemberField field)
        {
            StringWriter writer = new StringWriter();

            domGenerator.ConvertContentDefinition(field, writer);
            return(writer.ToString().Trim());
        }
コード例 #2
0
		public virtual void MergeFormChanges(CodeCompileUnit unit)
		{
			Reparse();
			
			// find InitializeComponent method and the class it is declared in
			CodeTypeDeclaration formClass = null;
			CodeMemberMethod initializeComponent = null;
			foreach (CodeNamespace n in unit.Namespaces) {
				foreach (CodeTypeDeclaration typeDecl in n.Types) {
					foreach (CodeTypeMember m in typeDecl.Members) {
						if (m is CodeMemberMethod && m.Name == "InitializeComponent") {
							formClass = typeDecl;
							initializeComponent = (CodeMemberMethod)m;
							break;
						}
					}
				}
			}
			
			if (formClass == null || initializeComponent == null) {
				throw new InvalidOperationException("InitializeComponent method not found in framework-generated CodeDom.");
			}
			if (this.formClass == null) {
				MessageService.ShowMessage("Cannot save form: InitializeComponent method does not exist anymore. You should not modify the Designer.cs file while editing a form.");
				return;
			}
			
			RemoveUnsupportedCode(formClass, initializeComponent);
			
			FixGeneratedCode(this.formClass, initializeComponent);
			
			// generate file and get initialize components string
			StringWriter writer = new StringWriter();
			string indentation = tabs + EditorControlService.GlobalOptions.IndentationString;
			CodeDOMGenerator domGenerator = new CodeDOMGenerator(this.CodeDomProvider, indentation);
			domGenerator.ConvertContentDefinition(initializeComponent, writer);
			
			string statements = writer.ToString();
			
			// initializeComponents.BodyRegion.BeginLine + 1
			DomRegion bodyRegion = GetReplaceRegion(this.ViewContent.DesignerCodeFileDocument, initializeComponents);
			if (bodyRegion.BeginColumn <= 0 || bodyRegion.EndColumn <= 0)
				throw new InvalidOperationException("Column must be > 0");
			int startOffset = this.ViewContent.DesignerCodeFileDocument.PositionToOffset(bodyRegion.BeginLine, bodyRegion.BeginColumn);
			int endOffset   = this.ViewContent.DesignerCodeFileDocument.PositionToOffset(bodyRegion.EndLine, bodyRegion.EndColumn);
			
			this.ViewContent.DesignerCodeFileDocument.Replace(startOffset, endOffset - startOffset, statements);
			
			// apply changes the designer made to field declarations
			// first loop looks for added and changed fields
			foreach (CodeTypeMember m in formClass.Members) {
				if (m is CodeMemberField) {
					CodeMemberField newField = (CodeMemberField)m;
					IField oldField = GetField(completeClass, newField.Name);
					if (oldField == null || FieldChanged(oldField, newField)) {
						AddOrReplaceField(domGenerator, newField);
					}
				}
			}
			
			// second loop looks for removed fields
			List<string> removedFields = new List<string>();
			foreach (IField field in completeClass.Fields) {
				bool found = false;
				foreach (CodeTypeMember m in formClass.Members) {
					if (m is CodeMemberField && m.Name == field.Name) {
						found = true;
						break;
					}
				}
				if (!found) {
					removedFields.Add(field.Name);
				}
			}
			// removing fields is done in two steps because
			// we must not modify the c.Fields collection while it is enumerated
			removedFields.ForEach(RemoveField);
			
			ParserService.BeginParse(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileDocument);
		}
コード例 #3
0
		protected virtual string GenerateFieldDeclaration(CodeDOMGenerator domGenerator, CodeMemberField field)
		{
			StringWriter writer = new StringWriter();
			domGenerator.ConvertContentDefinition(field, writer);
			return writer.ToString().Trim();
		}
コード例 #4
0
        public virtual void MergeFormChanges(CodeCompileUnit unit)
        {
            Reparse();

            // find InitializeComponent method and the class it is declared in
            CodeTypeDeclaration formClass           = null;
            CodeMemberMethod    initializeComponent = null;

            foreach (CodeNamespace n in unit.Namespaces)
            {
                foreach (CodeTypeDeclaration typeDecl in n.Types)
                {
                    foreach (CodeTypeMember m in typeDecl.Members)
                    {
                        if (m is CodeMemberMethod && m.Name == "InitializeComponent")
                        {
                            formClass           = typeDecl;
                            initializeComponent = (CodeMemberMethod)m;
                            break;
                        }
                    }
                }
            }

            if (formClass == null || initializeComponent == null)
            {
                throw new InvalidOperationException("InitializeComponent method not found in framework-generated CodeDom.");
            }
            if (this.formClass == null)
            {
                MessageService.ShowMessage("Cannot save form: InitializeComponent method does not exist anymore. You should not modify the Designer.cs file while editing a form.");
                return;
            }

            FixGeneratedCode(this.formClass, initializeComponent);

            // generate file and get initialize components string
            StringWriter     writer       = new StringWriter();
            CodeDOMGenerator domGenerator = new CodeDOMGenerator(this.CodeDomProvider, tabs + '\t');

            domGenerator.ConvertContentDefinition(initializeComponent, writer);

            string statements = writer.ToString();

            // initializeComponents.BodyRegion.BeginLine + 1
            DomRegion bodyRegion = GetReplaceRegion(this.ViewContent.DesignerCodeFileDocument, initializeComponents);

            if (bodyRegion.BeginColumn <= 0 || bodyRegion.EndColumn <= 0)
            {
                throw new InvalidOperationException("Column must be > 0");
            }
            int startOffset = this.ViewContent.DesignerCodeFileDocument.PositionToOffset(bodyRegion.BeginLine, bodyRegion.BeginColumn);
            int endOffset   = this.ViewContent.DesignerCodeFileDocument.PositionToOffset(bodyRegion.EndLine, bodyRegion.EndColumn);

            this.ViewContent.DesignerCodeFileDocument.Replace(startOffset, endOffset - startOffset, statements);

            // apply changes the designer made to field declarations
            // first loop looks for added and changed fields
            foreach (CodeTypeMember m in formClass.Members)
            {
                if (m is CodeMemberField)
                {
                    CodeMemberField newField = (CodeMemberField)m;
                    IField          oldField = GetField(completeClass, newField.Name);
                    if (oldField == null || FieldChanged(oldField, newField))
                    {
                        AddOrReplaceField(domGenerator, newField);
                    }
                }
            }

            // second loop looks for removed fields
            List <string> removedFields = new List <string>();

            foreach (IField field in completeClass.Fields)
            {
                bool found = false;
                foreach (CodeTypeMember m in formClass.Members)
                {
                    if (m is CodeMemberField && m.Name == field.Name)
                    {
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    removedFields.Add(field.Name);
                }
            }
            // removing fields is done in two steps because
            // we must not modify the c.Fields collection while it is enumerated
            removedFields.ForEach(RemoveField);

            ParserService.BeginParse(this.ViewContent.DesignerCodeFile.FileName, this.ViewContent.DesignerCodeFileDocument);
        }