/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.button; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; /** * CollapseExpandButton provides a expand/collapse functionality to a component: clicking the button expands/collapses * the associated component making it visible/unvisible, and resizes the window that contains it so that it properly * fits. * * <p>This button shows an down/right arrow icon to reflect the current expanded/collapsed state.</p> * * @author Maxence Bernard */ public class CollapseExpandButton extends ArrowButton implements ActionListener, KeyListener { /** The component to collapse/expand */ private Component comp; /** True if this button is in the 'expanded' state and the associated component is being displayed */ private boolean expandedState; /** * Creates a new CollapseExpandButton that renders the specified component visible/invisible. * * @param label the label to use for this button * @param component the component that is to be expanded/collapsed * @param expanded initial expanded/collapsed state */ public CollapseExpandButton(String label, Component component, boolean expanded) { this.comp = component; setText(label); setExpandedState(expanded, false); addActionListener(this); addKeyListener(this); } /** * Expands/collapses the associated component, resizes the window that contains it, and updates the button's icon * to reflect the new state. * * @param expanded if <code>true</code>, the component will be expanded, collapsed if <code>false</code>. */ public void setExpandedState(boolean expanded) { setExpandedState(expanded, true); } /** * Returns the current expanded state of the component: <code>true</code> for expanded, <code>false</code> for * collapsed. * * @return the current expanded state of the component: true for expanded, false for collapsed. */ public boolean getExpandedState() { return expandedState; } /** * Sets the new expanded state for the component: <code>true</code> for expanded, <code>false</code> for collapsed. * If specified, the window which contains the expanded/collapsed component will be repacked so that the component * fits properly. * * @param expanded the new expanded state: true for expanded, false for collapsed. * @param packWindow If true, the window which contains the expanded/collapsed component will be repacked so that * the component fits properly. */ private void setExpandedState(boolean expanded, boolean packWindow) { if(expanded) { setArrowDirection(DOWN_DIRECTION); comp.setVisible(true); } else { setArrowDirection(RIGHT_DIRECTION); comp.setVisible(false); } this.expandedState = expanded; if(packWindow) { Container tla = getTopLevelAncestor(); if(tla instanceof Window) ((Window)tla).pack(); } } /////////////////////////////////// // ActionListener implementation // /////////////////////////////////// public void actionPerformed(ActionEvent actionEvent) { setExpandedState(!expandedState, true); } //////////////////////////////// // KeyListener implementation // //////////////////////////////// public void keyPressed(KeyEvent keyEvent) { int keyCode = keyEvent.getKeyCode(); if(keyCode==KeyEvent.VK_RIGHT && !expandedState) setExpandedState(true, true); else if(keyCode==KeyEvent.VK_LEFT && expandedState) setExpandedState(false, true); } public void keyReleased(KeyEvent keyEvent) { } public void keyTyped(KeyEvent keyEvent) { } }