/* * Copyright 2000-2009 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.codeInsight.daemon.impl; import com.intellij.openapi.editor.HectorComponentPanel; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.include.FileIncludeManager; import com.intellij.ui.ComboboxWithBrowseButton; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; /** * @author mike */ public class FileIncludeContextHectorPanel extends HectorComponentPanel { private ComboboxWithBrowseButton myContextFile; private JPanel myPanel; private final PsiFile myFile; private final FileIncludeManager myIncludeManager; public FileIncludeContextHectorPanel(final PsiFile file, final FileIncludeManager includeManager) { myFile = file; myIncludeManager = includeManager; reset(); } @Override public JComponent createComponent() { return myPanel; } @Override public boolean isModified() { return false; } @Override public void apply() throws ConfigurationException { } @Override public void reset() { final JComboBox comboBox = myContextFile.getComboBox(); comboBox.setRenderer(new MyListCellRenderer(comboBox)); final VirtualFile[] includingFiles = myIncludeManager.getIncludingFiles(myFile.getVirtualFile(), false); comboBox.setModel(new DefaultComboBoxModel(includingFiles)); myContextFile.setTextFieldPreferredWidth(30); } @Override public void disposeUIResources() { } private class MyListCellRenderer extends DefaultListCellRenderer { private final JComboBox myComboBox; private int myMaxWidth; public MyListCellRenderer(final JComboBox comboBox) { myComboBox = comboBox; myMaxWidth = comboBox.getPreferredSize().width; } @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { final Component rendererComponent = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); String path = getPath(value); if (path != null) { final int max = index == -1 ? myComboBox.getWidth() - myContextFile.getButton().getWidth() : myComboBox.getWidth() * 3; path = trimPath(path, myComboBox, "/", max); setText(path); } return rendererComponent; } @Nullable protected String getPath(final Object value) { final VirtualFile file = (VirtualFile)value; final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myFile.getProject()).getFileIndex(); if (file != null) { VirtualFile root = fileIndex.getSourceRootForFile(file); if (root == null) { root = fileIndex.getContentRootForFile(file); } if (root != null) { return VfsUtilCore.getRelativePath(file, root, '/'); } } return null; } private String trimPath(String path, Component component, String separator, int length) { final FontMetrics fontMetrics = component.getFontMetrics(component.getFont()); final int maxWidth = fontMetrics.stringWidth(path); if (maxWidth <= length) { myMaxWidth = Math.max(maxWidth, myMaxWidth); return path; } final StringBuilder result = new StringBuilder(path); if (path.startsWith(separator)) { result.delete(0, 1); } final String[] strings = result.toString().split(separator); result.replace(0, strings[0].length(), "..."); for (int i = 1; i < strings.length; i++) { final String clipped = result.toString(); final int width = fontMetrics.stringWidth(clipped); if (width <= length) { myMaxWidth = Math.max(width, myMaxWidth); return clipped; } result.delete(4, 5 + strings[i].length()); } return result.toString(); } } }