/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.explorer.ui.custom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.explorer.ui.custom.ToolbarEntry.ToolbarCommand;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
/**
* Container for holding {@link ToolbarEntry}s.
*
* @author Frederik Heremans
* @author Joram Barrez
*/
public class ToolBar extends HorizontalLayout {
private static final long serialVersionUID = 7957488256766569264L;
protected Map<String, ToolbarEntry> entryMap;
protected ToolbarEntry currentEntry;
protected List<Button> actionButtons;
protected List<Component> additionalComponents;
public ToolBar() {
entryMap = new HashMap<String, ToolbarEntry>();
actionButtons = new ArrayList<Button>();
additionalComponents = new ArrayList<Component>();
setWidth("100%");
setHeight(36, UNITS_PIXELS);
addStyleName(ExplorerLayout.STYLE_TOOLBAR);
setSpacing(true);
setMargin(false, true, false, true);
// Add label to fill excess space
Label spacer = new Label();
spacer.setContentMode(Label.CONTENT_XHTML);
spacer.setValue(" ");
addComponent(spacer);
setExpandRatio(spacer, 1.0f);
}
/**
* Add a new entry to the tool bar.
*/
public ToolbarEntry addToolbarEntry(String key, String title, ToolbarCommand command) {
if(entryMap.containsKey(key)) {
throw new IllegalArgumentException("Toolbar already contains entry for key: " + key);
}
ToolbarEntry entry = new ToolbarEntry(key, title);
if(command != null) {
entry.setCommand(command);
}
entryMap.put(key, entry);
addEntryComponent(entry);
return entry;
}
/**
* Add a new entry, which displays a pop-up-list when clicked. Items of that list can be added
* on returned {@link ToolbarPopupEntry} instance.
*/
public ToolbarPopupEntry addPopupEntry(String key, String title) {
if(entryMap.containsKey(key)) {
throw new IllegalArgumentException("Toolbar already contains entry for key: " + key);
}
ToolbarPopupEntry entry = new ToolbarPopupEntry(key, title);
entryMap.put(key, entry);
addEntryComponent(entry);
return entry;
}
/**
* Add a button to the toolbar. The buttons are rendered on the right of the
* toolbar.
*/
public void addButton(Button button) {
button.addStyleName(ExplorerLayout.STYLE_TOOLBAR_BUTTON);
actionButtons.add(button);
// Button is added after the spacer
addComponent(button);
setComponentAlignment(button, Alignment.MIDDLE_RIGHT);
}
public void removeAllButtons() {
for(Button b : actionButtons) {
removeComponent(b);
}
}
public void addAdditionalComponent(Component component) {
additionalComponents.add(component);
addComponent(component);
}
public void removeAllAdditionalComponents() {
for(Component c : additionalComponents) {
removeComponent(c);
}
}
public long getCount(String key) {
ToolbarEntry toolbarEntry = entryMap.get(key);
if(toolbarEntry == null) {
throw new IllegalArgumentException("Toolbar doesn't contain an entry for key: " + key);
}
return toolbarEntry.getCount();
}
/**
* Update the count field on the entry with the given key.
*/
public void setCount(String key, Long count) {
ToolbarEntry toolbarEntry = entryMap.get(key);
if(toolbarEntry == null) {
throw new IllegalArgumentException("Toolbar doesn't contain an entry for key: " + key);
}
toolbarEntry.setCount(count);
}
/**
* Gets the entry for the given key. Returns null when entry is not present for the given key.
*/
public ToolbarEntry getEntry(String key) {
return entryMap.get(key);
}
/**
* Set the entry active with the given key. Active entries will
* have alternative style applied to them.
*/
public synchronized void setActiveEntry(String key) {
if(currentEntry != null) {
currentEntry.setActive(false);
}
currentEntry = entryMap.get(key);
if(currentEntry != null) {
currentEntry.setActive(true);
}
}
protected void addEntryComponent(ToolbarEntry entry) {
addComponent(entry, getComponentCount() - 1 - actionButtons.size());
setComponentAlignment(entry, Alignment.MIDDLE_LEFT);
}
}