2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com
.intellij
.openapi
.roots
.ui
.configuration
.projectRoot
;
19 import com
.intellij
.openapi
.project
.Project
;
20 import com
.intellij
.openapi
.roots
.impl
.libraries
.LibraryImpl
;
21 import com
.intellij
.openapi
.roots
.libraries
.Library
;
22 import com
.intellij
.openapi
.roots
.libraries
.LibraryTable
;
23 import com
.intellij
.openapi
.roots
.ui
.configuration
.ProjectStructureConfigurable
;
24 import com
.intellij
.openapi
.roots
.ui
.configuration
.libraryEditor
.LibraryEditor
;
25 import com
.intellij
.openapi
.util
.Disposer
;
26 import org
.jetbrains
.annotations
.NotNull
;
35 public class LibrariesModifiableModel
implements LibraryTable
.ModifiableModel
{
36 private final Map
<Library
, LibraryEditor
> myLibrary2EditorMap
= new HashMap
<Library
, LibraryEditor
>();
37 private final Set
<Library
> myRemovedLibraries
= new HashSet
<Library
>();
39 private LibraryTable
.ModifiableModel myLibrariesModifiableModel
;
40 private final Project myProject
;
41 private LibraryTable myTable
;
43 public LibrariesModifiableModel(final LibraryTable table
, final Project project
) {
48 public Library
createLibrary(String name
) {
49 final Library library
= getLibrariesModifiableModel().createLibrary(name
);
50 //createLibraryEditor(library);
51 final BaseLibrariesConfigurable configurable
= ProjectStructureConfigurable
.getInstance(myProject
).getConfigurableFor(library
);
52 configurable
.createLibraryNode(library
);
56 public void removeLibrary(@NotNull Library library
) {
57 if (getLibrariesModifiableModel().getLibraryByName(library
.getName()) == null) return;
59 removeLibraryEditor(library
);
60 final Library existingLibrary
= myTable
.getLibraryByName(library
.getName());
61 getLibrariesModifiableModel().removeLibrary(library
);
62 if (existingLibrary
== library
) {
63 myRemovedLibraries
.add(library
);
65 // dispose uncommitted library
66 Disposer
.dispose(library
);
70 public void commit() {
71 //do nothing - do deffered commit
75 public Iterator
<Library
> getLibraryIterator() {
76 return getLibrariesModifiableModel().getLibraryIterator();
79 public Library
getLibraryByName(@NotNull String name
) {
80 return getLibrariesModifiableModel().getLibraryByName(name
);
84 public Library
[] getLibraries() {
85 return getLibrariesModifiableModel().getLibraries();
88 public boolean isChanged() {
89 for (LibraryEditor libraryEditor
: myLibrary2EditorMap
.values()) {
90 if (libraryEditor
.hasChanges()) return true;
92 return getLibrariesModifiableModel().isChanged();
95 public void deferredCommit(){
96 for (LibraryEditor libraryEditor
: new ArrayList
<LibraryEditor
>(myLibrary2EditorMap
.values())) {
97 libraryEditor
.commit(); // TODO: is seems like commit will recreate the editor, but it should not
98 Disposer
.dispose(libraryEditor
);
100 if (!(myLibrary2EditorMap
.isEmpty() && myRemovedLibraries
.isEmpty())) {
101 getLibrariesModifiableModel().commit();
102 myLibrariesModifiableModel
= null;
104 myLibrary2EditorMap
.clear();
105 myRemovedLibraries
.clear();
108 public boolean wasLibraryRemoved(Library library
){
109 return myRemovedLibraries
.contains(library
);
112 public boolean hasLibraryEditor(Library library
){
113 return myLibrary2EditorMap
.containsKey(library
);
116 public LibraryEditor
getLibraryEditor(Library library
){
117 final Library source
= ((LibraryImpl
)library
).getSource();
118 if (source
!= null) {
119 return getLibraryEditor(source
);
121 LibraryEditor libraryEditor
= myLibrary2EditorMap
.get(library
);
122 if (libraryEditor
== null){
123 libraryEditor
= createLibraryEditor(library
);
125 return libraryEditor
;
128 private LibraryEditor
createLibraryEditor(final Library library
) {
129 final LibraryEditor libraryEditor
= new LibraryEditor(library
);
130 myLibrary2EditorMap
.put(library
, libraryEditor
);
131 return libraryEditor
;
134 private void removeLibraryEditor(final Library library
) {
135 final LibraryEditor libraryEditor
= myLibrary2EditorMap
.remove(library
);
136 if (libraryEditor
!= null) {
137 Disposer
.dispose(libraryEditor
);
141 public Library
.ModifiableModel
getLibraryModifiableModel(final Library library
) {
142 return getLibraryEditor(library
).getModel();
145 private LibraryTable
.ModifiableModel
getLibrariesModifiableModel() {
146 if (myLibrariesModifiableModel
== null) {
147 myLibrariesModifiableModel
= myTable
.getModifiableModel();
150 return myLibrariesModifiableModel
;
153 public void disposeUncommittedLibraries() {
154 for (final Library library
: new ArrayList
<Library
>(myLibrary2EditorMap
.keySet())) {
155 final Library existingLibrary
= myTable
.getLibraryByName(library
.getName());
156 if (existingLibrary
!= library
) {
157 Disposer
.dispose(library
);
160 final LibraryEditor libraryEditor
= myLibrary2EditorMap
.get(library
);
161 if (libraryEditor
!= null) {
162 Disposer
.dispose(libraryEditor
);
166 myLibrary2EditorMap
.clear();