fix dispose for libraries in project structure + directory-based storage fix: set...
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / projectRoot / LibrariesModifiableModel.java
blobb539864d8e75ec9efe8b40858bfbc8da37323706
1 /*
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;
28 import java.util.*;
30 /**
31 * User: anna
32 * Date: 04-Jun-2006
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) {
44 myProject = project;
45 myTable = table;
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);
53 return 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);
64 } else {
65 // dispose uncommitted library
66 Disposer.dispose(library);
70 public void commit() {
71 //do nothing - do deffered commit
74 @NotNull
75 public Iterator<Library> getLibraryIterator() {
76 return getLibrariesModifiableModel().getLibraryIterator();
79 public Library getLibraryByName(@NotNull String name) {
80 return getLibrariesModifiableModel().getLibraryByName(name);
83 @NotNull
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();