All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bibliothek.gui.dock.focus.DefaultDockableSelection Maven / Gradle / Ivy

There is a newer version: 1.1.2p6a
Show newest version
/*
 * Bibliothek - DockingFrames
 * Library built on Java/Swing, allows the user to "drag and drop"
 * panels containing any Swing-Component the developer likes to add.
 * 
 * Copyright (C) 2008 Benjamin Sigg
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Benjamin Sigg
 * [email protected]
 * CH - Switzerland
 */
package bibliothek.gui.dock.focus;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import bibliothek.gui.Dockable;

/**
 * A {@link DockableSelection} that uses a {@link JList} to display all the
 * available {@link Dockable}s. Subclasses can rearange the layout of this
 * selection using {@link Container#removeAll()} and later {@link #getList()}
 * to get access to the component which represents the list.
 * @author Benjamin Sigg
 */
public class DefaultDockableSelection extends AbstractDockableSelection{
    private Model model = new Model();
    private JScrollPane listPane;
    private JList list;
    
    /**
     * Creates a new selection
     */
    public DefaultDockableSelection(){
        list = new JList( model );
        list.setCellRenderer( new Renderer() );
        
        list.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
        list.addListSelectionListener( new ListSelectionListener(){
            public void valueChanged( ListSelectionEvent e ) {
                setSelection( (Dockable)list.getSelectedValue() );
            }
        });
        
        setLayout( new BorderLayout() );
        listPane = new JScrollPane( list );
        add( listPane, BorderLayout.CENTER );
        
        list.addMouseListener( new MouseAdapter(){
            @Override
            public void mouseClicked( MouseEvent e ) {
                select();
            }
        });
        
        list.addMouseMotionListener( new MouseMotionAdapter(){ 
            @Override
            public void mouseMoved( MouseEvent e ) {
                int current = list.getSelectedIndex();
                int index = list.locationToIndex( e.getPoint() );
                
                if( index != current && index >= 0 && index < model.getSize() ){
                    list.setSelectedIndex( index );
                }
            }
        });
    }
    
    @Override
    public void updateUI() {
        super.updateUI();
        if( list != null )
            list.setCellRenderer( new Renderer() );
    }
    
    /**
     * Gets the component which represents the list.
     * @return the list
     */
    protected JComponent getList(){
        return listPane;
    }
    
    @Override
    protected void up() {
        int index = list.getSelectedIndex();
        if( index == -1 ){
            index = 0;
        }
        else{
            index--;
            if( index < 0 )
                index = model.getSize()-1;
        }
        list.setSelectedIndex( index );
        list.ensureIndexIsVisible( index );
    }

    @Override
    protected void right() {
        down();
    }

    
    @Override
    protected void down() {
        int index = list.getSelectedIndex();
        index++;
        if( index >= model.getSize() )
            index = 0;
        list.setSelectedIndex( index );
        list.ensureIndexIsVisible( index );
    }

    @Override
    protected void left() {
        up();
    }


    @Override
    protected void iconChanged( int index, Dockable dockable ) {
        model.change( index );
    }

    @Override
    protected void insert( int index, Dockable dockable ) {
        model.insertElementAt( dockable, index );
    }


    @Override
    protected void remove( int index, Dockable dockable ) {
        model.remove( index );
    }

    @Override
    protected void select( Dockable dockable ) {
        list.setSelectedValue( dockable, true );
        int index = list.getSelectedIndex();
        if( index >= 0 )
            list.ensureIndexIsVisible( index );
    }
    
    @Override
    protected void titleChanged( int index, Dockable dockable ) {
        model.change( index );
    }

    
    /**
     * The model used to collect {@link Dockable}s.
     * @author Benjamin Sigg
     */
    private static class Model extends DefaultListModel{
        public void change( int index ){
            fireContentsChanged( this, index, index );
        }
    }
    
    /**
     * The renderer which draws {@link Dockable}s.
     * @author Benjamin Sigg
     */
    private static class Renderer extends DefaultListCellRenderer{
        @Override
        public Component getListCellRendererComponent( JList list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus ) {

            if( value instanceof Dockable ){
                Dockable dockable = (Dockable)value;
                
                super.getListCellRendererComponent( list, "", index, isSelected, cellHasFocus );
                
                setText( dockable.getTitleText() );
                setIcon( dockable.getTitleIcon() );
                
                return this;
            }
            
            return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy