/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.ui.components; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.plaf.ComponentUI; import org.gephi.ui.utils.UIUtils; //Copied from org.netbeans.lib.profiler.ui.components public class SnippetPanel extends JPanel implements MouseListener, KeyListener, FocusListener { //~ Inner Classes ------------------------------------------------------------------------------------------------------------ public static class Padding extends JPanel { //~ Constructors --------------------------------------------------------------------------------------------------------- public Padding() { setBackground(UIUtils.getProfilerResultsBackground()); setOpaque(true); } //~ Methods -------------------------------------------------------------------------------------------------------------- protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(lineColor); g.drawLine(0, 0, getWidth(), 0); } } private static class Title extends JComponent implements Accessible { //~ Instance fields ------------------------------------------------------------------------------------------------------ String name; private boolean collapsed; private boolean rollOver; //~ Constructors --------------------------------------------------------------------------------------------------------- private Title(String name) { this.name = name; setUI(new TitleUI()); } //~ Methods -------------------------------------------------------------------------------------------------------------- public void setRollOver(boolean rollOver) { if (rollOver == this.rollOver) { return; } this.rollOver = rollOver; repaint(); } public void collapse() { collapsed = true; repaint(); } public void expand() { collapsed = false; repaint(); } } private static class TitleUI extends ComponentUI { //~ Instance fields ------------------------------------------------------------------------------------------------------ private final int TITLE_X_OFFSET = 5; private final int TITLE_Y_OFFSET = 2; private final ImageIcon collapsedIcon = new ImageIcon(TitleUI.class.getResource("resources/collapsedSnippet.png")); //NOI18N private final ImageIcon expandedIcon = new ImageIcon(TitleUI.class.getResource("resources/expandedSnippet.png")); //NOI18N private final JLabel plainPainter = new JLabel(); private final JLabel boldPainter = new JLabel(); private final Font plainFont = plainPainter.getFont().deriveFont(Font.PLAIN); private final Font boldFont = boldPainter.getFont().deriveFont(Font.BOLD); private Dimension preferredSize; //~ Methods -------------------------------------------------------------------------------------------------------------- public Dimension getPreferredSize(JComponent c) { return preferredSize; } public void installUI(JComponent c) { plainPainter.setText(((Title) c).name); plainPainter.setIcon(collapsedIcon); plainPainter.setFont(plainFont); plainPainter.setIconTextGap(5); boldPainter.setText(((Title) c).name); boldPainter.setIcon(expandedIcon); boldPainter.setFont(boldFont); boldPainter.setIconTextGap(5); plainPainter.setSize(plainPainter.getPreferredSize()); Dimension titlePreferredSize = boldPainter.getPreferredSize(); boldPainter.setSize(titlePreferredSize); preferredSize = new Dimension(TITLE_X_OFFSET + titlePreferredSize.width, titlePreferredSize.height + TITLE_Y_OFFSET * 2); } public void paint(Graphics g, JComponent c) { Title title = (Title) c; g.setColor(lineColor); g.drawLine(0, 0, c.getWidth(), 0); if (title.collapsed) { // do not draw bottom line if collapsed if (title.rollOver || title.isFocusOwner()) { g.setColor(focusedBackgroundColor); } else { g.setColor(backgroundColor); } } g.drawLine(0, 1 + plainPainter.getHeight() + TITLE_Y_OFFSET, c.getWidth(), 1 + plainPainter.getHeight() + TITLE_Y_OFFSET); if (title.rollOver || title.isFocusOwner()) { g.setColor(focusedBackgroundColor); } else { g.setColor(backgroundColor); } g.fillRect(0, 1, c.getWidth(), plainPainter.getHeight() + TITLE_Y_OFFSET); g.translate(TITLE_X_OFFSET, TITLE_Y_OFFSET); if (title.collapsed) { plainPainter.paint(g); } else { boldPainter.paint(g); } g.translate(-TITLE_X_OFFSET, -TITLE_Y_OFFSET); } } //~ Static fields/initializers ----------------------------------------------------------------------------------------------- private static Color lineColor; private static Color backgroundColor; private static Color focusedBackgroundColor; static { initColors(); } //~ Instance fields ---------------------------------------------------------------------------------------------------------- private JComponent content; private String snippetName; private Title title; private boolean collapsed = false; //~ Constructors ------------------------------------------------------------------------------------------------------------- public SnippetPanel(String snippetName, JComponent content) { this.snippetName = snippetName; this.content = content; setLayout(new BorderLayout()); title = new Title(snippetName) { public AccessibleContext getAccessibleContext() { return SnippetPanel.this.getAccessibleContext(); } }; title.setFocusable(true); title.addKeyListener(this); title.addMouseListener(this); title.addFocusListener(this); // transfer the tooltip from the content to the snippet panel title.setToolTipText(content.getToolTipText()); content.setToolTipText(null); //** add(title, BorderLayout.NORTH); add(content, BorderLayout.CENTER); getAccessibleContext().setAccessibleName(snippetName); } //~ Methods ------------------------------------------------------------------------------------------------------------------ private static void initColors() { Color systemBackgroundColor = UIUtils.getProfilerResultsBackground(); int backgroundRed = systemBackgroundColor.getRed(); int backgroundGreen = systemBackgroundColor.getGreen(); int backgroundBlue = systemBackgroundColor.getBlue(); boolean inverseColors = backgroundRed < 41 || backgroundGreen < 32 || backgroundBlue < 25; if (inverseColors) { lineColor = UIUtils.getSafeColor(backgroundRed + 41, backgroundGreen + 32, backgroundBlue + 8); backgroundColor = UIUtils.getSafeColor(backgroundRed + 7, backgroundGreen + 7, backgroundBlue + 7); focusedBackgroundColor = UIUtils.getSafeColor(backgroundRed + 25, backgroundGreen + 25, backgroundBlue + 25); } else { lineColor = UIUtils.getSafeColor(backgroundRed - 41 /*214*/, backgroundGreen - 32 /*223*/, backgroundBlue - 8 /*247*/); backgroundColor = UIUtils.getSafeColor(backgroundRed - 7 /*248*/, backgroundGreen - 7 /*248*/, backgroundBlue - 7 /*248*/); focusedBackgroundColor = UIUtils.getSafeColor(backgroundRed - 25 /*230*/, backgroundGreen - 25 /*230*/, backgroundBlue - 25 /*230*/); } } public void setCollapsed(boolean collapsed) { if (this.collapsed == collapsed) { return; } this.collapsed = collapsed; if (collapsed) { title.collapse(); } else { title.expand(); } content.setVisible(!collapsed); revalidate(); } public boolean isCollapsed() { return collapsed; } public void setContent(JComponent content) { this.content = content; } public JComponent getContent() { return content; } public void setSnippetName(String snippetName) { this.snippetName = snippetName; } public String getSnippetName() { return snippetName; } public void focusGained(FocusEvent e) { title.repaint(); } public void focusLost(FocusEvent e) { title.repaint(); } public void keyPressed(final KeyEvent evt) { if (evt.getKeyCode() == KeyEvent.VK_SPACE) { setCollapsed(!isCollapsed()); } } public void keyReleased(final KeyEvent evt) { } // not used public void keyTyped(final KeyEvent evt) { } // not used public void mouseClicked(MouseEvent e) { } // not used public void mouseEntered(MouseEvent e) { title.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); title.setRollOver(true); } public void mouseExited(MouseEvent e) { title.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); title.setRollOver(false); } public void mousePressed(MouseEvent e) { setCollapsed(!collapsed); requestFocus(); } public void mouseReleased(MouseEvent e) { } // not used public void requestFocus() { if (title != null) { title.requestFocus(); } } }