merged 'add existing library' and 'add new library' actions in classpath editor
[idea/community.git] / platform / lang-impl / src / com / intellij / util / ui / classpath / ChooseLibrariesFromTablesDialog.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.util.ui.classpath;
17
18 import com.intellij.openapi.application.Application;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.libraries.Library;
21 import com.intellij.openapi.roots.libraries.LibraryTable;
22 import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25
26 import javax.swing.*;
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.List;
30
31 /**
32  * @author nik
33  */
34 public class ChooseLibrariesFromTablesDialog extends ChooseLibrariesDialogBase {
35   private @Nullable Project myProject;
36   private boolean myShowCustomLibraryTables;
37
38   private ChooseLibrariesFromTablesDialog(@NotNull String title, @NotNull Project project, final boolean showCustomLibraryTables) {
39     super(project, title);
40     myShowCustomLibraryTables = showCustomLibraryTables;
41     myProject = project;
42   }
43
44   protected ChooseLibrariesFromTablesDialog(@NotNull JComponent parentComponent,
45                                          @NotNull String title,
46                                          @Nullable Project project,
47                                          final boolean showCustomLibraryTables) {
48     super(parentComponent, title);
49     myShowCustomLibraryTables = showCustomLibraryTables;
50     myProject = project;
51   }
52
53   public static ChooseLibrariesFromTablesDialog createDialog(@NotNull String title,
54                                                              @NotNull Project project,
55                                                              final boolean showCustomLibraryTables) {
56     final ChooseLibrariesFromTablesDialog dialog = new ChooseLibrariesFromTablesDialog(title, project, showCustomLibraryTables);
57     dialog.init();
58     return dialog;
59   }
60
61   @NotNull
62   @Override
63   protected Project getProject() {
64     if (myProject != null) {
65       return myProject;
66     }
67     return super.getProject();
68   }
69
70   @Override
71   protected JComponent createNorthPanel() {
72     return null;
73   }
74
75   @Override
76   protected void collectChildren(Object element, List<Object> result) {
77     if (element instanceof Application) {
78       for (LibraryTable table : getLibraryTables(myProject, myShowCustomLibraryTables)) {
79         if (hasLibraries(table)) {
80           result.add(table);
81         }
82       }
83     }
84     else if (element instanceof LibraryTable) {
85       Collections.addAll(result, getLibraries((LibraryTable)element));
86     }
87   }
88
89   public static List<LibraryTable> getLibraryTables(final Project project, final boolean showCustomLibraryTables) {
90     final List<LibraryTable> tables = new ArrayList<LibraryTable>();
91     final LibraryTablesRegistrar registrar = LibraryTablesRegistrar.getInstance();
92     if (project != null) {
93       tables.add(registrar.getLibraryTable(project));
94     }
95     tables.add(registrar.getLibraryTable());
96     if (showCustomLibraryTables) {
97       for (LibraryTable table : registrar.getCustomLibraryTables()) {
98         tables.add(table);
99       }
100     }
101     return tables;
102   }
103
104   private boolean hasLibraries(LibraryTable table) {
105     final Library[] libraries = getLibraries(table);
106     for (Library library : libraries) {
107       if (acceptsElement(library)) {
108         return true;
109       }
110     }
111     return false;
112   }
113
114   @Override
115   protected int getLibraryTableWeight(@NotNull LibraryTable libraryTable) {
116     if (isProjectLibraryTable(libraryTable)) return 0;
117     if (isApplicationLibraryTable(libraryTable)) return 1;
118     return 2;
119   }
120
121   private static boolean isApplicationLibraryTable(LibraryTable libraryTable) {
122     return libraryTable.equals(LibraryTablesRegistrar.getInstance().getLibraryTable());
123   }
124
125   private boolean isProjectLibraryTable(LibraryTable libraryTable) {
126     final LibraryTablesRegistrar registrar = LibraryTablesRegistrar.getInstance();
127     return myProject != null && libraryTable.equals(registrar.getLibraryTable(myProject));
128   }
129
130   @Override
131   protected boolean isAutoExpandLibraryTable(@NotNull LibraryTable libraryTable) {
132     return isApplicationLibraryTable(libraryTable) || isProjectLibraryTable(libraryTable);
133   }
134
135   @NotNull
136   protected Library[] getLibraries(@NotNull LibraryTable table) {
137     return table.getLibraries();
138   }
139 }