Ejemplo n.º 1
0
        public void Convert(string guiFolderName, bool makeBackup)
        {
            GtkDesignInfo info = GtkDesignInfo.FromProject(project);

            Stetic.Project gproject = GuiBuilderService.SteticApp.CreateProject(info);
            //Stetic.Project does not implement IDisposable
            try {
                string newGuiFolderName = project.BaseDirectory.Combine(guiFolderName);
                gproject.ConvertProject(info.SteticFile, newGuiFolderName);
                info.ConvertGtkFolder(guiFolderName, makeBackup);
                info.UpdateGtkFolder();
                folderName = newGuiFolderName;
                IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBuildProgressMonitor();
                try {
                    ConfigurationSelector configuration = IdeApp.Workspace.ActiveConfiguration;
                    Generator             generator     = new Generator();
                    generator.Run(monitor, project, configuration);
                    monitor.ReportSuccess("Converting was succesfull");
                } finally {
                    monitor.Dispose();
                }
            } finally {
                gproject.Dispose();
            }
        }
Ejemplo n.º 2
0
		internal GuiBuilderWindow (GuiBuilderProject fproject, Stetic.Project gproject, Stetic.WidgetInfo rootWidget)
		{
			this.fproject = fproject;
			this.rootWidget = rootWidget;
			this.gproject = gproject;
			name = rootWidget.Name;
			gproject.ProjectReloaded += OnProjectReloaded;
			rootWidget.Changed += OnChanged;
		}
        protected void OnEditIcons()
        {
            Project           project = CurrentNode.GetParentDataItem(typeof(Project), true) as Project;
            GuiBuilderProject gp      = GtkDesignInfo.FromProject(project).GuiBuilderProject;

            Stetic.Project sp = gp.SteticProject;
            sp.EditIcons();
            gp.SaveProject(true);
        }
Ejemplo n.º 4
0
 internal GuiBuilderWindow(GuiBuilderProject fproject, Stetic.Project gproject, Stetic.WidgetInfo rootWidget)
 {
     this.fproject             = fproject;
     this.rootWidget           = rootWidget;
     this.gproject             = gproject;
     name                      = rootWidget.Name;
     gproject.ProjectReloaded += OnProjectReloaded;
     rootWidget.Changed       += OnChanged;
 }
Ejemplo n.º 5
0
        void Load()
        {
            if (gproject != null || disposed || fileName == null)
            {
                return;
            }

            gproject  = GuiBuilderService.SteticApp.CreateProject();
            formInfos = new List <GuiBuilderWindow> ();

            if (!System.IO.File.Exists(fileName))
            {
                // Regenerate the gtk-gui folder if the stetic project
                // doesn't exist.
                GtkDesignInfo.FromProject(project).UpdateGtkFolder();
            }

            try
            {
                gproject.Load(fileName);
            }
            catch (Exception ex)
            {
                MessageService.ShowException(ex, GettextCatalog.GetString("The GUI designer project file '{0}' could not be loaded.", fileName));
                hasError = true;
            }

            Counters.SteticProjectsLoaded++;
            gproject.ResourceProvider            = GtkDesignInfo.FromProject(project).ResourceProvider;
            gproject.WidgetAdded                += OnAddWidget;
            gproject.WidgetRemoved              += OnRemoveWidget;
            gproject.ActionGroupsChanged        += OnGroupsChanged;
            project.FileAddedToProject          += OnFileAdded;
            project.FileRemovedFromProject      += OnFileRemoved;
            project.ReferenceAddedToProject     += OnReferenceAdded;
            project.ReferenceRemovedFromProject += OnReferenceRemoved;

            foreach (Stetic.WidgetInfo ob in gproject.Widgets)
            {
                RegisterWindow(ob, false);
            }

            // Monitor changes in the file
            lastSaveTime = System.IO.File.GetLastWriteTime(fileName);
            watcher      = new FileSystemWatcher();
            if (System.IO.File.Exists(fileName))
            {
                watcher.Path                = Path.GetDirectoryName(fileName);
                watcher.Filter              = Path.GetFileName(fileName);
                watcher.Changed            += (FileSystemEventHandler)DispatchService.GuiDispatch(new FileSystemEventHandler(OnSteticFileChanged));
                watcher.EnableRaisingEvents = true;
            }
        }
        public override void ActivateItem()
        {
            StockIconsNode    node = (StockIconsNode)CurrentNode.DataItem;
            GtkDesignInfo     info = GtkDesignInfo.FromProject(node.Project);
            GuiBuilderProject gp   = info.GuiBuilderProject;

            Stetic.Project sp = gp.SteticProject;
            sp.ImagesRootPath     = FileService.AbsoluteToRelativePath(info.GtkGuiFolder, gp.Project.BaseDirectory);
            sp.ImportFileCallback = delegate(string file) {
                return(GuiBuilderService.ImportFile(gp.Project, file));
            };
            sp.EditIcons();
            gp.Save(true);
        }
