/* * Copyright 2000-2014 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.xdebugger.impl.frame; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.FileColorManager; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.ui.TextTransferable; import com.intellij.util.ui.UIUtil; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.frame.XStackFrame; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.datatransfer.Transferable; /** * @author nik */ public class XDebuggerFramesList extends DebuggerFramesList { private static final TransferHandler DEFAULT_TRANSFER_HANDLER = new TransferHandler() { @Override protected Transferable createTransferable(JComponent c) { if (!(c instanceof XDebuggerFramesList)) { return null; } XDebuggerFramesList list = (XDebuggerFramesList)c; //noinspection deprecation Object[] values = list.getSelectedValues(); if (values == null || values.length == 0) { return null; } StringBuilder plainBuf = new StringBuilder(); StringBuilder htmlBuf = new StringBuilder(); TextTransferable.ColoredStringBuilder coloredTextContainer = new TextTransferable.ColoredStringBuilder(); htmlBuf.append("\n\n\n\n"); return new TextTransferable(htmlBuf.toString(), plainBuf.toString()); } @Override public int getSourceActions(@NotNull JComponent c) { return COPY; } }; private XStackFrame mySelectedFrame; public XDebuggerFramesList(@NotNull Project project) { super(project); doInit(); setTransferHandler(DEFAULT_TRANSFER_HANDLER); setDataProvider(new DataProvider() { @Nullable @Override public Object getData(@NonNls String dataId) { if (CommonDataKeys.VIRTUAL_FILE.is(dataId) && mySelectedFrame != null) { XSourcePosition position = mySelectedFrame.getSourcePosition(); return position != null ? position.getFile() : null; } return null; } }); } @Override protected ListCellRenderer createListRenderer() { return new XDebuggerFrameListRenderer(myProject); } @Override protected void onFrameChanged(final Object selectedValue) { if (mySelectedFrame != selectedValue) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { repaint(); } }); if (selectedValue instanceof XStackFrame) { mySelectedFrame = (XStackFrame)selectedValue; } else { mySelectedFrame = null; } } } private static class XDebuggerFrameListRenderer extends ColoredListCellRenderer { private final FileColorManager myColorsManager; private final PsiManager myPsiManager; public XDebuggerFrameListRenderer(Project project) { myPsiManager = PsiManager.getInstance(project); myColorsManager = FileColorManager.getInstance(project); } @Override protected void customizeCellRenderer(final JList list, final Object value, final int index, final boolean selected, final boolean hasFocus) { // Fix GTK background if (UIUtil.isUnderGTKLookAndFeel()){ final Color background = selected ? UIUtil.getTreeSelectionBackground() : UIUtil.getTreeTextBackground(); UIUtil.changeBackGround(this, background); } if (value == null) { append(XDebuggerBundle.message("stack.frame.loading.text"), SimpleTextAttributes.GRAY_ATTRIBUTES); return; } if (value instanceof String) { append((String)value, SimpleTextAttributes.ERROR_ATTRIBUTES); return; } XStackFrame stackFrame = (XStackFrame)value; if (!selected) { XSourcePosition position = stackFrame.getSourcePosition(); if (position != null) { final VirtualFile virtualFile = position.getFile(); if (virtualFile.isValid()) { PsiFile f = myPsiManager.findFile(virtualFile); if (f != null) { Color c = myColorsManager.getFileColor(f); if (c != null) setBackground(c); } } } } stackFrame.customizePresentation(this); } } }