| /* |
| * Copyright 2000-2011 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.jetbrains.android; |
| |
| import com.intellij.facet.Facet; |
| import com.intellij.facet.FacetManager; |
| import com.intellij.facet.FacetManagerAdapter; |
| import com.intellij.facet.ProjectFacetManager; |
| import com.intellij.openapi.Disposable; |
| import com.intellij.openapi.application.ApplicationManager; |
| import com.intellij.openapi.application.ModalityState; |
| import com.intellij.openapi.compiler.CompilerManager; |
| import com.intellij.openapi.components.AbstractProjectComponent; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.module.ModuleManager; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.Disposer; |
| import com.intellij.util.Alarm; |
| import com.intellij.util.containers.HashMap; |
| import com.intellij.util.messages.MessageBusConnection; |
| import org.jetbrains.android.compiler.AndroidAutogeneratorMode; |
| import org.jetbrains.android.compiler.AndroidCompileUtil; |
| import org.jetbrains.android.compiler.AndroidPrecompileTask; |
| import org.jetbrains.android.facet.AndroidFacet; |
| import org.jetbrains.android.facet.AndroidResourceFilesListener; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.util.*; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| public class AndroidProjectComponent extends AbstractProjectComponent { |
| private Disposable myDisposable; |
| |
| protected AndroidProjectComponent(Project project) { |
| super(project); |
| } |
| |
| @Override |
| public void projectOpened() { |
| final CompilerManager manager = CompilerManager.getInstance(myProject); |
| manager.addBeforeTask(new AndroidPrecompileTask()); |
| |
| myDisposable = new Disposable() { |
| @Override |
| public void dispose() { |
| } |
| }; |
| |
| if (!ApplicationManager.getApplication().isUnitTestMode() && |
| !ApplicationManager.getApplication().isHeadlessEnvironment()) { |
| |
| if (ProjectFacetManager.getInstance(myProject).hasFacets(AndroidFacet.ID)) { |
| createAndroidSpecificComponents(); |
| } |
| else { |
| final MessageBusConnection connection = myProject.getMessageBus().connect(myDisposable); |
| |
| connection.subscribe(FacetManager.FACETS_TOPIC, new FacetManagerAdapter() { |
| @Override |
| public void facetAdded(@NotNull Facet facet) { |
| if (facet instanceof AndroidFacet) { |
| createAndroidSpecificComponents(); |
| connection.disconnect(); |
| } |
| } |
| }); |
| } |
| } |
| } |
| |
| @Override |
| public void projectClosed() { |
| Disposer.dispose(myDisposable); |
| } |
| |
| private void createAndroidSpecificComponents() { |
| final AndroidResourceFilesListener listener = new AndroidResourceFilesListener(myProject); |
| Disposer.register(myDisposable, listener); |
| |
| createAlarmForAutogeneration(); |
| } |
| |
| private void createAlarmForAutogeneration() { |
| final Alarm alarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, myDisposable); |
| alarm.addRequest(new Runnable() { |
| @Override |
| public void run() { |
| final Map<AndroidFacet, Collection<AndroidAutogeneratorMode>> facetsToProcess = |
| new HashMap<AndroidFacet, Collection<AndroidAutogeneratorMode>>(); |
| |
| final Module[] modules = ModuleManager.getInstance(myProject).getModules(); |
| final Module[] modulesCopy = Arrays.copyOf(modules, modules.length); |
| |
| for (Module module : modulesCopy) { |
| final AndroidFacet facet = AndroidFacet.getInstance(module); |
| |
| if (facet != null && facet.isAutogenerationEnabled()) { |
| final Set<AndroidAutogeneratorMode> modes = EnumSet.noneOf(AndroidAutogeneratorMode.class); |
| |
| for (AndroidAutogeneratorMode mode : AndroidAutogeneratorMode.values()) { |
| if (facet.cleanRegeneratingState(mode) || facet.isGeneratedFileRemoved(mode)) { |
| modes.add(mode); |
| } |
| } |
| |
| if (modes.size() > 0) { |
| facetsToProcess.put(facet, modes); |
| } |
| } |
| } |
| |
| if (facetsToProcess.size() > 0) { |
| generate(facetsToProcess); |
| } |
| if (!alarm.isDisposed()) { |
| alarm.addRequest(this, 2000); |
| } |
| } |
| }, 2000); |
| } |
| |
| private void generate(final Map<AndroidFacet, Collection<AndroidAutogeneratorMode>> facetsToProcess) { |
| ApplicationManager.getApplication().invokeAndWait(new Runnable() { |
| @Override |
| public void run() { |
| AndroidCompileUtil.createGenModulesAndSourceRoots(myProject, facetsToProcess.keySet()); |
| } |
| }, ModalityState.defaultModalityState()); |
| |
| for (Map.Entry<AndroidFacet, Collection<AndroidAutogeneratorMode>> entry : facetsToProcess.entrySet()) { |
| final AndroidFacet facet = entry.getKey(); |
| final Collection<AndroidAutogeneratorMode> modes = entry.getValue(); |
| |
| for (AndroidAutogeneratorMode mode : modes) { |
| AndroidCompileUtil.doGenerate(facet, mode); |
| } |
| } |
| } |
| } |