Java tutorial
/* * Copyright (C) 2015 The Android Open Source Project * * 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 com.android.tools.idea.gradle.project.library; import com.google.common.collect.Sets; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.impl.ActionButton; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.JavadocOrderRootType; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryRootsComponent; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.OnePixelDivider; import com.intellij.openapi.ui.ex.MultiLineLabel; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.components.JBLabel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.List; import java.util.Set; import static com.android.tools.idea.gradle.util.Projects.executeProjectChanges; import static com.intellij.openapi.roots.OrderRootType.CLASSES; import static com.intellij.openapi.roots.OrderRootType.SOURCES; import static com.intellij.util.ArrayUtil.EMPTY_STRING_ARRAY; import static com.intellij.util.ui.JBUI.Borders.customLine; import static com.intellij.util.ui.UIUtil.findComponentOfType; import static com.intellij.util.ui.UIUtil.findComponentsOfType; public class LibraryPropertiesDialog extends DialogWrapper { @NotNull private final Project myProject; @NotNull private final Library myLibrary; private JPanel myMainPanel; private JPanel myTreePanel; private JBLabel myIconLabel; private JBLabel myNameLabel; private LibraryRootsComponent myLibraryEditorComponent; public LibraryPropertiesDialog(@NotNull Project project, @NotNull Library library) { super(project); myProject = project; myLibrary = library; init(); setTitle("Library Properties"); } @Nullable @Override protected JComponent createCenterPanel() { myIconLabel.setIcon(AllIcons.Modules.Library); myNameLabel.setText(myLibrary.getName()); LibraryEditor editor = new SourcesAndDocsOnlyEditor(myLibrary); myLibraryEditorComponent = new LibraryRootsComponent(myProject, editor) { @Override public void updatePropertiesLabel() { JComponent c = getComponent(); if (c != null) { MultiLineLabel propertiesLabel = findComponentOfType(c, MultiLineLabel.class); if (propertiesLabel != null) { propertiesLabel.setText("Add or remove source/Javadoc attachments"); } } } }; myLibraryEditorComponent.updatePropertiesLabel(); JComponent c = myLibraryEditorComponent.getComponent(); // Remove "Exclude" button. We don't support this in libraries. List<ActionButton> actionButtons = findComponentsOfType(c, ActionButton.class); for (ActionButton actionButton : actionButtons) { String text = actionButton.getAction().getTemplatePresentation().getText(); if (text != null && text.startsWith("Exclude")) { actionButton.setVisible(false); break; } } MultiLineLabel propertiesLabel = findComponentOfType(c, MultiLineLabel.class); if (propertiesLabel != null) { propertiesLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 0, 1)); } myTreePanel.add(c, BorderLayout.CENTER); myTreePanel.setBorder(customLine(OnePixelDivider.BACKGROUND, 1, 1, 1, 1)); return myMainPanel; } @Override protected void dispose() { if (myLibraryEditorComponent != null) { Disposer.dispose(myLibraryEditorComponent); } super.dispose(); } public void applyChanges() { if (myLibraryEditorComponent != null) { executeProjectChanges(myProject, new Runnable() { @Override public void run() { LibraryEditor editor = myLibraryEditorComponent.getLibraryEditor(); Library.ModifiableModel libraryModel = myLibrary.getModifiableModel(); try { addUrls(editor, libraryModel, SOURCES); addUrls(editor, libraryModel, JavadocOrderRootType.getInstance()); } finally { libraryModel.commit(); } } }); } } // Only shows and updates "source" and "Javadoc" attachments. "Class" attachments cannot be modified because they are set by Gradle. private static void addUrls(@NotNull LibraryEditor editor, @NotNull Library.ModifiableModel libraryModel, @NotNull OrderRootType type) { Set<String> existingUrls = Sets.newHashSet(libraryModel.getUrls(type)); for (String url : editor.getUrls(type)) { if (!existingUrls.contains(url)) { libraryModel.addRoot(url, type); } } } private static class SourcesAndDocsOnlyEditor extends ExistingLibraryEditor { SourcesAndDocsOnlyEditor(@NotNull Library library) { super(library, null); } @Override public String[] getUrls(@NotNull OrderRootType rootType) { if (isIgnored(rootType)) { return EMPTY_STRING_ARRAY; } return super.getUrls(rootType); } @Override public void addRoot(@NotNull VirtualFile file, @NotNull OrderRootType rootType) { if (!isIgnored(rootType)) { super.addRoot(file, rootType); } } @Override public void addRoot(@NotNull String url, @NotNull OrderRootType rootType) { if (!isIgnored(rootType)) { super.addRoot(url, rootType); } } @Override public void removeRoot(@NotNull String url, @NotNull OrderRootType rootType) { if (!isIgnored(rootType)) { super.removeRoot(url, rootType); } } private static boolean isIgnored(@NotNull OrderRootType rootType) { return rootType == CLASSES; } } }