blob: f62b12e1b566e0a101b77c3b61b644ac794580a5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.core.multitabs;
import java.awt.Point;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.DefaultSingleSelectionModel;
import javax.swing.SingleSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.swing.tabcontrol.TabData;
import org.netbeans.swing.tabcontrol.TabDataModel;
import org.netbeans.swing.tabcontrol.TabbedContainer;
import org.netbeans.swing.tabcontrol.event.TabActionEvent;
/**
*
* @author S. Aubrecht
*/
public final class Controller implements MouseListener {
private List<ActionListener> actionListenerList;
private final SingleSelectionModel selectionModel = new DefaultSingleSelectionModel();
private final TabDataModel tabModel;
private final TabDisplayer displayer;
public Controller( final TabDisplayer displayer ) {
this.displayer = displayer;
this.tabModel = displayer.getModel();
displayer.attach( this );
selectionModel.addChangeListener( new ChangeListener() {
@Override
public void stateChanged( ChangeEvent e ) {
displayer.setSelectedIndex( getSelectedIndex() );
}
});
}
SingleSelectionModel getSelectionModel() {
return selectionModel;
}
public TabDataModel getTabModel() {
return tabModel;
}
void addActionListener( ActionListener al ) {
synchronized( this ) {
if (actionListenerList == null) {
actionListenerList = new ArrayList<ActionListener>(5);
}
actionListenerList.add(al);
}
}
void removeActionListener( ActionListener al ) {
synchronized( this ) {
if (actionListenerList != null) {
actionListenerList.remove(al);
if (actionListenerList.isEmpty()) {
actionListenerList = null;
}
}
}
}
public void addSelectionChangeListener( ChangeListener listener ) {
selectionModel.addChangeListener( listener );
}
public void removeSelectionChangeListener( ChangeListener listener ) {
selectionModel.removeChangeListener( listener );
}
public void postActionEvent( TabActionEvent event ) {
List<ActionListener> list;
synchronized( this ) {
if( actionListenerList == null ) {
return;
}
list = Collections.unmodifiableList( actionListenerList );
}
for( ActionListener l : list ) {
l.actionPerformed( event );
}
}
public void setSelectedIndex( int index ) {
selectionModel.setSelectedIndex( index );
}
public int getSelectedIndex() {
return selectionModel.getSelectedIndex();
}
@Override
public void mouseClicked( MouseEvent e ) {
Point p = e.getPoint();
p = SwingUtilities.convertPoint( e.getComponent(), p, displayer );
TabData tab = displayer.getTabAt( p );
if( null == tab )
return;
final int tabIndex = tabModel.indexOf( tab );
if( e.getClickCount() > 1 && e.getButton() == MouseEvent.BUTTON1 ) {
//maximize/restore
TabActionEvent tae = new TabActionEvent( displayer, TabbedContainer.COMMAND_MAXIMIZE, tabIndex );
postActionEvent( tae );
} else if( e.getButton() == MouseEvent.BUTTON2 ) {
//close tab
TabActionEvent tae = new TabActionEvent( displayer, TabbedContainer.COMMAND_CLOSE, tabIndex );
postActionEvent( tae );
}
}
@Override
public void mousePressed( MouseEvent e ) {
maybeShowPopup( e );
}
@Override
public void mouseReleased( MouseEvent e ) {
maybeShowPopup( e );
}
@Override
public void mouseEntered( MouseEvent e ) {
}
@Override
public void mouseExited( MouseEvent e ) {
}
private void maybeShowPopup( MouseEvent e ) {
if( !e.isPopupTrigger() )
return;
Point p = e.getPoint();
p = SwingUtilities.convertPoint( e.getComponent(), p, displayer );
TabData tab = displayer.getTabAt( p );
if( null == tab )
return;
final int tabIndex = tabModel.indexOf( tab );
//popup menu
TabActionEvent tae = new TabActionEvent( this, TabbedContainer.COMMAND_POPUP_REQUEST, tabIndex, e );
postActionEvent( tae );
}
}