/* * Copyright 2000-2012 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 com.intellij.openapi.roots.ui; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager; import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.roots.ui.util.CompositeAppearance; import com.intellij.openapi.roots.ui.util.SimpleTextCellAppearance; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.impl.LightFilePointer; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.PathUtil; import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.io.File; public class OrderEntryAppearanceServiceImpl extends OrderEntryAppearanceService { private static final String NO_JDK = ProjectBundle.message("jdk.missing.item"); @NotNull @Override public CellAppearanceEx forOrderEntry(Project project, @NotNull final OrderEntry orderEntry, final boolean selected) { if (orderEntry instanceof JdkOrderEntry) { JdkOrderEntry jdkLibraryEntry = (JdkOrderEntry)orderEntry; Sdk jdk = jdkLibraryEntry.getJdk(); if (!orderEntry.isValid()) { final String oldJdkName = jdkLibraryEntry.getJdkName(); return FileAppearanceService.getInstance().forInvalidUrl(oldJdkName != null ? oldJdkName : NO_JDK); } return forJdk(jdk, false, selected, true); } else if (!orderEntry.isValid()) { return FileAppearanceService.getInstance().forInvalidUrl(orderEntry.getPresentableName()); } else if (orderEntry instanceof LibraryOrderEntry) { LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry)orderEntry; if (!libraryOrderEntry.isValid()) { //library can be removed return FileAppearanceService.getInstance().forInvalidUrl(orderEntry.getPresentableName()); } Library library = libraryOrderEntry.getLibrary(); assert library != null : libraryOrderEntry; return forLibrary(project, library, !((LibraryEx)library).getInvalidRootUrls(OrderRootType.CLASSES).isEmpty()); } else if (orderEntry.isSynthetic()) { String presentableName = orderEntry.getPresentableName(); Icon icon = orderEntry instanceof ModuleSourceOrderEntry ? sourceFolderIcon(false) : null; return new SimpleTextCellAppearance(presentableName, icon, SimpleTextAttributes.SYNTHETIC_ATTRIBUTES); } else if (orderEntry instanceof ModuleOrderEntry) { final Icon icon = ModuleType.get(((ModuleOrderEntry)orderEntry).getModule()).getIcon(); return SimpleTextCellAppearance.regular(orderEntry.getPresentableName(), icon); } else { return CompositeAppearance.single(orderEntry.getPresentableName()); } } @NotNull @Override public CellAppearanceEx forLibrary(Project project, @NotNull final Library library, final boolean hasInvalidRoots) { final StructureConfigurableContext context = ProjectStructureConfigurable.getInstance(project).getContext(); final Icon icon = LibraryPresentationManager.getInstance().getCustomIcon(library, context); final String name = library.getName(); if (name != null) { return normalOrRedWaved(name, (icon != null ? icon : PlatformIcons.LIBRARY_ICON), hasInvalidRoots); } final String[] files = library.getUrls(OrderRootType.CLASSES); if (files.length == 0) { return SimpleTextCellAppearance.invalid(ProjectBundle.message("library.empty.library.item"), PlatformIcons.LIBRARY_ICON); } else if (files.length == 1) { return forVirtualFilePointer(new LightFilePointer(files[0])); } final String url = StringUtil.trimEnd(files[0], JarFileSystem.JAR_SEPARATOR); String text = ProjectBundle.message("library.unnamed.text", PathUtil.getFileName(url), files.length - 1); return SimpleTextCellAppearance.regular(text, PlatformIcons.LIBRARY_ICON); } @NotNull @Override public CellAppearanceEx forJdk(@Nullable final Sdk jdk, final boolean isInComboBox, final boolean selected, final boolean showVersion) { if (jdk == null) { return FileAppearanceService.getInstance().forInvalidUrl(NO_JDK); } String name = jdk.getName(); CompositeAppearance appearance = new CompositeAppearance(); SdkType sdkType = (SdkType)jdk.getSdkType(); appearance.setIcon(sdkType.getIcon()); SimpleTextAttributes attributes = getTextAttributes(sdkType.sdkHasValidPath(jdk), selected); CompositeAppearance.DequeEnd ending = appearance.getEnding(); ending.addText(name, attributes); if (showVersion) { String versionString = jdk.getVersionString(); if (versionString != null && !versionString.equals(name)) { SimpleTextAttributes textAttributes = isInComboBox && !selected ? SimpleTextAttributes.SYNTHETIC_ATTRIBUTES : SystemInfo.isMac && selected ? new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, Color.WHITE): SimpleTextAttributes.GRAY_ATTRIBUTES; ending.addComment(versionString, textAttributes); } } return ending.getAppearance(); } private static SimpleTextAttributes getTextAttributes(final boolean valid, final boolean selected) { if (!valid) { return SimpleTextAttributes.ERROR_ATTRIBUTES; } else if (selected && !(SystemInfo.isWinVistaOrNewer && UIManager.getLookAndFeel().getName().contains("Windows"))) { return SimpleTextAttributes.SELECTED_SIMPLE_CELL_ATTRIBUTES; } else { return SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES; } } @NotNull @Override public CellAppearanceEx forContentFolder(@NotNull final ContentFolder folder) { if (folder instanceof SourceFolder) { return formatRelativePath(folder, PlatformIcons.FOLDER_ICON); } else if (folder instanceof ExcludeFolder) { return formatRelativePath(folder, IconLoader.getDisabledIcon(PlatformIcons.FOLDER_ICON)); } else { throw new RuntimeException(folder.getClass().getName()); } } @NotNull @Override public CellAppearanceEx forModule(@NotNull final Module module) { return SimpleTextCellAppearance.regular(module.getName(), ModuleType.get(module).getIcon()); } @NotNull private static Icon sourceFolderIcon(final boolean testSource) { return testSource ? PlatformIcons.TEST_SOURCE_FOLDER : PlatformIcons.SOURCE_FOLDERS_ICON; } @NotNull private static CellAppearanceEx normalOrRedWaved(@NotNull final String text, @Nullable final Icon icon, final boolean waved) { return waved ? new SimpleTextCellAppearance(text, icon, new SimpleTextAttributes(SimpleTextAttributes.STYLE_WAVED, null, JBColor.RED)) : SimpleTextCellAppearance.regular(text, icon); } @NotNull private static CellAppearanceEx forVirtualFilePointer(@NotNull final LightFilePointer filePointer) { final VirtualFile file = filePointer.getFile(); return file != null ? FileAppearanceService.getInstance().forVirtualFile(file) : FileAppearanceService.getInstance().forInvalidUrl(filePointer.getPresentableUrl()); } @NotNull private static CellAppearanceEx formatRelativePath(@NotNull final ContentFolder folder, @NotNull final Icon icon) { LightFilePointer folderFile = new LightFilePointer(folder.getUrl()); VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(folder.getContentEntry().getUrl()); if (file == null) return FileAppearanceService.getInstance().forInvalidUrl(folderFile.getPresentableUrl()); String contentPath = file.getPath(); String relativePath; SimpleTextAttributes textAttributes; VirtualFile folderFileFile = folderFile.getFile(); if (folderFileFile == null) { String absolutePath = folderFile.getPresentableUrl(); relativePath = absolutePath.startsWith(contentPath) ? absolutePath.substring(contentPath.length()) : absolutePath; textAttributes = SimpleTextAttributes.ERROR_ATTRIBUTES; } else { relativePath = VfsUtilCore.getRelativePath(folderFileFile, file, File.separatorChar); textAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES; } relativePath = StringUtil.isEmpty(relativePath) ? "." + File.separatorChar : relativePath; return new SimpleTextCellAppearance(relativePath, icon, textAttributes); } }