e5c65715c3ab700a8aa0f6641688afbacfcb6ca8
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / config / GroovyLibraryListener.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 org.jetbrains.plugins.groovy.config;
17
18 import com.intellij.ProjectTopics;
19 import com.intellij.openapi.application.Application;
20 import com.intellij.openapi.application.ApplicationManager;
21 import com.intellij.openapi.application.ApplicationNamesInfo;
22 import com.intellij.openapi.components.AbstractProjectComponent;
23 import com.intellij.openapi.module.Module;
24 import com.intellij.openapi.module.ModuleManager;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.roots.ModuleRootEvent;
27 import com.intellij.openapi.roots.ModuleRootListener;
28 import com.intellij.openapi.roots.libraries.Library;
29 import com.intellij.openapi.ui.Messages;
30 import com.intellij.openapi.vfs.newvfs.persistent.FSRecords;
31 import com.intellij.util.containers.hash.HashSet;
32 import com.intellij.util.messages.MessageBusConnection;
33 import org.jetbrains.plugins.groovy.util.LibrariesUtil;
34
35 import java.util.Set;
36
37 /**
38  * @author Maxim.Medvedev
39  */
40 public class GroovyLibraryListener extends AbstractProjectComponent implements ModuleRootListener {
41   private final Set<Module> groovyModules = new HashSet<Module>();
42
43   public GroovyLibraryListener(Project project) {
44     super(project);
45   }
46
47   @Override
48   public void projectOpened() {
49     final MessageBusConnection connection = myProject.getMessageBus().connect(myProject);
50     connection.subscribe(ProjectTopics.PROJECT_ROOTS, this);
51
52     final Module[] modules = ModuleManager.getInstance(myProject).getModules();
53     for (Module module : modules) {
54       if (module.isDisposed()) continue;
55       if (LibrariesUtil.hasGroovySdk(module)) {
56         groovyModules.add(module);
57       }
58     }
59   }
60
61   public void beforeRootsChange(ModuleRootEvent event) {
62   }
63
64   public void rootsChanged(ModuleRootEvent event) {
65     final Module[] modules = ModuleManager.getInstance(myProject).getModules();
66     for (Module module : modules) {
67       if (module.isDisposed()) continue;
68       final Library[] libraries = GroovyConfigUtils.getInstance().getSDKLibrariesByModule(module);
69       if ((libraries.length > 0 && !groovyModules.contains(module))) {
70         final Application app = ApplicationManager.getApplication();
71         if (app.isRestartCapable()) {
72           if (Messages.showYesNoDialog(myProject, "You have added Groovy SDK library '" +
73                                                   libraries[0].getName() +
74                                                   "' to module '" +
75                                                   module.getName() +
76                                                   "'. To add Groovy support " +
77                                                   ApplicationNamesInfo.getInstance().getFullProductName() +
78                                                   " must be restarted. Would you like to add Groovy support and restart now?",
79                                        "Add Groovy support", Messages.getInformationIcon()) == 0) {
80             FSRecords.invalidateCaches();
81             app.restart();
82           }
83         }
84         else {
85           Messages.showMessageDialog(myProject, "You have added Groovy SDK library '" +
86                                                 libraries[0].getName() +
87                                                 "' to module '" +
88                                                 module.getName() +
89                                                 "'. To add Groovy support you need to restart " +
90                                                 ApplicationNamesInfo.getInstance().getFullProductName() +
91                                                 ".", "Add Groovy support", Messages.getInformationIcon());
92         }
93       }
94       else if ((libraries.length == 0 && groovyModules.contains(module))) {
95         groovyModules.remove(module);
96       }
97     }
98   }
99 }