// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: BBToolBarBuilder.java,v 1.46 2007/09/18 12:54:23 spyromus Exp $
//
package com.salas.bb.views.mainframe;
import com.jgoodies.looks.BorderStyle;
import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.windows.WindowsLookAndFeel;
import com.jgoodies.uif.action.ActionManager;
import com.jgoodies.uif.builder.ToolBarBuilder;
import com.jgoodies.uif.util.Modes;
import com.jgoodies.uif.util.SystemUtils;
import com.salas.bb.core.actions.ActionsTable;
import javax.swing.*;
import java.awt.*;
import java.util.LinkedList;
/**
* Builder of application tool-bar.
*/
public class BBToolBarBuilder
{
private static ToolbarLayout layout;
/**
* Create the builder.
*/
static
{
layout = new ToolbarLayout();
// Default layout
layout.appendAction(ActionsTable.CMD_GUIDE_RELOAD_ALL_TB);
layout.appendAction(ActionsTable.CMD_SYNC_FULL_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_ARTICLE_GOTO_NEXT_UNREAD_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_ARTICLE_BROWSE_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_GUIDE_ADD_TB);
layout.appendAction(ActionsTable.CMD_FEED_SUBSCRIBE_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_FEED_ADD_SMART_FEED_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_BB_TAGS_TB);
layout.appendLargeGap();
layout.appendAction(ActionsTable.CMD_BB_SEARCH_TB);
layout.appendAction(ActionsTable.CMD_BB_WHATS_HOT_TB);
layout.appendAction(ActionsTable.CMD_BB_STATISTICS_TB);
}
/**
* Returns the toolbar layout.
*
* @return layout.
*/
public static ToolbarLayout getLayout()
{
return layout;
}
/**
* Creates, configures, and composes the tool bar.
*
* @return toolbar component.
*/
public JToolBar buildToolBar()
{
ToolBarBuilder tbldr = new ToolBarBuilder("ToolBar");
setToolBarSettings(tbldr);
setToolBarJGoodiesSettings(tbldr);
addLeftButtonSet(tbldr);
return tbldr.getToolBar();
}
/**
* Add Toolbar buttons on the left part of the ToolBar.
*
* @param bldr builder.
*/
private void addLeftButtonSet(ToolBarBuilder bldr)
{
bldr.addGap();
layout.build(bldr);
bldr.addGap();
}
/**
* Creates and answers a button which is suitable for use in a tool bar.
*
* @param action action.
*
* @return button.
*/
private static BBToolBarButton createToolbarButton(Action action)
{
BBToolBarButton toolBarBtn = new BBToolBarButton(action);
toolBarBtn.setWideMarginMode(Modes.ALWAYS);
return toolBarBtn;
}
/**
* JGoodies specific setup.
*
* @param bldr builder.
*/
private void setToolBarJGoodiesSettings(ToolBarBuilder bldr)
{
JToolBar toolBar = bldr.getToolBar();
toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
toolBar.putClientProperty(PlasticLookAndFeel.IS_3D_KEY, Boolean.TRUE);
toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.SINGLE);
// Set a hint so that JGoodies Looks will detect it as being in the header.
// toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
// Unlike the default, use a separator border.
toolBar.putClientProperty(WindowsLookAndFeel.BORDER_STYLE_KEY, BorderStyle.EMPTY);
toolBar.putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.EMPTY);
}
/**
* Placement and other specific configuration.
*
* @param bldr builder.
*/
private void setToolBarSettings(ToolBarBuilder bldr)
{
// Give the toolbar a little breathing space on non-mac
if (!SystemUtils.IS_OS_MAC)
{
bldr.getToolBar().setMargin(new Insets(2, 0, 1, 0));
}
}
/**
* Toolbar layout.
*/
public static class ToolbarLayout
{
private static final String LARGE_GAP = "large-gap";
private java.util.List<Object> layout = new LinkedList<Object>();
/**
* Clears the layout.
*/
public void clear()
{
layout.clear();
}
/**
* Appends a large gap to the end of the layout.
*/
public void appendLargeGap()
{
layout.add(LARGE_GAP);
}
/**
* Appends the action to the end of the layout.
*
* @param action action.
*/
public void appendAction(Action action)
{
layout.add(action);
}
/**
* Appends the action to the end of the layout.
*
* @param action action.
*/
public void appendAction(String action)
{
layout.add(action);
}
/**
* Builds the toolbar from the layout.
*
* @param builder builder.
*/
void build(ToolBarBuilder builder)
{
for (Object el : layout)
{
if (el instanceof Action)
{
builder.add(createToolbarButton((Action)el));
} else if (el == LARGE_GAP)
{
builder.addLargeGap();
} else if (el instanceof String)
{
builder.add(createToolbarButton(ActionManager.get((String)el)));
}
}
}
}
}