Exemple #1
0
        public void UpdateSignal(Stetic.Signal oldSignal, Stetic.Signal newSignal)
        {
            if (targetObject == null)
            {
                return;
            }

            if (oldSignal.Handler == newSignal.Handler)
            {
                return;
            }

            IType cls = GetClass();

            if (cls == null)
            {
                return;
            }

            IMethod met = FindSignalHandler(cls, oldSignal);

            if (met == null)
            {
                return;
            }
            CodeRefactorer gen = GetCodeGenerator();

            gen.RenameMember(new NullProgressMonitor(), cls, met, newSignal.Handler, RefactoryScope.File);
        }
Exemple #2
0
        /// Adds a field to the class
        public void BindToField(Stetic.Component obj)
        {
            if (targetObject == null)
            {
                return;
            }

            string name = GetMemberName(obj);
            IType  cls  = GetClass();

            if (FindField(cls, name) != null)
            {
                return;
            }

            Document doc = IdeApp.Workbench.OpenDocument(cls.CompilationUnit.FileName, true);

            IEditableTextFile editor = doc.GetContent <IEditableTextFile> ();

            if (editor != null)
            {
                CodeRefactorer gen = GetCodeGenerator();
                gen.AddMember(cls, GetFieldCode(obj, name));
            }
        }
Exemple #3
0
        public static CodeRefactorer GetCodeGenerator(Project project)
        {
            CodeRefactorer cr = new CodeRefactorer(project.ParentSolution);

            cr.TextFileProvider = MonoDevelop.Ide.TextFileProvider.Instance;
            return(cr);
        }
Exemple #4
0
        void InsertToolboxItemAttributes(WidgetParser parser, CodeRefactorer cref)
        {
            Dictionary <string, IType> tb_items = parser.GetToolboxItems();

            foreach (string clsname in ObjectNames)
            {
                if (tb_items.ContainsKey(clsname))
                {
                    continue;
                }

                IType cls = parser.GetClass(clsname);
                if (cls == null)
                {
                    continue;
                }

                cref.AddAttribute(cls, "System.ComponentModel.ToolboxItem", true);
                XmlElement elem = DocumentElement.SelectSingleNode("object[@type='" + clsname + "']") as XmlElement;
                if (elem != null && elem.HasAttribute("palette-category"))
                {
                    cref.AddAttribute(cls, "System.ComponentModel.Category", elem.GetAttribute("palette-category"));
                }
            }
        }
Exemple #5
0
        CodeRefactorer GetCodeGenerator()
        {
            CodeRefactorer cr = new CodeRefactorer(project.ParentSolution);

            cr.TextFileProvider = textFileProvider;
            return(cr);
        }
Exemple #6
0
        /// Adds a signal handler to the class
        public void BindSignal(Stetic.Signal signal)
        {
            if (targetObject == null)
            {
                return;
            }

            IType cls = GetClass();

            if (cls == null)
            {
                return;
            }

            if (FindSignalHandler(cls, signal) != null)
            {
                return;
            }

            CodeMemberMethod met = new CodeMemberMethod();

            met.Name       = signal.Handler;
            met.Attributes = MemberAttributes.Family;
            met.ReturnType = new CodeTypeReference(signal.SignalDescriptor.HandlerReturnTypeName);

            foreach (Stetic.ParameterDescriptor pinfo in signal.SignalDescriptor.HandlerParameters)
            {
                met.Parameters.Add(new CodeParameterDeclarationExpression(pinfo.TypeName, pinfo.Name));
            }
            CodeRefactorer gen = GetCodeGenerator();

            gen.AddMember(cls, met);
        }
Exemple #7
0
        internal void OnCompleteStatement()
        {
            CodeRefactorer refactorer    = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);
            DomLocation    caretLocation = refactorer.CompleteStatement(ProjectDom, Document.FileName, new DomLocation(Caret.Line, Caret.Column));

            Caret.Line   = caretLocation.Line;
            Caret.Column = caretLocation.Column;
        }
        public static bool SupportsRefactoring(DotNetProject project)
        {
            if (project == null || project.LanguageBinding == null || project.LanguageBinding.GetCodeDomProvider() == null)
            {
                return(false);
            }
            RefactorOperations ops  = RefactorOperations.AddField | RefactorOperations.AddMethod | RefactorOperations.RenameField | RefactorOperations.AddAttribute;
            CodeRefactorer     cref = IdeApp.Workspace.GetCodeRefactorer(project.ParentSolution);

            return(cref.LanguageSupportsOperation(project.LanguageBinding.Language, ops));
        }
