/*
* Copyright 2009-2014 the original author or authors.
*
* 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.jdal.vaadin.ui;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.jdal.auth.AuthService;
import org.jdal.vaadin.ui.table.ButtonListener;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.ui.AbstractOrderedLayout;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
/**
* A Component with button menu.
*
* @author Jose Luis Martin
* @since 2.0
*/
public class ButtonBar extends CustomComponent implements ClickListener {
public static final int VERTICAL = 0;
public static final int HORIZONTAL = 1;
private int layoutType = HORIZONTAL;
private AbstractOrderedLayout menu;
private Component main;
private List<ButtonListener> actions = new LinkedList<ButtonListener>();
private List<Button> buttons = new LinkedList<Button>();
private boolean nativeButtons = true;
@Autowired(required=false)
private AuthService authService;
public ButtonBar() {
addStyleName("jd-button-bar");
}
@PostConstruct
public void init() {
if (layoutType == HORIZONTAL) {
this.menu = new HorizontalLayout();
}
else {
this.menu = new VerticalLayout();
}
for (ButtonListener action : actions) {
String accessExpression = action.getAccess();
if (this.authService != null && accessExpression != null) {
if (this.authService.checkAccess(action, accessExpression, null))
addAction(action);
}
else {
addAction(action);
}
}
setCompositionRoot(this.menu);
}
/**
* Add a new {@link Button} to bar from a {@link ButtonListener}
* @param action
*/
protected void addAction(ButtonListener action) {
Button button = createButton(action);
button.addClickListener(this);
this.menu.addComponent(button);
this.buttons.add(button);
}
/**
* Create a {@link Button} from a {@link ButtonListener}
* @param action button listener to use
* @return a new button.
*/
private Button createButton(ButtonListener action) {
Button button = this.nativeButtons ? FormUtils.newNativeButton(action) : FormUtils.newButton(action);
button.addStyleName(createButtonStyleName(action.getCaption()));
return button;
}
/**
* Create a css style name from caption.
* @param caption the caption
* @return the button style name.
*/
protected String createButtonStyleName(String caption) {
if (caption != null)
return "button-" + caption.replace(' ', '-');
return null;
}
@Override
public void buttonClick(ClickEvent event) {
Button selected = event.getButton();
selected.addStyleName("selected");
for (Button b : buttons) {
if (!b.equals(event.getButton()))
b.removeStyleName("selected");
}
}
/**
* Simulates a button click on first button with provided caption
* @param caption caption to search.
*/
public void click(String caption) {
if (caption == null && buttons.size() > 0) {
Button button = buttons.get(0);
button.click();
return;
}
Button button = getButtonByCaption(caption);
if (button != null)
button.click();
}
/**
* Find a button by caption
* @param caption caption to search
* @return the button, null if none
*/
private Button getButtonByCaption(String caption) {
for (Button b : buttons) {
if (caption.equals(b.getCaption()))
return b;
}
return null;
}
public int getLayoutType() {
return layoutType;
}
public void setLayoutType(int layoutType) {
this.layoutType = layoutType;
}
public Component getMain() {
return main;
}
public void setMain(Component main) {
this.main = main;
}
public List<ButtonListener> getActions() {
return actions;
}
public void setActions(List<ButtonListener> actions) {
this.actions = actions;
}
public boolean isNativeButtons() {
return nativeButtons;
}
public void setNativeButtons(boolean useNativeButtons) {
this.nativeButtons = useNativeButtons;
}
/**
* @return the authService
*/
public AuthService getAuthService() {
return authService;
}
/**
* @param authService the authService to set
*/
public void setAuthService(AuthService authService) {
this.authService = authService;
}
}