migrated to artifacts
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / ClasspathEditor.java
blobd9a160edee94df91977cd215005c37e226f25b23
1 /*
2 * Copyright 2004-2005 Alexey Efimov
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.
16 package com.intellij.openapi.roots.ui.configuration;
18 import com.intellij.openapi.options.ConfigurationException;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.project.ProjectBundle;
21 import com.intellij.openapi.roots.ModifiableRootModel;
22 import com.intellij.openapi.roots.OrderEntry;
23 import com.intellij.openapi.roots.impl.storage.ClasspathStorage;
24 import com.intellij.openapi.roots.impl.storage.ClasspathStorageProvider;
25 import com.intellij.openapi.util.IconLoader;
26 import com.intellij.ui.OrderPanelListener;
27 import org.jetbrains.annotations.NotNull;
29 import javax.swing.*;
30 import java.awt.*;
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
35 /**
36 * @author Eugene Zhuravlev
37 * Date: Oct 4, 2003
38 * Time: 6:54:57 PM
40 public class ClasspathEditor extends ModuleElementsEditor {
41 public static final String NAME = ProjectBundle.message("modules.classpath.title");
42 public static final Icon ICON = IconLoader.getIcon("/modules/classpath.png");
44 private ClasspathPanel myPanel;
45 private final ModulesProvider myModulesProvider;
47 private ClasspathFormatPanel myClasspathFormatPanel;
49 public ClasspathEditor(Project project, ModifiableRootModel model, final ModulesProvider modulesProvider) {
50 super(project, model);
51 myModulesProvider = modulesProvider;
54 public boolean isModified() {
55 return super.isModified() || ( myClasspathFormatPanel != null && myClasspathFormatPanel.isModified());
58 public String getHelpTopic() {
59 return "projectStructure.modules.dependencies";
62 public String getDisplayName() {
63 return NAME;
66 public Icon getIcon() {
67 return ICON;
70 public void saveData() {
71 myPanel.stopEditing();
72 flushChangesToModel();
75 public void apply () throws ConfigurationException {
76 if(myClasspathFormatPanel!=null) {
77 myClasspathFormatPanel.apply();
81 @Override
82 public void canApply() throws ConfigurationException {
83 super.canApply();
84 if (myClasspathFormatPanel != null) {
85 final String storageID = myClasspathFormatPanel.getSelectedClasspathFormat();
86 ClasspathStorage.getProvider(storageID).assertCompatible(myModel);
90 public JComponent createComponentImpl() {
91 myPanel = new ClasspathPanel(myProject, myModel, myModulesProvider);
93 myPanel.addListener(new OrderPanelListener() {
94 public void entryMoved() {
95 flushChangesToModel();
97 });
99 final JPanel panel = new JPanel(new BorderLayout());
100 panel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
101 panel.add(myPanel, BorderLayout.CENTER);
103 final ModuleJdkConfigurable jdkConfigurable =
104 new ModuleJdkConfigurable(this, myModel, ProjectStructureConfigurable.getInstance(myProject).getProjectJdksModel());
105 panel.add(jdkConfigurable.createComponent(), BorderLayout.NORTH);
106 jdkConfigurable.reset();
107 registerDisposable(jdkConfigurable);
109 List<ClasspathStorageProvider> providers = ClasspathStorage.getProviders();
110 if(providers.size()>1){
111 myClasspathFormatPanel = new ClasspathFormatPanel(providers);
112 panel.add(myClasspathFormatPanel, BorderLayout.SOUTH);
115 return panel;
118 public void flushChangesToModel() {
119 List<OrderEntry> entries = myPanel.getEntries();
120 myModel.rearrangeOrderEntries(entries.toArray(new OrderEntry[entries.size()]));
123 public void selectOrderEntry(@NotNull final OrderEntry entry) {
124 myPanel.selectOrderEntry(entry);
127 public void moduleStateChanged() {
128 if (myPanel != null) {
129 myPanel.initFromModel();
133 private class ClasspathFormatPanel extends JPanel {
135 private final JComboBox cbClasspathFormat;
137 private final Map<String,String> formatIdToDescr = new HashMap<String, String>();
139 private ClasspathFormatPanel(final List<ClasspathStorageProvider> providers) {
140 super(new GridBagLayout());
141 add(new JLabel(ProjectBundle.message("project.roots.classpath.format.label")),
142 new GridBagConstraints(0,0,1,1,0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(10, 6, 6, 0), 0, 0));
144 for (ClasspathStorageProvider provider : providers){
145 formatIdToDescr.put ( provider.getID(), provider.getDescription());
148 final Object[] items = formatIdToDescr.values().toArray();
149 cbClasspathFormat = new JComboBox(items);
150 updateClasspathFormat();
151 add(cbClasspathFormat,
152 new GridBagConstraints(1,0,1,1,1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(6, 6, 6, 0), 0, 0));
155 private void updateClasspathFormat() {
156 cbClasspathFormat.setSelectedItem(formatIdToDescr.get(getModuleClasspathFormat()));
159 private String getSelectedClasspathFormat() {
160 final String selected = (String)cbClasspathFormat.getSelectedItem();
161 for ( Map.Entry<String,String> entry : formatIdToDescr.entrySet() ) {
162 if ( entry.getValue().equals(selected)) {
163 return entry.getKey();
166 throw new IllegalStateException(selected);
169 @NotNull
170 private String getModuleClasspathFormat() {
171 return ClasspathStorage.getStorageType(myModel.getModule());
174 boolean isModified () {
175 return cbClasspathFormat != null && !getSelectedClasspathFormat().equals(getModuleClasspathFormat());
178 void apply () throws ConfigurationException {
179 final String storageID = getSelectedClasspathFormat();
180 ClasspathStorage.getProvider(storageID).assertCompatible(myModel);
181 ClasspathStorage.setStorageType(myModel, storageID);