34
34
namespace MonoDevelop.Projects
37
public class ProjectFileCollection : Collection<ProjectFile> {
37
public class ProjectFileCollection : ProjectItemCollection<ProjectFile> {
40
List<ProjectFile> unresolvedDeps;
42
39
public ProjectFileCollection ()
46
public ProjectFileCollection (Project project)
48
this.project = project;
49
DependencyResolutionEnabled = true;
52
43
public ProjectFile GetFile (string fileName)
54
45
if (fileName == null) return null;
73
64
return list.ToArray ();
76
protected override void InsertItem (int index, ProjectFile value)
78
base.InsertItem (index, value);
79
if (project != null) {
80
if (value.Project != null)
81
throw new InvalidOperationException ("ProjectFile already belongs to a project");
82
value.SetProject (project);
83
ResolveDependencies (value);
84
project.NotifyFileAddedToProject (value);
88
internal void ResolveDependencies (ProjectFile file)
90
if (!DependencyResolutionEnabled)
93
if (!file.ResolveParent ())
94
unresolvedDeps.Add (file);
96
List<ProjectFile> resolved = null;
97
foreach (ProjectFile unres in unresolvedDeps) {
98
if (string.IsNullOrEmpty (unres.DependsOn )) {
101
if (unres.ResolveParent ()) {
102
if (resolved == null)
103
resolved = new List<ProjectFile> ();
104
resolved.Add (unres);
107
if (resolved != null)
108
foreach (ProjectFile pf in resolved)
109
unresolvedDeps.Remove (pf);
112
bool DependencyResolutionEnabled {
115
if (unresolvedDeps != null)
118
unresolvedDeps = new List<ProjectFile> ();
119
foreach (ProjectFile file in this)
120
ResolveDependencies (file);
122
unresolvedDeps = null;
125
get { return unresolvedDeps != null; }
128
public void AddRange (IEnumerable<ProjectFile> files)
130
foreach (ProjectFile pf in files)
134
protected override void RemoveItem (int index)
136
ProjectFile file = this [index];
137
base.RemoveItem (index);
138
if (project != null) {
139
file.SetProject (null);
140
project.NotifyFileRemovedFromProject (file);
143
if (DependencyResolutionEnabled) {
144
if (unresolvedDeps.Contains (file))
145
unresolvedDeps.Remove (file);
146
foreach (ProjectFile f in file.DependentChildren) {
147
f.DependsOnFile = null;
148
if (!string.IsNullOrEmpty (f.DependsOn))
149
unresolvedDeps.Add (f);
151
file.DependsOnFile = null;
155
67
public void Remove (string fileName)
157
69
fileName = FileService.GetFullPath (fileName);