modifiable root model: fix libraries

This commit is contained in:
Alexey Pegov
2009-10-19 20:01:54 +04:00
parent caf9a2d4ab
commit 8f0124a8c4
5 changed files with 36 additions and 27 deletions
@@ -268,7 +268,6 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
}
myContext.getDaemonAnalyzer().clearCaches();
myContext.resetLibraries();
}
public void reset() {
@@ -319,7 +318,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
for (Configurable each : myName2Config) {
each.disposeUIResources();
}
myContext.clear();
myName2Config.clear();
myModuleConfigurator.getFacetsConfigurator().clearMaps();
@@ -27,12 +27,14 @@ import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.impl.libraries.LibraryImpl;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.roots.ui.configuration.LibraryTableModifiableModelProvider;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryTableEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.LibraryProjectStructureElement;
import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureElement;
import com.intellij.openapi.ui.*;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.NamedConfigurable;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
@@ -96,8 +98,7 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl
}
protected void loadTree() {
final LibraryTable libraryTable = LibraryTablesRegistrar.getInstance().getLibraryTableByLevel(myLevel, myProject);
createLibrariesNode(myContext.createModifiableModelProvider(myLevel, false), new LibrariesModifiableModel(libraryTable, myProject));
createLibrariesNode(myContext.createModifiableModelProvider(myLevel, false));
}
@NotNull
@@ -117,8 +118,8 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl
return result;
}
private void createLibrariesNode(final LibraryTableModifiableModelProvider modelProvider, final LibrariesModifiableModel provider) {
final Library[] libraries = provider.getLibraries();
private void createLibrariesNode(final LibraryTableModifiableModelProvider modelProvider) {
final Library[] libraries = modelProvider.getModifiableModel().getLibraries();
for (Library library : libraries) {
myRoot.add(new MyNode(new LibraryConfigurable(modelProvider, library, myProject, TREE_UPDATER)));
}
@@ -159,7 +160,6 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl
}
public void dispose() {
myContext.myLevel2Providers.clear();
}
protected AnAction createCopyAction() {
@@ -38,6 +38,7 @@ import com.intellij.openapi.ui.MasterDetailsComponent;
import com.intellij.openapi.ui.NamedConfigurable;
import com.intellij.openapi.util.ActionCallback;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.ui.ColoredTreeCellRenderer;
import com.intellij.ui.SimpleTextAttributes;
@@ -208,11 +209,7 @@ public abstract class BaseStructureConfigurable extends MasterDetailsComponent i
myAutoScrollHandler.cancelAllRequests();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
dispose();
}
});
Disposer.dispose(this);
}
protected void addCollapseExpandActions(final List<AnAction> result) {
@@ -35,16 +35,17 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel {
private final Map<Library, LibraryEditor> myLibrary2EditorMap = new HashMap<Library, LibraryEditor>();
private final Set<Library> myRemovedLibraries = new HashSet<Library>();
private final LibraryTable.ModifiableModel myLibrariesModifiableModel;
private LibraryTable.ModifiableModel myLibrariesModifiableModel;
private final Project myProject;
private LibraryTable myTable;
public LibrariesModifiableModel(final LibraryTable table, final Project project) {
myProject = project;
myLibrariesModifiableModel = table.getModifiableModel();
myTable = table;
}
public Library createLibrary(String name) {
final Library library = myLibrariesModifiableModel.createLibrary(name);
final Library library = getLibrariesModifiableModel().createLibrary(name);
//createLibraryEditor(library);
final BaseLibrariesConfigurable configurable = ProjectStructureConfigurable.getInstance(myProject).getConfigurableFor(library);
configurable.createLibraryNode(library);
@@ -52,11 +53,11 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel {
}
public void removeLibrary(@NotNull Library library) {
if (myLibrariesModifiableModel.getLibraryByName(library.getName()) == null) return;
if (getLibrariesModifiableModel().getLibraryByName(library.getName()) == null) return;
myRemovedLibraries.add(library);
removeLibraryEditor(library);
myLibrariesModifiableModel.removeLibrary(library);
getLibrariesModifiableModel().removeLibrary(library);
}
public void commit() {
@@ -65,31 +66,32 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel {
@NotNull
public Iterator<Library> getLibraryIterator() {
return myLibrariesModifiableModel.getLibraryIterator();
return getLibrariesModifiableModel().getLibraryIterator();
}
public Library getLibraryByName(@NotNull String name) {
return myLibrariesModifiableModel.getLibraryByName(name);
return getLibrariesModifiableModel().getLibraryByName(name);
}
@NotNull
public Library[] getLibraries() {
return myLibrariesModifiableModel.getLibraries();
return getLibrariesModifiableModel().getLibraries();
}
public boolean isChanged() {
for (LibraryEditor libraryEditor : myLibrary2EditorMap.values()) {
if (libraryEditor.hasChanges()) return true;
}
return myLibrariesModifiableModel.isChanged();
return getLibrariesModifiableModel().isChanged();
}
public void deferredCommit(){
for (LibraryEditor libraryEditor : new ArrayList<LibraryEditor>(myLibrary2EditorMap.values())) {
libraryEditor.commit();
libraryEditor.commit(); // TODO: is seems like commit will recreate the editor, but it should not
}
if (!(myLibrary2EditorMap.isEmpty() && myRemovedLibraries.isEmpty())) {
myLibrariesModifiableModel.commit();
getLibrariesModifiableModel().commit();
myLibrariesModifiableModel = null;
}
myLibrary2EditorMap.clear();
myRemovedLibraries.clear();
@@ -136,4 +138,12 @@ public class LibrariesModifiableModel implements LibraryTable.ModifiableModel {
public Library.ModifiableModel getLibraryModifiableModel(final Library library) {
return getLibraryEditor(library).getModel();
}
private LibraryTable.ModifiableModel getLibrariesModifiableModel() {
if (myLibrariesModifiableModel == null) {
myLibrariesModifiableModel = myTable.getModifiableModel();
}
return myLibrariesModifiableModel;
}
}
@@ -129,7 +129,6 @@ public class StructureConfigurableContext implements Disposable {
@Nullable
public Library getLibrary(final String libraryName, final String libraryLevel) {
/* the null check is added only to prevent NPE when called from getLibrary */
if (myLevel2Providers.isEmpty()) resetLibraries();
final LibrariesModifiableModel model = myLevel2Providers.get(libraryLevel);
return model == null ? null : findLibraryModel(libraryName, model);
}
@@ -149,8 +148,12 @@ public class StructureConfigurableContext implements Disposable {
public void reset() {
myDaemonAnalyzer.reset();
resetLibraries();
myModulesConfigurator.resetModuleEditors();
myDaemonAnalyzer.reset(); // should be called after resetLibraries!
}
public void clear() {
myLevel2Providers.clear();
}
}