/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.action; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Widget; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.ui.ModelUIMessages; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class CommandBar { public static final String SEPARATOR = "_SEPARATOR_"; //$NON-NLS-1$ public static String FILL = " "; //$NON-NLS-1$ CommandBarListener listener = null; Composite control = null; CommandBarLayout layout = new CommandBarLayout(); ArrayList<ButtonDescriptor> buttons = new ArrayList<ButtonDescriptor>(); String defaultCommand = null; boolean isMnemonicEnabled = false; IWidgetSettings settings = null; public void dispose() { if (buttons!=null) buttons.clear(); buttons = null; listener = null; if(control != null) { if(!control.isDisposed()) control.dispose(); control = null; } } public void addCommandBarListener(CommandBarListener listener) { this.listener = listener; } public CommandBarLayout getLayout() { return layout; } public void setLayout(CommandBarLayout layout) { this.layout = layout; } public void setWidgetSettings(IWidgetSettings settings) { this.settings = settings; } public Control createControl(Composite parent) { if (layout.asToolBar) { control = new ToolBar(parent, SWT.FLAT | layout.direction); } else { control = new Composite(parent, SWT.NONE); //control.setBackground(parent.getBackground()); control.setBackgroundMode(SWT.INHERIT_DEFAULT); control.setLayout(layout); } update(); return control; } public Control getControl() { return control; } /** * * @param commands (translatable) */ public void setCommands(String[] commands) { ButtonDescriptor d = null; for (int i = 0; i < commands.length; i++) { if(buttons.size() > i) { d = (ButtonDescriptor)buttons.get(i); } else { d = new ButtonDescriptor(); buttons.add(d); } d.command = commands[i]; // bugfix:Issue # 6167. Try find default button by name if (ModelUIMessages.CommandBar_OK.equalsIgnoreCase(commands[i]) || ModelUIMessages.CommandBar_Finish.equalsIgnoreCase(commands[i]) || ModelUIMessages.CommandBar_Next.equalsIgnoreCase(commands[i])|| ModelUIMessages.CommandBar_NextArrow.equalsIgnoreCase(commands[i]) || ModelUIMessages.CommandBar_Run.equalsIgnoreCase(commands[i])) { this.defaultCommand = commands[i]; } } for (int i = buttons.size() - 1; i >= commands.length; i--) { d = (ButtonDescriptor)buttons.remove(i); d.dispose(); } } public void setMnemonicEnabled(boolean b) { if(isMnemonicEnabled == b) return; isMnemonicEnabled = b; update(); } public void setImage(String command, Image image) { ButtonDescriptor d = getButtonForCommand(command); if(d != null) d.image = image; } public void setEnabled(String command, boolean enabled) { ButtonDescriptor d = getButtonForCommand(command); if(d != null) d.setEnabled(enabled); } public void disable() { for (int i = 0; i < buttons.size(); i++) { ButtonDescriptor d = getButtonAt(i); d.setEnabled(false); } } public boolean isEnabled(String command) { ButtonDescriptor d = getButtonForCommand(command); return (d != null && d.enabled); } public void rename(String oldCommand, String newCommand) { ButtonDescriptor d = getButtonForCommand(oldCommand); if(d != null) d.rename(newCommand); } public void setDefaultCommand(String command) { this.defaultCommand = command; update(); } ButtonDescriptor getButtonForCommand(String command) { for (int i = 0; i < buttons.size(); i++) { ButtonDescriptor d = getButtonAt(i); if(command.equals(d.command)) return d; } return null; } public void update() { for (int i = 0; i < buttons.size(); i++) getButtonAt(i).update(); } ButtonDescriptor getButtonAt(int i) { return (i < 0 || i >= buttons.size()) ? null : (ButtonDescriptor)buttons.get(i); } class ButtonDescriptor implements SelectionListener { Widget button; String command; Image image = null; boolean enabled = true; public void createControl(Composite parent) { if(button != null) button.dispose(); if (!SEPARATOR.equals(command)) { if (layout.asToolBar) { button = new ToolItem((ToolBar)parent, SWT.PUSH); ((ToolItem)button).addSelectionListener(this); } else { int style = (settings == null) ? SWT.PUSH : settings.getStyle("Button.Style"); //$NON-NLS-1$ if (style == SWT.DEFAULT) style = SWT.NONE; if (style == 0) style = SWT.PUSH; button = new Button(parent, style); if(settings != null) { Color bg = settings.getColor("Button.Background"); //$NON-NLS-1$ Color fg = settings.getColor("Button.Foreground"); //$NON-NLS-1$ Font font = settings.getFont("Button.Font"); //$NON-NLS-1$ ((Control)button).setBackground(bg); ((Control)button).setForeground(fg); ((Control)button).setFont(font); } ((Button)button).addSelectionListener(this); } _update(); } else { if (layout.asToolBar) { button = new ToolItem((ToolBar)parent, SWT.SEPARATOR); } } } public void update() { if(button == null || button.isDisposed()) { if(control != null && !control.isDisposed()) { createControl(control); } return; } else _update(); } protected void _update() { _updateCommand(); _updateEnabled(); if (image != null) { if (layout.asToolBar) { ((ToolItem)button).setImage(image); } else { ((Button)button).setImage(image); } } _updateDefault(); } void _updateEnabled() { if (button != null && !button.isDisposed()) { if (layout.asToolBar) { ((ToolItem)button).setEnabled(enabled); } else { ((Button)button).setEnabled(enabled); } } } void _updateCommand() { if(button == null || button.isDisposed()) return; if(layout.iconsOnly) { if (layout.asToolBar) { ((ToolItem)button).setToolTipText(getText(false)); ((ToolItem)button).setText(""); //$NON-NLS-1$ } else { ((Button)button).setToolTipText(getText(false)); ((Button)button).setText(""); //$NON-NLS-1$ } if(image != null) { if (layout.asToolBar) { ((ToolItem)button).setImage(image); } else { ((Button)button).setImage(image); } } } else { if (layout.asToolBar) { ((ToolItem)button).setToolTipText(null); ((ToolItem)button).setText(getText(isMnemonicEnabled)); } else { ((Button)button).setToolTipText(null); ((Button)button).setText(getText(isMnemonicEnabled)); } } } String getText(boolean withMnemonic) { if(withMnemonic) return command; int i = command.indexOf('&'); return (i < 0) ? command : command.substring(0, i) + command.substring(i + 1); } void _updateDefault() { if (command.equalsIgnoreCase(defaultCommand) && button != null && !button.isDisposed()) { if (!layout.asToolBar) { ((Button)button).getShell().setDefaultButton((Button)button); } } } public void setEnabled(boolean enabled) { if(this.enabled == enabled) return; this.enabled = enabled; _updateEnabled(); } public void rename(String newCommand) { if(newCommand.equals(command)) return; this.command = newCommand; _updateCommand(); } public void setDefault() { _updateDefault(); } public void widgetSelected(SelectionEvent e) { if(listener != null) { try { listener.action(command); } catch (XModelException e1) { ModelUIPlugin.getPluginLog().logError(e1); } } } public void widgetDefaultSelected(SelectionEvent e) {} public void dispose() { if(button == null || button.isDisposed()) return; button.dispose(); button = null; } } }