/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui;
import Sirius.navigator.exception.ExceptionManager;
import Sirius.navigator.method.MethodManager;
import Sirius.navigator.resource.PropertyManager;
import Sirius.navigator.resource.ResourceManager;
import Sirius.navigator.ui.embedded.AbstractEmbeddedComponentsMap;
import Sirius.navigator.ui.embedded.EmbeddedComponent;
import Sirius.navigator.ui.embedded.EmbeddedToolBar;
import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;
import org.apache.log4j.Logger;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
/**
* Eine Toolbar, zu der zur Laufzeit automatisch neue Buttons hinzugefuegt- und entfernt werden koennen.
*
* @version $Revision$, $Date$
*/
public class MutableToolBar extends JToolBar {
//~ Static fields/initializers ---------------------------------------------
private static final Logger logger = Logger.getLogger(MutableToolBar.class);
private static final ResourceManager resources = ResourceManager.getManager();
//~ Instance fields --------------------------------------------------------
private final JToolBar defaultToolBar;
private final JToolBar pluginToolBar;
private final JToolBar rightStickyToolBar;
private final MoveableToolBarsMap moveableToolBars;
private final PluginToolBarsMap pluginToolBars;
private final boolean advancedLayout;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new MutableToolBar object.
*/
public MutableToolBar() {
this(false);
}
/**
* Creates a new MutableToolBar object.
*
* @param advancedLayout DOCUMENT ME!
*/
public MutableToolBar(final boolean advancedLayout) {
super(HORIZONTAL);
this.advancedLayout = advancedLayout;
this.defaultToolBar = new JToolBar(
org.openide.util.NbBundle.getMessage(MutableToolBar.class, "MutableToolBar.defaultToolBar.name"), // NOI18N
HORIZONTAL);
this.pluginToolBar = new JToolBar(HORIZONTAL);
this.rightStickyToolBar = new JToolBar(HORIZONTAL);
this.moveableToolBars = new MoveableToolBarsMap(pluginToolBar);
this.pluginToolBars = new PluginToolBarsMap(pluginToolBar);
this.defaultToolBar.setFloatable(false);
this.defaultToolBar.setRollover(advancedLayout);
this.defaultToolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
this.defaultToolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
this.pluginToolBar.setFloatable(false);
this.pluginToolBar.setRollover(advancedLayout);
this.pluginToolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
this.pluginToolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
this.rightStickyToolBar.setFloatable(false);
this.rightStickyToolBar.setRollover(advancedLayout);
this.rightStickyToolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
this.rightStickyToolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
final JPanel filler = new JPanel();
filler.setOpaque(false);
filler.add(Box.createHorizontalGlue());
this.rightStickyToolBar.add(filler);
this.createDefaultButtons();
this.add(defaultToolBar);
this.add(pluginToolBar);
this.add(rightStickyToolBar);
putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
this.setFloatable(false);
if (advancedLayout) {
this.setBorder(null);
pluginToolBar.setBorder(null);
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void createDefaultButtons() {
if (logger.isDebugEnabled()) {
logger.debug("creating default buttons"); // NOI18N
}
final ActionListener toolBarListener = new ToolBarListener();
final JButton button;
if (PropertyManager.getManager().isEnableSearchDialog()) {
button = new JButton(resources.getIcon("find24.gif")); // NOI18N
button.setToolTipText(org.openide.util.NbBundle.getMessage(
MutableToolBar.class,
"MutableToolBar.createDefaultButtons().search.tooltip")); // NOI18N
button.setActionCommand("search"); // NOI18N
button.setMargin(new Insets(4, 4, 4, 4));
button.addActionListener(toolBarListener);
defaultToolBar.add(button);
}
}
/**
* DOCUMENT ME!
*
* @param toolBar DOCUMENT ME!
*/
public void addMoveableToolBar(final EmbeddedToolBar toolBar) {
toolBar.setRollover(this.advancedLayout);
toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
this.moveableToolBars.add(toolBar);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*/
public void removeMoveableToolBar(final String id) {
this.moveableToolBars.remove(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param visible DOCUMENT ME!
*/
public void setMoveableToolBarVisible(final String id, final boolean visible) {
this.moveableToolBars.setVisible(id, visible);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isMoveableToolBarVisible(final String id) {
return this.moveableToolBars.isVisible(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param enabled DOCUMENT ME!
*/
public void setMoveableToolBarEnabled(final String id, final boolean enabled) {
this.moveableToolBars.setEnabled(id, enabled);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isMoveableToolBarEnabled(final String id) {
return this.moveableToolBars.isEnabled(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isMoveableToolBarAvailable(final String id) {
return this.moveableToolBars.isAvailable(id);
}
/**
* PLUGIN TOOLBARS ---------------------------------------------------------
*
* @param toolBar DOCUMENT ME!
*/
public void addPluginToolBar(final EmbeddedToolBar toolBar) {
toolBar.setRollover(this.advancedLayout);
toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); // NOI18N
toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
this.pluginToolBars.add(toolBar);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*/
public void removePluginToolBar(final String id) {
this.pluginToolBars.remove(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param enabled DOCUMENT ME!
*/
public void setPluginToolBarEnabled(final String id, final boolean enabled) {
this.pluginToolBars.setEnabled(id, enabled);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isPluginToolBarEnabled(final String id) {
return this.pluginToolBars.isEnabled(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isPluginToolBarAvailable(final String id) {
return this.pluginToolBars.isAvailable(id);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public JToolBar getDefaultToolBar() {
return defaultToolBar;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public JToolBar getRightStickyToolBar() {
return rightStickyToolBar;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ToolBarListener implements ActionListener {
//~ Methods ------------------------------------------------------------
/**
* Invoked when an action occurs.
*
* @param e DOCUMENT ME!
*/
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getActionCommand().equals("exit")) // NOI18N
{
if (ExceptionManager.getManager().showExitDialog(ComponentRegistry.getRegistry().getMainWindow())) {
logger.info("closing program"); // NOI18N
ComponentRegistry.getRegistry().getNavigator().dispose();
System.exit(0);
}
} else if (e.getActionCommand().equals("plugin")) // NOI18N
{
MethodManager.getManager().showPluginManager();
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class PluginToolBarsMap extends AbstractEmbeddedComponentsMap {
//~ Instance fields ----------------------------------------------------
protected final JToolBar toolbar;
//~ Constructors -------------------------------------------------------
/**
* Creates a new PluginToolBarsMap object.
*
* @param toolbar DOCUMENT ME!
*/
private PluginToolBarsMap(final JToolBar toolbar) {
this.toolbar = toolbar;
}
//~ Methods ------------------------------------------------------------
@Override
protected void doAdd(final EmbeddedComponent component) {
if (logger.isDebugEnabled()) {
logger.debug("adding toolbar: '" + component + "'"); // NOI18N
}
if (component instanceof EmbeddedToolBar) {
toolbar.add((EmbeddedToolBar)component);
} else {
logger.error("doAdd(): invalid object type '" + component.getClass().getName()
+ "', 'Sirius.navigator.EmbeddedToolBar' expected"); // NOI18N
}
toolbar.invalidate();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
synchronized (getTreeLock()) {
validateTree();
}
repaint();
}
});
}
@Override
protected void doRemove(final EmbeddedComponent component) {
if (component instanceof EmbeddedToolBar) {
toolbar.remove((EmbeddedToolBar)component);
} else {
logger.error("doRemove(): invalid object type '" + component.getClass().getName()
+ "', 'Sirius.navigator.EmbeddedToolBar' expected"); // NOI18N
}
toolbar.invalidate();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
synchronized (getTreeLock()) {
validateTree();
}
toolbar.repaint();
}
});
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class MoveableToolBarsMap extends PluginToolBarsMap {
//~ Constructors -------------------------------------------------------
/**
* Creates a new MoveableToolBarsMap object.
*
* @param toolbar DOCUMENT ME!
*/
private MoveableToolBarsMap(final JToolBar toolbar) {
super(toolbar);
}
//~ Methods ------------------------------------------------------------
@Override
protected void doSetVisible(final EmbeddedComponent component, final boolean visible) {
if (component.isVisible() != visible) {
super.doSetVisible(component, visible);
if (visible) {
doAdd(component);
} else {
doRemove(component);
}
} else {
logger.warn("unexpected call to 'setVisible()': '" + visible + "'"); // NOI18N
}
}
}
}