Exemple #9
0
        public override void InsertCompletionText(CompletionListWindow window)
        {
            Initialize();
            string text = insertNamespace ? type.Namespace + "." + type.Name : type.Name;

            if (text != GetCurrentWord(window))
            {
                window.CompletionWidget.SetCompletionText(window.CodeCompletionContext, GetCurrentWord(window), text);
            }
            if (generateUsing)
            {
                CodeRefactorer refactorer = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);
                refactorer.AddGlobalNamespaceImport(dom, data.Document.FileName, type.Namespace);
                // add using to compilation unit (this way the using is valid before the parser thread updates)
                ((MonoDevelop.Projects.Dom.CompilationUnit)doc.CompilationUnit).AddAtTop(new DomUsing(new DomRegion(1, 1, int.MaxValue, 1), type.Namespace));
            }
        }
        MemberReferenceCollection GetReferences(RefactoringOptions options, IMember member)
        {
            CodeRefactorer refactorer;

            if (options.TestFileProvider == null)
            {
                refactorer = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);
            }
            else
            {
                refactorer = new CodeRefactorer();
                refactorer.TextFileProvider = options.TestFileProvider;
            }
            IProgressMonitor monitor = IdeApp.Workbench != null?IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor(this.Name, null) : new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor();

            return(refactorer.FindMemberReferences(monitor, member.DeclaringType, member, true));
        }
Exemple #11
0
        MemberReferenceCollection GetReferences(RefactoringOptions options)
        {
            CodeRefactorer   refactorer = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);
            IProgressMonitor monitor    = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor(this.Name, null);

            if (options.SelectedItem is IType)
            {
                IType cls = (IType)options.SelectedItem;
                return(refactorer.FindClassReferences(monitor, cls, RefactoryScope.Solution, true));
            }
            else if (options.SelectedItem is LocalVariable)
            {
                return(refactorer.FindVariableReferences(monitor, (LocalVariable)options.SelectedItem));
            }
            else if (options.SelectedItem is IParameter)
            {
                return(refactorer.FindParameterReferences(monitor, (IParameter)options.SelectedItem, true));
            }
            else if (options.SelectedItem is IMember)
            {
                IMember member = (IMember)options.SelectedItem;
                Dictionary <string, HashSet <DomLocation> > foundLocations = new Dictionary <string, HashSet <DomLocation> > ();
                MemberReferenceCollection result = new MemberReferenceCollection();
                foreach (IMember m in CollectMembers(member.DeclaringType.SourceProjectDom, member))
                {
                    foreach (MemberReference r in refactorer.FindMemberReferences(monitor, m.DeclaringType, m, true))
                    {
                        DomLocation location = new DomLocation(r.Line, r.Column);
                        if (!foundLocations.ContainsKey(r.FileName))
                        {
                            foundLocations[r.FileName] = new HashSet <DomLocation> ();
                        }
                        if (foundLocations[r.FileName].Contains(location))
                        {
                            continue;
                        }
                        foundLocations[r.FileName].Add(location);
                        result.Add(r);
                    }
                }
                return(result);
            }
            return(null);
        }
Exemple #12
0
        public void Update(WidgetParser parser, Stetic.Project stetic, CodeRefactorer refactorer)
        {
            if (AttrSyncState == SyncState.Unspecified)
            {
                if (refactorer != null)
                {
                    InsertToolboxItemAttributes(parser, refactorer);
                    AttrSyncState = SyncState.On;
                }
                return;
            }
            else if (AttrSyncState == SyncState.Off)
            {
                return;
            }

            StringCollection tb_names = new StringCollection();

            foreach (IType cls in parser.GetToolboxItems().Values)
            {
                UpdateClass(parser, stetic, cls, null);
                tb_names.Add(cls.FullName);
            }

            List <XmlElement> toDelete = new List <XmlElement> ();

            foreach (XmlElement elem in SelectNodes("objects/object"))
            {
                string name = elem.GetAttribute("type");
                if (!tb_names.Contains(name))
                {
                    toDelete.Add(elem);
                }
            }

            foreach (XmlElement elem in toDelete)
            {
                elem.ParentNode.RemoveChild(elem);
            }

            Save();
        }
        public override void Run(RefactoringOptions options)
        {
            DocumentLocation location      = options.GetTextEditorData().Caret.Location;
            IType            interfaceType = options.Dom.GetType(options.ResolveResult.ResolvedType);
            IType            declaringType = options.Document.CompilationUnit.GetTypeAt(location.Line + 1, location.Column + 1);

            options.Document.TextEditor.BeginAtomicUndo();
            CodeRefactorer refactorer = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);

            List <KeyValuePair <IMember, IReturnType> > members = new List <KeyValuePair <IMember, IReturnType> > ();

            foreach (IMember member in interfaceType.Members)
            {
                if (member.IsAbstract && !declaringType.Members.Any(m => member.Name == m.Name))
                {
                    members.Add(new KeyValuePair <IMember, IReturnType> (member, null));
                }
            }
            refactorer.ImplementMembers(declaringType, members, "implemented abstract members of " + interfaceType.FullName);

            options.Document.TextEditor.EndAtomicUndo();
        }
