/* 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.HashMap;
import java.util.Map;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.Alignment;
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.Embedded;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.CellStyleGenerator;
import com.vaadin.ui.themes.Reindeer;
/**
* Generic component for a popup window that allows to display
* multiple selection tabs on the left, and displays
* configured components matching those the selection on the right.
*
* Note: For best visual results, the components on the right
* should be of fixed size, since the window width and heigh
* is calculated based on these components
*
* @author Frederik Heremans
* @author Joram Barrez
*/
public class TabbedSelectionWindow extends PopupWindow {
private static final long serialVersionUID = 1L;
protected I18nManager i18nManager;
protected HorizontalLayout windowLayout;
protected Table selectionTable;
protected String currentSelection;
protected Component currentComponent;
protected Map<String, Component> components = new HashMap<String, Component>();
protected Map<String, ClickListener> listeners = new HashMap<String, Button.ClickListener>();
protected GridLayout selectedComponentLayout;
protected Button okButton;
public TabbedSelectionWindow(String title) {
this.i18nManager = ExplorerApp.get().getI18nManager();
initWindow(title);
initWindowLayout();
initSelectionTable();
initComponentLayout();
initActions();
}
protected void initWindow(String title) {
setCaption(title);
center();
setModal(true);
addStyleName(Reindeer.WINDOW_LIGHT);
}
protected void initWindowLayout() {
windowLayout = new HorizontalLayout();
windowLayout.setSpacing(false);
windowLayout.setMargin(true);
windowLayout.setSizeFull();
setContent(windowLayout);
}
protected void initComponentLayout() {
selectedComponentLayout = new GridLayout(1,2);
selectedComponentLayout.setSizeFull();
selectedComponentLayout.setMargin(true);
selectedComponentLayout.setSpacing(true);
selectedComponentLayout.addStyleName(ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_DETAIL);
windowLayout.addComponent(selectedComponentLayout);
windowLayout.setExpandRatio(selectedComponentLayout, 1.0f);
selectedComponentLayout.setRowExpandRatio(0, 1.0f);
selectedComponentLayout.setColumnExpandRatio(0, 1.0f);
}
protected void initActions() {
okButton = new Button(i18nManager.getMessage(Messages.BUTTON_OK));
selectedComponentLayout.addComponent(okButton, 0, 1);
okButton.setEnabled(false);
okButton.addListener(new ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
listeners.get(currentSelection).buttonClick(event);
close();
}
});
selectedComponentLayout.setComponentAlignment(okButton, Alignment.BOTTOM_RIGHT);
}
protected void initSelectionTable() {
selectionTable = new Table();
selectionTable.setSizeUndefined();
selectionTable.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN);
selectionTable.setSelectable(true);
selectionTable.setImmediate(true);
selectionTable.setNullSelectionAllowed(false);
selectionTable.setWidth(150, UNITS_PIXELS);
selectionTable.setHeight(100, UNITS_PERCENTAGE);
selectionTable.setCellStyleGenerator(new CellStyleGenerator() {
private static final long serialVersionUID = 1L;
public String getStyle(Object itemId, Object propertyId) {
if("name".equals(propertyId)) {
return ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_LIST_LAST_COLUMN;
}
return null;
}
});
selectionTable.addStyleName(ExplorerLayout.STYLE_RELATED_CONTENT_CREATE_LIST);
selectionTable.addContainerProperty("type", Embedded.class, null);
selectionTable.setColumnWidth("type", 22);
selectionTable.addContainerProperty("name", String.class, null);
// Listener to switch to the selected component
selectionTable.addListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
public void valueChange(ValueChangeEvent event) {
String name = (String) event.getProperty().getValue();
if (name != null) {
currentSelection = name;
currentComponent = components.get(name);
selectedComponentLayout.removeComponent(selectedComponentLayout.getComponent(0, 0));
if (currentComponent != null) {
currentComponent.setSizeFull();
selectedComponentLayout.addComponent(currentComponent, 0, 0);
okButton.setEnabled(true);
} else {
okButton.setEnabled(false);
}
}
}
});
windowLayout.addComponent(selectionTable);
}
/**
* @param icon The 16x16 icon that will be displayed on the left in the selection table.
* @param name The name that will be shown in the selection table
* @param component The component that is selected when the item in the selection table is clicked.
* @param clickListener The listener that will be attached to the OK button displayed beneath
* the component.
*/
public void addSelectionItem(Embedded icon, String name, Component component, ClickListener clickListener) {
Item item = selectionTable.addItem(name);
item.getItemProperty("type").setValue(icon);
item.getItemProperty("name").setValue(name);
components.put(name, component);
listeners.put(name, clickListener);
}
}