00001 package edu.stanford.hci.r3.util.components.ribbons;
00002
00003 import java.awt.BorderLayout;
00004 import java.awt.CardLayout;
00005 import java.awt.Color;
00006 import java.awt.Component;
00007 import java.awt.GradientPaint;
00008 import java.awt.Graphics;
00009 import java.awt.Graphics2D;
00010 import java.util.ArrayList;
00011 import java.util.HashMap;
00012 import java.util.List;
00013
00014 import javax.swing.BoxLayout;
00015 import javax.swing.JPanel;
00016
00017 import edu.stanford.hci.r3.util.graphics.GraphicsUtils;
00018 import edu.stanford.hci.r3.util.layout.StackedLayout;
00019
00034 public class RibbonToolbar extends JPanel implements RibbonConstants {
00035
00039 private final CardLayout cardLayout = new CardLayout();
00040
00044 private JPanel categories;
00045
00049 private HashMap<String, JPanel> categoriesToPanels = new HashMap<String, JPanel>();
00050
00054 private List<RibbonCategoryLabel> categoryTabList = new ArrayList<RibbonCategoryLabel>();
00055
00059 private List<RibbonPanel> tools = new ArrayList<RibbonPanel>();
00060
00064 private JPanel toolsPanel;
00065
00069 public RibbonToolbar() {
00070 setLayout(new BorderLayout());
00071 add(getCategories(), BorderLayout.NORTH);
00072 add(getTools(), BorderLayout.CENTER);
00073 }
00074
00078 public void addCategories(String... categoryNames) {
00079 for (String name : categoryNames) {
00080 addCategory(name);
00081 }
00082 }
00083
00090 public void addCategory(String categoryName) {
00091
00092 final RibbonCategoryLabel labelledTab = new RibbonCategoryLabel(categoryName, this);
00093 categories.add(labelledTab, "LeftTall");
00094 categoryTabList.add(labelledTab);
00095
00096
00097 if (categoryTabList.size() == 1) {
00098 labelledTab.setSelected(true);
00099 } else {
00100 labelledTab.setSelected(false);
00101 }
00102
00103 final JPanel categoryPanel = getNewCategoryPanel();
00104
00105
00106 getTools().add(categoryName, categoryPanel);
00107 labelledTab.setCardLayoutInfo(cardLayout, getTools());
00108
00109
00110 categoriesToPanels.put(categoryName, categoryPanel);
00111 }
00112
00117 public void addToolsToCategoryPanel(String panelName, List<RibbonPanel> panels) {
00118 for (RibbonPanel rp : panels) {
00119 addToolToCategoryPanel(panelName, rp);
00120 }
00121 }
00122
00130 private void addToolToCategoryPanel(String categoryName, RibbonPanel rp) {
00131 final JPanel panel = categoriesToPanels.get(categoryName);
00132
00133 panel.add(rp);
00134 panel.invalidate();
00135 }
00136
00143 private Component getCategories() {
00144 if (categories == null) {
00145 categories = new JPanel() {
00149 final GradientPaint gradient = new GradientPaint(0, 0, new Color(202, 198, 195),
00150 getWidth(), 0, new Color(234, 234, 234), false);
00151
00155 protected void paintComponent(Graphics g) {
00156 super.paintComponent(g);
00157 final Graphics2D g2d = (Graphics2D) g;
00158 g2d.setRenderingHints(GraphicsUtils.getBestRenderingHints());
00159 g2d.setPaint(gradient);
00160 g2d.fillRect(0, 0, getWidth(), getHeight());
00161 }
00162
00163 };
00164 categories.setLayout(new StackedLayout(StackedLayout.HORIZONTAL));
00165 }
00166 return categories;
00167 }
00168
00175 private JPanel getNewCategoryPanel() {
00176 final JPanel jp = new JPanel() {
00177
00181 protected void paintComponent(Graphics g) {
00182 super.paintComponent(g);
00183
00184 final Graphics2D g2d = (Graphics2D) g;
00185
00186 g2d.setColor(HEADER_COLOR);
00187 g2d.fillRect(0, 0, getWidth(), HEADER_HEIGHT);
00188
00189
00190 final GradientPaint midToBottomGradient = new GradientPaint(0, HEADER_HEIGHT,
00191 PANEL_BEGIN_COLOR, 0, getHeight(), PANEL_END_COLOR, false);
00192
00193 g2d.setPaint(midToBottomGradient);
00194 g2d.fillRect(0, HEADER_HEIGHT, getWidth(), getHeight());
00195 }
00196 };
00197
00198 jp.setLayout(new BoxLayout(jp, BoxLayout.X_AXIS));
00199 return jp;
00200 }
00201
00208 private JPanel getTools() {
00209 if (toolsPanel == null) {
00210 toolsPanel = new JPanel();
00211 toolsPanel.setLayout(cardLayout);
00212 }
00213 return toolsPanel;
00214 }
00215
00222 public void registerTool(RibbonPanel rp) {
00223 tools.add(rp);
00224 }
00225
00231 public void setSelectedLabel(RibbonCategoryLabel labelToSelect) {
00232 for (RibbonCategoryLabel tab : categoryTabList) {
00233 if (tab.equals(labelToSelect)) {
00234 tab.setSelected(true);
00235 } else {
00236 tab.setSelected(false);
00237 }
00238 }
00239 }
00240 }