package tabbed;
/*
* VerticalTabs.java
*/
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicGraphicsUtils;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
public class VerticalTabs extends JFrame{
public VerticalTabs(){
super("VerticalTabs");
setSize(500,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
add(createTabbedPane(JTabbedPane.RIGHT));
setVisible(true);
}
private JTabbedPane createTabbedPane(int tabPlacement){
JTabbedPane tabbedpane = new JTabbedPane();
tabbedpane.setTabPlacement(tabPlacement);
tabbedpane.setUI(new TabsUI());
tabbedpane.addTab("panel 1", new JLabel("panel 1"));
tabbedpane.addTab("panel 2", new JLabel("panel 2"));
tabbedpane.addTab("panel 3", new JLabel("panel 3"));
return tabbedpane;
}
private class TabsUI extends BasicTabbedPaneUI{
public TabsUI(){super();}
private Image getVerticalImage(int tabIndex){
ImageIcon iconeNormale = (ImageIcon)tabPane.getIconAt(tabIndex);
int iconeWidth = (iconeNormale!=null)?iconeNormale.getIconHeight():0;
int iconeHeight = (iconeNormale!=null)?iconeNormale.getIconWidth():0;
String titre = tabPane.getTitleAt(tabIndex);
FontMetrics metrics = getFontMetrics();
int titreWidth = (titre!=null)?metrics.stringWidth(titre):0;
int titreHeight = (titre!=null)?metrics.getHeight():0;
int height = iconeWidth+titreWidth+textIconGap+1;
int width = Math.max(iconeHeight,titreHeight);
boolean isSelected = (tabPane.getSelectedIndex()==tabIndex);
int tabPlacement = tabPane.getTabPlacement();
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
if(tabPlacement==JTabbedPane.LEFT){g2.translate(0,height);g2.rotate(-Math.PI/2);} else{g2.translate(width,0);g2.rotate(Math.PI/2);}
Color background = (isSelected)?UIManager.getColor("TabbedPane.selected"):
tabPane.getBackgroundAt(tabIndex);
g2.setColor(background);g2.fillRect(0,0,height,width);
if(iconeNormale!=null)g2.drawImage(iconeNormale.getImage(),0,0,null);
if(titre!=null){
g2.setFont(metrics.getFont());
g2.setColor(tabPane.getForegroundAt(tabIndex));
int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
BasicGraphicsUtils.drawStringUnderlineCharAt(g2,titre, mnemIndex
,iconeWidth+textIconGap,metrics.getAscent());
}
g2.dispose();
return image;
}
private boolean isBottomOrTop(){
int tabPlacement = tabPane.getTabPlacement();
return tabPlacement==JTabbedPane.TOP||tabPlacement==JTabbedPane.BOTTOM;
}
protected int calculateTabHeight(int tabPlacement,int tabIndex,int fontHeight){
if(isBottomOrTop()){
return super.calculateTabHeight(tabPlacement,tabIndex,fontHeight);
}
return super.calculateTabWidth(tabPlacement,tabIndex,getFontMetrics());
}
protected int calculateTabWidth(int tabPlacement,int tabIndex,FontMetrics metrics){
if(isBottomOrTop()){
return super.calculateTabWidth(tabPlacement,tabIndex,metrics);
}
return getVerticalImage(tabIndex).getWidth(null);
}
protected void paintText(Graphics g, int tabPlacement, Font font
, FontMetrics metrics, int tabIndex, String title
, Rectangle textRect, boolean isSelected){
if(isBottomOrTop()){
super.paintText(g,tabPlacement,font,metrics,tabIndex,title,textRect,isSelected);
}else{
Image image = getVerticalImage(tabIndex);
Rectangle r = getTabBounds(tabPane,tabIndex);
Insets insets = getTabAreaInsets(tabPlacement);
int dx = r.x+insets.top; int dy = r.y;
if(tabPlacement==JTabbedPane.LEFT){dy+=insets.left;} else{dy+=insets.right;}
g.drawImage(image,dx,dy,null);
}
}
protected void paintIcon(Graphics g, int tabPlacement, int tabIndex,
Icon icon, Rectangle iconRect, boolean isSelected){
if(!isBottomOrTop()){return;}
super.paintIcon(g,tabPlacement,tabIndex,icon,iconRect,isSelected);
}
}
public static void main(String[] args){new VerticalTabs();}
}