<!--
  ~ Copyright 2016 The Bazel Authors. All rights reserved.
  ~
  ~ 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.
  -->
<idea-plugin>
  <depends>JUnit</depends>
  <depends>com.intellij.modules.java</depends>

  <actions>
    <action class="com.google.idea.blaze.java.libraries.ExcludeLibraryAction"
            id="Blaze.ExcludeLibraryAction"
            icon="BlazeIcons.Blaze"
            text="Exclude Library and Resync">
      <add-to-group group-id="Blaze.ProjectViewPopupMenu"/>
    </action>
    <action class="com.google.idea.blaze.java.libraries.AttachSourceJarAction"
            id="Blaze.AttachSourceJarAction"
            icon="BlazeIcons.Blaze"
            text="Attach Source Jar">
      <add-to-group group-id="Blaze.ProjectViewPopupMenu"/>
    </action>
    <action class="com.google.idea.blaze.java.libraries.AddLibraryRuleDirectoryToProjectViewAction"
            id="Blaze.AddLibraryRuleDirectoryToProjectView"
            icon="BlazeIcons.Blaze"
            text="Add Library Rule Directory To Project View">
      <add-to-group group-id="Blaze.ProjectViewPopupMenu"/>
    </action>

    <group>
      <action class="com.google.idea.blaze.java.libraries.DetachAllSourceJarsAction"
        id="Blaze.DetachAllSourceJars"
        text="Detach All Blaze Source Jars">
      </action>
      <separator/>
      <add-to-group group-id="Blaze.MainMenuActionGroup" relative-to-action="Blaze.EditProjectView" anchor="before"/>
    </group>

    <!-- IntelliJ specific actions -->

    <action id="Blaze.ImportProject2" class="com.google.idea.blaze.java.wizard2.BlazeImportProjectAction" icon="BlazeIcons.Blaze">
      <add-to-group group-id="WelcomeScreen.QuickStart" />
      <add-to-group group-id="OpenProjectGroup" relative-to-action="ImportProject" anchor="after"/>
    </action>

    <!-- End IntelliJ specific actions -->

  </actions>

  <extensions defaultExtensionNs="com.google.idea.blaze">
    <SyncPlugin implementation="com.google.idea.blaze.java.sync.BlazeJavaSyncPlugin"/>
    <PsiFileProvider implementation="com.google.idea.blaze.java.psi.JavaPsiFileProvider" />
    <BlazeCommandRunConfigurationHandlerProvider implementation="com.google.idea.blaze.java.run.BlazeJavaRunConfigurationHandlerProvider"/>
    <RunConfigurationFactory implementation="com.google.idea.blaze.java.run.BlazeJavaRunConfigurationFactory"/>
    <RunConfigurationFactory implementation="com.google.idea.blaze.java.run.BlazeJavaTestRunConfigurationFactory"/>
    <BlazeUserSettingsContributor implementation="com.google.idea.blaze.java.settings.BlazeJavaUserSettingsContributor$BlazeJavaUserSettingsProvider"/>
    <FileCache implementation="com.google.idea.blaze.java.libraries.JarCache$FileCacheAdapter"/>
    <PrefetchFileSource implementation="com.google.idea.blaze.java.sync.JavaPrefetchFileSource"/>
    <SyncListener implementation="com.google.idea.blaze.java.syncstatus.SyncStatusHelper$UpdateSyncStatusMap"/>
  </extensions>

  <extensions defaultExtensionNs="com.intellij">
    <runConfigurationProducer
        implementation="com.google.idea.blaze.java.run.producers.BlazeJavaMainClassRunConfigurationProducer"
        order="first"/>
    <runConfigurationProducer
        implementation="com.google.idea.blaze.java.run.producers.BlazeJavaTestClassConfigurationProducer"
        order="first"/>
    <runConfigurationProducer
        implementation="com.google.idea.blaze.java.run.producers.BlazeJavaTestMethodConfigurationProducer"
        order="first"/>
    <projectViewNodeDecorator implementation="com.google.idea.blaze.java.syncstatus.BlazeJavaSyncStatusClassNodeDecorator"/>
    <editorTabColorProvider implementation="com.google.idea.blaze.java.syncstatus.BlazeJavaSyncStatusEditorTabColorProvider"/>
    <editorTabTitleProvider implementation="com.google.idea.blaze.java.syncstatus.BlazeJavaSyncStatusEditorTabTitleProvider"/>
    <applicationService serviceInterface="com.google.idea.blaze.java.sync.source.JavaSourcePackageReader"
                        serviceImplementation="com.google.idea.blaze.java.sync.source.JavaSourcePackageReader"/>
    <applicationService serviceInterface="com.google.idea.blaze.java.sync.source.PackageManifestReader"
                        serviceImplementation="com.google.idea.blaze.java.sync.source.PackageManifestReader"/>
    <programRunner implementation="com.google.idea.blaze.java.run.BlazeJavaDebuggerRunner"/>
    <projectService serviceInterface="com.google.idea.blaze.base.ui.BlazeProblemsView"
                    serviceImplementation="com.google.idea.blaze.java.ui.BlazeIntelliJProblemsView"/>
    <projectService serviceImplementation="com.google.idea.blaze.java.libraries.SourceJarManager"/>
    <refactoring.safeDeleteProcessor id="build_file_safe_delete" order="before javaProcessor"
                                     implementation="com.google.idea.blaze.java.lang.build.BuildFileSafeDeleteProcessor"/>
    <projectService serviceImplementation="com.google.idea.blaze.java.libraries.JarCache"/>

    <attachSourcesProvider implementation="com.google.idea.blaze.java.libraries.AddLibraryRuleDirectoryToProjectViewAttachSourcesProvider"/>
    <attachSourcesProvider implementation="com.google.idea.blaze.java.libraries.BlazeAttachSourceProvider"/>
    <applicationService serviceImplementation="com.google.idea.blaze.java.settings.BlazeJavaUserSettings"/>
    <projectService serviceImplementation="com.google.idea.blaze.java.syncstatus.SyncStatusHelper"/>
  </extensions>

  <project-components>
    <component>
      <implementation-class>com.google.idea.blaze.java.run.producers.NonBlazeProducerSuppressor</implementation-class>
    </component>
  </project-components>

  <extensionPoints>
    <extensionPoint qualifiedName="com.google.idea.blaze.java.JavaSyncAugmenter"
                    interface="com.google.idea.blaze.java.sync.BlazeJavaSyncAugmenter"/>
  </extensionPoints>
</idea-plugin>
