/**
*
*/
package uk.ac.lkl.migen.system.expresser.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import uk.ac.lkl.migen.system.expresser.model.Walker;
/**
*
* Implements the holder of tabs within property lists
*
* Tied number walkers recognise instances of this class
* and treat them specially
*
* @author Ken Kahn
*
*/
public class AttributeManifestTabbedPane extends JTabbedPane {
// used to maintain an appropriate width for the manifest
protected Component previouslySelectedComponent = null;
public AttributeManifestTabbedPane() {
super();
ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
adjustWidth();
}
};
addChangeListener(listener);
}
public boolean walkToTiedNumbers(Walker walker) {
int originalSelectedIndex = getSelectedIndex();
int tabCount = getTabCount();
for (int i = 0; i < tabCount; i++) {
setSelectedIndex(i);
Component selectedComponent = getSelectedComponent();
if (selectedComponent instanceof Container &&
!ObjectSetCanvas.walkContainerToTiedNumbers((Container) selectedComponent, walker, false)) {
// restore original index
setSelectedIndex(originalSelectedIndex);
return false;
}
}
// restore original index
setSelectedIndex(originalSelectedIndex);
return true;
}
@Override
public void addNotify() {
super.addNotify();
adjustWidth();
}
protected void adjustWidth() {
// when a tab is selected we change the width
// to fit the contents
Component selectedComponent = getSelectedComponent();
if (selectedComponent == null) {
return;
}
if (selectedComponent == previouslySelectedComponent) {
return;
}
previouslySelectedComponent = selectedComponent;
Dimension preferredSizeOfSelectedComponent = selectedComponent.getPreferredSize();
Container ancestor = getParent();
while (ancestor != null && !(ancestor instanceof AttributeManifest)) {
ancestor = ancestor.getParent();
}
if (ancestor != null) {
int panelWidth = preferredSizeOfSelectedComponent.width;
// 30 is a good amount extra for the attribute manifest container
// was 15 but caused Issue 997
ancestor.setSize(panelWidth+30, ancestor.getHeight());
}
}
}
|