Ejemplo n.º 7
0
        string GetBaseType(WidgetParser parser, ITypeDefinition widgetClass, Stetic.Project stetic)
        {
            string[]  types     = stetic.GetWidgetTypes();
            Hashtable typesHash = new Hashtable();

            foreach (string t in types)
            {
                typesHash [t] = t;
            }

            string ret = parser.GetBaseType(widgetClass, typesHash);

            return(ret ?? "Gtk.Widget");
        }
Ejemplo n.º 8
0
        void Unload()
        {
            if (gproject == null)
            {
                return;
            }

            Counters.SteticProjectsLoaded--;

            if (Unloaded != null)
            {
                Unloaded(this, EventArgs.Empty);
            }
            if (formInfos != null)
            {
                foreach (GuiBuilderWindow win in formInfos)
                {
                    win.Dispose();
                }
                formInfos = null;
            }
            if (gproject != null)
            {
                gproject.WidgetAdded         -= OnAddWidget;
                gproject.WidgetRemoved       -= OnRemoveWidget;
                gproject.ActionGroupsChanged -= OnGroupsChanged;
                gproject.Dispose();
                gproject = null;
            }
            if (project != null)
            {
                project.FileAddedToProject          -= OnFileAdded;
                project.FileRemovedFromProject      -= OnFileRemoved;
                project.ReferenceAddedToProject     -= OnReferenceAdded;
                project.ReferenceRemovedFromProject -= OnReferenceRemoved;
            }
            needsUpdate      = true;
            hasError         = false;
            librariesUpdated = false;
            if (watcher != null)
            {
                watcher.Dispose();
                watcher = null;
            }
            NotifyChanged();
        }
Ejemplo n.º 9
0
        public DesignerView(Stetic.Project project, ProjectItemInfo item)
        {
            this.widget = (WidgetInfo)item;

            // Widget design tab

            design = project.CreateWidgetDesigner(widget, true);

            // Actions design tab

            actionbox = design.CreateActionGroupDesigner();

            // Designers tab

            AppendPage(design, new Gtk.Label(Catalog.GetString("Designer")));
            AppendPage(actionbox, new Gtk.Label(Catalog.GetString("Actions")));
            TabPos = Gtk.PositionType.Bottom;
        }
Ejemplo n.º 10
0
		void Load ()
		{
			if (gproject != null || disposed || fileName == null)
				return;
			
			gproject = GuiBuilderService.SteticApp.CreateProject ();
			formInfos = new List<GuiBuilderWindow> ();
			
			if (!System.IO.File.Exists (fileName)) {
				// Regenerate the gtk-gui folder if the stetic project
				// doesn't exist.
				GtkDesignInfo.FromProject (project).UpdateGtkFolder ();
			}

			try {
				gproject.Load (fileName);
			} catch (Exception ex) {
				MessageService.ShowException (ex, GettextCatalog.GetString ("The GUI designer project file '{0}' could not be loaded.", fileName));
				hasError = true;
			}

			Counters.SteticProjectsLoaded++;
			gproject.ResourceProvider = GtkDesignInfo.FromProject (project).ResourceProvider;
			gproject.WidgetAdded += OnAddWidget;
			gproject.WidgetRemoved += OnRemoveWidget;
			gproject.ActionGroupsChanged += OnGroupsChanged;
			project.FileAddedToProject += OnFileAdded;
			project.FileRemovedFromProject += OnFileRemoved;
			project.ReferenceAddedToProject += OnReferenceAdded;
			project.ReferenceRemovedFromProject += OnReferenceRemoved;
			
			foreach (Stetic.WidgetInfo ob in gproject.Widgets)
				RegisterWindow (ob, false);
				
			// Monitor changes in the file
			lastSaveTime = System.IO.File.GetLastWriteTime (fileName);
			watcher = new FileSystemWatcher ();
			if (System.IO.File.Exists (fileName)) {
				watcher.Path = Path.GetDirectoryName (fileName);
				watcher.Filter = Path.GetFileName (fileName);
				watcher.Changed += (FileSystemEventHandler) DispatchService.GuiDispatch (new FileSystemEventHandler (OnSteticFileChanged));
				watcher.EnableRaisingEvents = true;
			}
		}	