Exemple #14
0
        public void UpdateField(Stetic.Component obj, string oldName)
        {
            if (targetObject == null)
            {
                return;
            }

            CodeRefactorer cr = GetCodeGenerator();

            IType cls;

            if (obj == targetObject)
            {
                return;                 // The root widget name can only be changed internally.
            }
            else
            {
                cls = GetClass(false);
            }

            string newName = GetObjectName(obj);

            if (newName.Length == 0)
            {
                return;
            }

            if (cls != null)
            {
                IField f = ClassUtils.FindWidgetField(cls, oldName);
                if (f != null)
                {
                    cr.RenameMember(new NullProgressMonitor(), cls, f, newName, RefactoryScope.File);
                }
            }
        }
        public OverridesImplementsDialog(MonoDevelop.Ide.Gui.Document editor, IType cls)
        {
            this.Build();
            this.editor = editor;
            this.cls    = cls;

            // FIXME: title
            Title = GettextCatalog.GetString("Override and/or implement members");

            store = new TreeStore(typeof(bool), typeof(Gdk.Pixbuf), typeof(string), typeof(bool), typeof(IMember));

            // Column #1
            TreeViewColumn nameCol = new TreeViewColumn();

            nameCol.Title     = GettextCatalog.GetString("Name");
            nameCol.Expand    = true;
            nameCol.Resizable = true;

            CellRendererToggle cbRenderer = new CellRendererToggle();

            cbRenderer.Activatable = true;
            cbRenderer.Toggled    += OnSelectToggled;
            nameCol.PackStart(cbRenderer, false);
            nameCol.AddAttribute(cbRenderer, "active", colCheckedIndex);

            CellRendererPixbuf iconRenderer = new CellRendererPixbuf();

            nameCol.PackStart(iconRenderer, false);
            nameCol.AddAttribute(iconRenderer, "pixbuf", colIconIndex);

            CellRendererText nameRenderer = new CellRendererText();

            nameRenderer.Ellipsize = Pango.EllipsizeMode.End;
            nameCol.PackStart(nameRenderer, true);
            nameCol.AddAttribute(nameRenderer, "text", colNameIndex);

            treeview.AppendColumn(nameCol);

            // Column #2
            CellRendererToggle explicitRenderer = new CellRendererToggle();

            explicitRenderer.Activatable = true;
            explicitRenderer.Xalign      = 0.0f;
            explicitRenderer.Toggled    += OnExplicitToggled;
            TreeViewColumn explicitCol = new TreeViewColumn();

            explicitCol.Title = GettextCatalog.GetString("Explicit");
            explicitCol.PackStart(explicitRenderer, true);
            explicitCol.SetCellDataFunc(explicitRenderer, new TreeCellDataFunc(RenderExplicitCheckbox));
            explicitCol.AddAttribute(explicitRenderer, "active", colExplicitIndex);
            treeview.AppendColumn(explicitCol);

            store.SetSortColumnId(colNameIndex, SortType.Ascending);
            treeview.Model = store;

            buttonCancel.Clicked      += OnCancelClicked;
            buttonOk.Clicked          += OnOKClicked;
            buttonSelectAll.Clicked   += delegate { SelectAll(true); };
            buttonUnselectAll.Clicked += delegate { SelectAll(false); };

            refactorer = IdeApp.Workspace.GetCodeRefactorer(IdeApp.ProjectOperations.CurrentSelectedSolution);
            ambience   = AmbienceService.GetAmbienceForFile(cls.CompilationUnit.FileName);
            PopulateTreeView();
            UpdateOKButton();
        }
