package org.limewire.ui.swing.properties; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Insets; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import org.jdesktop.application.Resource; import org.jdesktop.swingx.painter.RectanglePainter; import org.limewire.ui.swing.action.AbstractAction; import org.limewire.ui.swing.components.FancyTab; import org.limewire.ui.swing.components.FancyTabList; import org.limewire.ui.swing.components.NoOpAction; import org.limewire.ui.swing.components.TabActionMap; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import com.google.inject.Inject; /** * A list of tabs to select different panels containing information * about a given PropertiableFile. */ class FileInfoTabPanel { enum Tabs { GENERAL(I18n.tr("General")), SHARING(I18n.tr("Sharing")), TRANSFERS(I18n.tr("Transfers")), BITTORENT(I18n.tr("Files")); private final String name; Tabs(String name) { this.name = name; } public String getName() { return name; } }; @Resource Color backgroundColor; @Resource Color borderColor; @Resource Font buttonFont; @Resource Color fontColor; @Resource Color fontSelectedColor; @Resource Color selectionTopGradientColor; @Resource Color selectionBottomGradientColor; @Resource Color selectionBorderTopColor; @Resource Color selectionBorderBottomColor; @Resource Color highlightBackgroundColor; @Resource Color highlightBorderColor; private final JPanel component; private final FancyTabList tabList; private final List<TabActionMap> tabActionMaps; private final List<FileInfoTabListener> listeners; @Inject public FileInfoTabPanel() { tabActionMaps = new ArrayList<TabActionMap>(); component = new JPanel(new MigLayout("insets 0 5 0 5, gap 0, fill", "", "[28!]")); tabList = new FancyTabList(tabActionMaps); listeners = new CopyOnWriteArrayList<FileInfoTabListener>(); GuiUtils.assignResources(this); init(); } private void init() { component.setBackground(backgroundColor); component.setBorder(BorderFactory.createMatteBorder(1,0,1,0, borderColor)); tabList.setSelectionPainter(new CategoryTabPainter(selectionTopGradientColor, selectionBottomGradientColor, selectionBorderTopColor, selectionBorderBottomColor)); tabList.setHighlightPainter(new CategoryTabPainter(highlightBackgroundColor, highlightBackgroundColor, highlightBorderColor, highlightBorderColor)); tabList.setTabTextColor(fontColor); tabList.setTextFont(buttonFont); tabList.setTabTextSelectedColor(fontSelectedColor); tabList.setUnderlineEnabled(false); component.add(tabList, "growy"); } /** * Returns the JComponent that displays the tabs. */ public JComponent getComponent() { return component; } /** * Adds a listener to the tabs that is notified when a new tab is selected. */ public void addSearchTabListener(FileInfoTabListener listener) { listeners.add(listener); } /** * Replaces the current list of tabs with this list. The tabs * are added in order of index of the list. */ public void setTabs(List<Tabs> tabs) { tabActionMaps.clear(); for(Tabs tab: tabs) { addTab(tab); } tabList.setTabActionMaps(tabActionMaps); } private void addTab(Tabs tab) { FileInfoTabAction action = new FileInfoTabAction(tab); if(tab == Tabs.GENERAL) { action.putValue(Action.SELECTED_KEY, true); } TabActionMap map = newTabActionMap(action); tabActionMaps.add(map); } private TabActionMap newTabActionMap(FileInfoTabAction action) { Action moreText = new NoOpAction(); moreText.putValue(Action.NAME, ""); return new TabActionMap(action, null, moreText, null); } static interface FileInfoTabListener { void tabSelected(Tabs tab); } private class FileInfoTabAction extends AbstractAction { private final Tabs tab; public FileInfoTabAction(Tabs tab) { super(tab.getName()); this.tab = tab; } Tabs getTab() { return tab; } @Override public void actionPerformed(ActionEvent e) { for(FileInfoTabListener listener : listeners) { listener.tabSelected(tab); } } } /** * Creates a Painter used to render the selected category tab. */ //TODO: duplicate code of LibraryFilterPanel private static class CategoryTabPainter extends RectanglePainter<FancyTab> { public CategoryTabPainter(Color topGradient, Color bottomGradient, Color topBorder, Color bottomBorder) { setFillPaint(new GradientPaint(0, 0, topGradient, 0, 1, bottomGradient)); setBorderPaint(new GradientPaint(0, 0, topBorder, 0, 1, bottomBorder)); setRoundHeight(10); setRoundWidth(10); setRounded(true); setPaintStretched(true); setInsets(new Insets(2,0,1,0)); setAntialiasing(true); setCacheable(true); } } }