Ejemplo n.º 11
0
        public Stetic.CodeGenerationResult GenerateCode(ArrayList projectFolders, bool useGettext, string gettextClass, bool usePartialClasses, GtkDesignInfo info)
        {
            Gtk.Application.Init();

            Stetic.Application app = Stetic.ApplicationFactory.CreateApplication(Stetic.IsolationMode.None);

            Stetic.Project[] projects = new Stetic.Project [projectFolders.Count];
            for (int n = 0; n < projectFolders.Count; n++)
            {
                projects [n] = app.CreateProject(info);
                projects [n].Load((string)projectFolders [n]);
            }

            Stetic.GenerationOptions options = new Stetic.GenerationOptions();
            options.UseGettext   = useGettext;
            options.GettextClass = gettextClass;

            return(app.GenerateProjectCode(options, projects));
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 13
0
        public Stetic.CodeGenerationResult GenerateCode(ArrayList projectFiles, bool useGettext, string gettextClass, string resourceLoaderClass, bool usePartialClasses)
        {
            Gtk.Application.Init();

            Stetic.Application app = Stetic.ApplicationFactory.CreateApplication(Stetic.IsolationMode.None);

            Stetic.Project[] projects = new Stetic.Project [projectFiles.Count];
            for (int n = 0; n < projectFiles.Count; n++)
            {
                projects [n] = app.CreateProject();
                projects [n].Load((string)projectFiles [n]);
            }

            Stetic.GenerationOptions options = new Stetic.GenerationOptions();
            options.UseGettext               = useGettext;
            options.GettextClass             = gettextClass;
            options.ImageResourceLoaderClass = resourceLoaderClass;
            options.UsePartialClasses        = usePartialClasses;
            options.GenerateSingleFile       = false;

            return(app.GenerateProjectCode(options, projects));
        }
Ejemplo n.º 14
0
        void UpdateClass(WidgetParser parser, Stetic.Project stetic, ITypeDefinition widgetClass, ITypeDefinition wrapperClass)
        {
            string     typeName     = widgetClass.FullName;
            string     basetypeName = GetBaseType(parser, widgetClass, stetic);
            XmlElement objectElem   = (XmlElement)SelectSingleNode("objects/object[@type='" + typeName + "']");

            if (objectElem == null)
            {
                // The widget class is not yet in the XML file. Create an element for it.
                objectElem = CreateElement("object");
                objectElem.SetAttribute("type", typeName);
                string category = parser.GetCategory(widgetClass);
                if (category == String.Empty)
                {
                    objectElem.SetAttribute("palette-category", "General");
                }
                else
                {
                    objectElem.SetAttribute("palette-category", category);
                }
                objectElem.SetAttribute("allow-children", "false");
                if (wrapperClass != null)
                {
                    objectElem.SetAttribute("wrapper", wrapperClass.FullName);
                }

                // By default add a reference to Gtk.Widget properties and events
                XmlElement itemGroups = objectElem.OwnerDocument.CreateElement("itemgroups");
                objectElem.AppendChild(itemGroups);

                itemGroups = objectElem.OwnerDocument.CreateElement("signals");
                objectElem.AppendChild(itemGroups);

                objectElem.SetAttribute("base-type", basetypeName);
                DocumentElement.AppendChild(objectElem);
            }

            UpdateObject(parser, basetypeName, objectElem, widgetClass, wrapperClass);
        }
Ejemplo n.º 15
0
        void Load()
        {
            if (gproject != null || disposed || folderName == null)
            {
                return;
            }

            GtkDesignInfo info = GtkDesignInfo.FromProject(project);

            gproject  = GuiBuilderService.SteticApp.CreateProject(info);
            formInfos = new List <GuiBuilderWindow> ();

//			TODO : when expanding project, UpdateGtkFolder causes in throwing exception by gtk
//			info.UpdateGtkFolder ();

            try {
                gproject.Load(folderName);
            } catch (Exception ex) {
                MessageService.ShowException(ex, GettextCatalog.GetString("The GUI designer project folder '{0}' could not be loaded.", folderName));
                hasError = true;
            }

            Counters.SteticProjectsLoaded++;
            gproject.ResourceProvider = GtkDesignInfo.FromProject(project).ResourceProvider;
//			gproject.DesignInfo = info;
            gproject.WidgetAdded                += OnAddWidget;
            gproject.WidgetRemoved              += OnRemoveWidget;
            gproject.ActionGroupsChanged        += OnGroupsChanged;
            project.FileAddedToProject          += OnFileAdded;
            project.FileRemovedFromProject      += OnFileRemoved;
            project.ReferenceAddedToProject     += OnReferenceAdded;
            project.ReferenceRemovedFromProject += OnReferenceRemoved;

            foreach (Stetic.WidgetInfo ob in gproject.Widgets)
            {
                RegisterWindow(ob, false);
            }
        }
        public override bool AddToProject(SolutionItem policyParent, Project project, string language, string directory, string name)
        {
            if (!GtkDesignInfo.SupportsDesigner(project))
            {
                ReferenceManager mgr = new ReferenceManager(project as DotNetProject);
                mgr.GtkPackageVersion = mgr.DefaultGtkVersion;
                mgr.Dispose();
            }

            GtkDesignInfo info = GtkDesignInfo.FromProject((DotNetProject)project);

            GuiBuilderProject gproject = info.GuiBuilderProject;

            string fileName = fileTemplate.GetFileName(policyParent, project, language, directory, name);

            fileTemplate.AddToProject(policyParent, project, language, directory, name);

#if TRUNK
            ProjectDomService.Parse(project, fileName);
#else
            ProjectDomService.Parse(project, fileName, null);
#endif

            DotNetProject netProject = project as DotNetProject;
            string        ns         = netProject != null?netProject.GetDefaultNamespace(fileName) : "";

            string cname    = Path.GetFileNameWithoutExtension(fileName);
            string fullName = ns.Length > 0 ? ns + "." + cname : cname;
            string[,] tags =
            {
                { "Name",      cname    },
                { "Namespace", ns       },
                { "FullName",  fullName }
            };

            XmlElement widgetElem = steticTemplate ["widget"];
            if (widgetElem != null)
            {
                string content = widgetElem.OuterXml;
                content = StringParserService.Parse(content, tags);

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(content);

                gproject.AddNewComponent(doc.DocumentElement);
                gproject.Save(false);
                gproject.GenerateCode(fileName);
                IdeApp.ProjectOperations.Save(project);
                return(true);
            }

            widgetElem = steticTemplate ["action-group"];
            if (widgetElem != null)
            {
                string content = widgetElem.OuterXml;
                content = StringParserService.Parse(content, tags);

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(content);

                Stetic.Project sproject = gproject.SteticProject;
                sproject.AddNewActionGroup(doc.DocumentElement);
                gproject.Save(false);
                gproject.GenerateCode(fileName);
                IdeApp.ProjectOperations.Save(project);
                return(true);
            }

            throw new InvalidOperationException("<widget> or <action-group> element not found in widget template.");
        }
Ejemplo n.º 17
0
        static int RunApp(string[] args, int n)
        {
            Project = SteticApp.CreateProject();

            Project.WidgetAdded     += OnWidgetAdded;
            Project.WidgetRemoved   += OnWidgetRemoved;
            Project.ModifiedChanged += OnProjectModified;
            Project.ProjectReloaded += OnProjectReloaded;

            Palette      = SteticApp.PaletteWidget;
            widgetTree   = SteticApp.WidgetTreeWidget;
            Signals      = SteticApp.SignalsWidget;
            propertyTree = SteticApp.PropertiesWidget;
            ProjectView  = new WindowListWidget();

            UIManager = new Stetic.UIManager(Project);

            Glade.XML.CustomHandler = CustomWidgetHandler;
            Glade.XML glade = new Glade.XML("stetic.glade", "MainWindow");
            glade.Autoconnect(typeof(SteticMain));

            if (ProjectView.Parent is Gtk.Viewport &&
                ProjectView.Parent.Parent is Gtk.ScrolledWindow)
            {
                Gtk.Viewport       viewport = (Gtk.Viewport)ProjectView.Parent;
                Gtk.ScrolledWindow scrolled = (Gtk.ScrolledWindow)viewport.Parent;
                viewport.Remove(ProjectView);
                scrolled.Remove(viewport);
                scrolled.AddWithViewport(ProjectView);
            }

            foreach (Gtk.Widget w in glade.GetWidgetPrefix(""))
            {
                Gtk.Window win = w as Gtk.Window;
                if (win != null)
                {
                    win.AddAccelGroup(UIManager.AccelGroup);
                    win.ShowAll();
                }
            }
            MainWindow                      = (Gtk.Window)Palette.Toplevel;
            WidgetNotebook                  = (Gtk.Notebook)glade ["notebook"];
            WidgetNotebook.SwitchPage      += OnPageChanged;
            ProjectView.ComponentActivated += OnWidgetActivated;
            widgetTree.SelectionChanged    += OnSelectionChanged;

#if GTK_SHARP_2_6
            // This is needed for both our own About dialog and for ones
            // the user constructs
            Gtk.AboutDialog.SetUrlHook(ActivateUrl);
#endif

            if (n < args.Length)
            {
                LoadProject(args [n]);
            }

            ReadConfiguration();

            foreach (string s in Configuration.WidgetLibraries)
            {
                SteticApp.AddWidgetLibrary(s);
            }
            SteticApp.UpdateWidgetLibraries(false);

            ProjectView.Fill(Project);

            Program.Run();
            return(0);
        }
Ejemplo n.º 18
0
		void Load ()
		{
			if (gproject != null || disposed || folderName == null)
				return;
			
			GtkDesignInfo info = GtkDesignInfo.FromProject (project); 
			gproject = GuiBuilderService.SteticApp.CreateProject (info);
			formInfos = new List<GuiBuilderWindow> ();
			
//			TODO : when expanding project, UpdateGtkFolder causes in throwing exception by gtk
//			info.UpdateGtkFolder ();

			try {
				gproject.Load (folderName);
			} catch (Exception ex) {
				MessageService.ShowException (ex, GettextCatalog.GetString ("The GUI designer project folder '{0}' could not be loaded.", folderName));
				hasError = true;
			}

			Counters.SteticProjectsLoaded++;
			gproject.ResourceProvider = GtkDesignInfo.FromProject (project).ResourceProvider;
//			gproject.DesignInfo = info;
			gproject.WidgetAdded += OnAddWidget;
			gproject.WidgetRemoved += OnRemoveWidget;
			gproject.ActionGroupsChanged += OnGroupsChanged;
			project.FileAddedToProject += OnFileAdded;
			project.FileRemovedFromProject += OnFileRemoved;
			project.ReferenceAddedToProject += OnReferenceAdded;
			project.ReferenceRemovedFromProject += OnReferenceRemoved;
			
			foreach (Stetic.WidgetInfo ob in gproject.Widgets)
				RegisterWindow (ob, false);
		}	
Ejemplo n.º 19
0
        static int RunApp(string[] args, int n)
        {
            Project = SteticApp.CreateProject ();

            Project.WidgetAdded += OnWidgetAdded;
            Project.WidgetRemoved += OnWidgetRemoved;
            Project.ModifiedChanged += OnProjectModified;
            Project.ProjectReloaded += OnProjectReloaded;

            Palette = SteticApp.PaletteWidget;
            widgetTree = SteticApp.WidgetTreeWidget;
            Signals = SteticApp.SignalsWidget;
            propertyTree = SteticApp.PropertiesWidget;
            ProjectView = new WindowListWidget ();

            UIManager = new Stetic.UIManager (Project);

            Glade.XML.CustomHandler = CustomWidgetHandler;
            Glade.XML glade = new Glade.XML ("stetic.glade", "MainWindow");
            glade.Autoconnect (typeof (SteticMain));

            if (ProjectView.Parent is Gtk.Viewport &&
                ProjectView.Parent.Parent is Gtk.ScrolledWindow) {
                Gtk.Viewport viewport = (Gtk.Viewport)ProjectView.Parent;
                Gtk.ScrolledWindow scrolled = (Gtk.ScrolledWindow)viewport.Parent;
                viewport.Remove (ProjectView);
                scrolled.Remove (viewport);
                scrolled.AddWithViewport (ProjectView);
            }

            foreach (Gtk.Widget w in glade.GetWidgetPrefix ("")) {
                Gtk.Window win = w as Gtk.Window;
                if (win != null) {
                    win.AddAccelGroup (UIManager.AccelGroup);
                    win.ShowAll ();
                }
            }
            MainWindow = (Gtk.Window)Palette.Toplevel;
            WidgetNotebook = (Gtk.Notebook) glade ["notebook"];
            WidgetNotebook.SwitchPage += OnPageChanged;
            ProjectView.ComponentActivated += OnWidgetActivated;
            widgetTree.SelectionChanged += OnSelectionChanged;

            #if GTK_SHARP_2_6
            // This is needed for both our own About dialog and for ones
            // the user constructs
            Gtk.AboutDialog.SetUrlHook (ActivateUrl);
            #endif

            if (n < args.Length) {
                LoadProject (args [n]);
            }

            ReadConfiguration ();

            foreach (string s in Configuration.WidgetLibraries) {
                SteticApp.AddWidgetLibrary (s);
            }
            SteticApp.UpdateWidgetLibraries (false);

            ProjectView.Fill (Project);

            Program.Run ();
            return 0;
        }
Ejemplo n.º 20
0
		public Stetic.CodeGenerationResult GenerateCode (ArrayList projectFiles, bool useGettext, string gettextClass, bool usePartialClasses)
		{
			Gtk.Application.Init ();
			
			Stetic.Application app = Stetic.ApplicationFactory.CreateApplication (Stetic.IsolationMode.None);
			
			Stetic.Project[] projects = new Stetic.Project [projectFiles.Count];
			for (int n=0; n < projectFiles.Count; n++) {
				projects [n] = app.CreateProject ();
				projects [n].Load ((string) projectFiles [n]);
			}
			
			Stetic.GenerationOptions options = new Stetic.GenerationOptions ();
			options.UseGettext = useGettext;
			options.GettextClass = gettextClass;
			options.UsePartialClasses = usePartialClasses;
			options.GenerateSingleFile = false;
			
			return app.GenerateProjectCode (options, projects);
		}
Ejemplo n.º 21
0
		void Unload ()
		{
			if (gproject == null)
				return;

			Counters.SteticProjectsLoaded--;
			
			if (Unloaded != null)
				Unloaded (this, EventArgs.Empty);
			if (formInfos != null) {
				foreach (GuiBuilderWindow win in formInfos)
					win.Dispose ();
				formInfos = null;
			}
			if (gproject != null) {
				gproject.WidgetAdded -= OnAddWidget;
				gproject.WidgetRemoved -= OnRemoveWidget;
				gproject.ActionGroupsChanged -= OnGroupsChanged;
				gproject.Dispose ();
				gproject = null;
			}
			if (project != null) {
				project.FileAddedToProject -= OnFileAdded;
				project.FileRemovedFromProject -= OnFileRemoved;
				project.ReferenceAddedToProject -= OnReferenceAdded;
				project.ReferenceRemovedFromProject -= OnReferenceRemoved;
			}
			needsUpdate = true;
			hasError = false;
			librariesUpdated = false;
			if (watcher != null) {
				watcher.Dispose ();
				watcher = null;
			}
			NotifyChanged ();
		}