Exemple #16
0
        static IType CreateClass(Project project, Stetic.ActionGroupComponent group, string name, string namspace, string folder)
        {
            string fullName = namspace.Length > 0 ? namspace + "." + name : name;

            CodeRefactorer gen = new CodeRefactorer(project.ParentSolution);

            CodeTypeDeclaration type = new CodeTypeDeclaration();

            type.Name    = name;
            type.IsClass = true;
            type.BaseTypes.Add(new CodeTypeReference("Gtk.ActionGroup"));

            // Generate the constructor. It contains the call that builds the widget.

            CodeConstructor ctor = new CodeConstructor();

            ctor.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            ctor.BaseConstructorArgs.Add(new CodePrimitiveExpression(fullName));

            CodeMethodInvokeExpression call = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(
                    new CodeTypeReferenceExpression("Stetic.Gui"),
                    "Build"
                    ),
                new CodeThisReferenceExpression(),
                new CodeTypeOfExpression(fullName)
                );

            ctor.Statements.Add(call);
            type.Members.Add(ctor);

            // Add signal handlers

            foreach (Stetic.ActionComponent action in group.GetActions())
            {
                foreach (Stetic.Signal signal in action.GetSignals())
                {
                    CodeMemberMethod met = new CodeMemberMethod();
                    met.Name       = signal.Handler;
                    met.Attributes = MemberAttributes.Family;
                    met.ReturnType = new CodeTypeReference(signal.SignalDescriptor.HandlerReturnTypeName);

                    foreach (Stetic.ParameterDescriptor pinfo in signal.SignalDescriptor.HandlerParameters)
                    {
                        met.Parameters.Add(new CodeParameterDeclarationExpression(pinfo.TypeName, pinfo.Name));
                    }

                    type.Members.Add(met);
                }
            }

            // Create the class

            IType cls = null;

            cls = gen.CreateClass(project, ((DotNetProject)project).LanguageName, folder, namspace, type);
            if (cls == null)
            {
                throw new UserException("Could not create class " + fullName);
            }

            project.AddFile(cls.CompilationUnit.FileName, BuildAction.Compile);
            IdeApp.ProjectOperations.Save(project);

#if TRUNK
            // Make sure the database is up-to-date
            ProjectDomService.Parse(project, cls.CompilationUnit.FileName);
#else
            ProjectDomService.Parse(project, cls.CompilationUnit.FileName, null);
#endif
            return(cls);
        }
        void CreateClass(string name, string namspace, string folder)
        {
            string fullName = namspace.Length > 0 ? namspace + "." + name : name;

            CodeRefactorer gen            = new CodeRefactorer(fproject.Project.ParentSolution);
            bool           partialSupport = fproject.Project.UsePartialTypes;

            Stetic.WidgetComponent component = (Stetic.WidgetComponent)rootWidget.Component;

            CodeTypeDeclaration type = new CodeTypeDeclaration();

            type.Name      = name;
            type.IsClass   = true;
            type.IsPartial = partialSupport;
            type.BaseTypes.Add(new CodeTypeReference(component.Type.ClassName));

            // Generate the constructor. It contains the call that builds the widget.

            CodeConstructor ctor = new CodeConstructor();

            ctor.Attributes = MemberAttributes.Public | MemberAttributes.Final;

            foreach (object val in component.Type.InitializationValues)
            {
                if (val is Enum)
                {
                    ctor.BaseConstructorArgs.Add(
                        new CodeFieldReferenceExpression(
                            new CodeTypeReferenceExpression(val.GetType()),
                            val.ToString()
                            )
                        );
                }
                else
                {
                    ctor.BaseConstructorArgs.Add(new CodePrimitiveExpression(val));
                }
            }

            if (partialSupport)
            {
                CodeMethodInvokeExpression call = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(
                        new CodeThisReferenceExpression(),
                        "Build"
                        )
                    );
                ctor.Statements.Add(call);
            }
            else
            {
                CodeMethodInvokeExpression call = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(
                        new CodeTypeReferenceExpression("Stetic.Gui"),
                        "Build"
                        ),
                    new CodeThisReferenceExpression(),
                    new CodeTypeOfExpression(fullName)
                    );
                ctor.Statements.Add(call);
            }
            type.Members.Add(ctor);

            // Add signal handlers

            AddSignalsRec(type, component);
            foreach (Stetic.Component ag in component.GetActionGroups())
            {
                AddSignalsRec(type, ag);
            }

            // Create the class
            IType cls = gen.CreateClass(Project.Project, ((DotNetProject)Project.Project).LanguageName, folder, namspace, type);

            if (cls == null)
            {
                throw new UserException("Could not create class " + fullName);
            }

            Project.Project.AddFile(cls.CompilationUnit.FileName, BuildAction.Compile);
            IdeApp.ProjectOperations.Save(Project.Project);

            // Make sure the database is up-to-date
            ProjectDomService.Parse(Project.Project, cls.CompilationUnit.FileName);
        }