| /******************************************************************************* |
| * Copyright (c) 2012 Rushan R. Gilmullin and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Rushan R. Gilmullin - initial API and implementation |
| *******************************************************************************/ package org.eclipse.osbp.vaadin.optiondialog; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import com.vaadin.data.util.ObjectProperty; |
| import com.vaadin.shared.ui.MarginInfo; |
| import com.vaadin.ui.Alignment; |
| import com.vaadin.ui.Button; |
| import com.vaadin.ui.Button.ClickEvent; |
| import com.vaadin.ui.Component; |
| import com.vaadin.ui.HorizontalLayout; |
| import com.vaadin.ui.Label; |
| import com.vaadin.ui.UI; |
| import com.vaadin.ui.VerticalLayout; |
| import com.vaadin.ui.Window; |
| |
| public class OptionDialog extends Window { |
| |
| public enum OptionsAlign { |
| LEFT, RIGHT, CENTER |
| } |
| |
| public static interface OptionListener { |
| void optionSelected(OptionDialog optionDialog, int optionId); |
| } |
| |
| public static interface ComponentProvider extends OptionListener { |
| Component getComponent(OptionDialog optionDialog); |
| |
| void setMessage(String message); |
| } |
| |
| private OptionListener optionListener; |
| private String msg; |
| private boolean modal = true; |
| |
| public static final OptionListener CLOSE_LISTENER = new OptionListener() { |
| |
| @Override |
| public void optionSelected(OptionDialog optionDialog, int optionId) { |
| optionDialog.close(); |
| } |
| }; |
| |
| private ComponentProvider componentProvider = new ComponentProvider() { |
| |
| Label label = new Label(); |
| |
| @Override |
| public void setMessage(String message) { |
| label.setPropertyDataSource(new ObjectProperty<String>(message, |
| String.class)); |
| } |
| |
| @Override |
| public Component getComponent(OptionDialog optionDialog) { |
| return label; |
| } |
| |
| @Override |
| public void optionSelected(OptionDialog optionDialog, int optionId) { |
| |
| } |
| }; |
| |
| private VerticalLayout content; |
| private HorizontalLayout buttons = new HorizontalLayout(); |
| private Map<Button, Integer> button2option = new HashMap<Button, Integer>(); |
| private Map<Integer, Button> option2button = new HashMap<Integer, Button>(); |
| private Float optionButtonWidth; |
| private Unit optionButtonWidthUnit; |
| |
| public OptionDialog() { |
| // msgLabel.setWidth("100%"); |
| // buttons.setWidth("100%"); |
| |
| buttons.setSpacing(true); |
| buttons.setMargin(new MarginInfo(false, true, false, true)); |
| setOptionsPanelHeight(50, Unit.PIXELS); |
| |
| content = new VerticalLayout(); |
| content.setSizeFull(); |
| this.setContent(content); |
| Component component = componentProvider.getComponent(this); |
| content.addComponent(component); |
| content.addComponent(buttons); |
| content.setComponentAlignment(component, Alignment.TOP_CENTER); |
| content.setComponentAlignment(buttons, Alignment.BOTTOM_CENTER); |
| content.setExpandRatio(component, 1); |
| |
| this.center(); |
| this.setWidth("500px"); |
| this.setHeight("100px"); |
| } |
| |
| public String getMessage() { |
| return msg; |
| } |
| |
| public void setMessage(String msg) { |
| this.msg = msg; |
| componentProvider.setMessage(this.msg); |
| } |
| |
| public ComponentProvider getComponentProvider() { |
| return componentProvider; |
| } |
| |
| public Component getComponent() { |
| return this.componentProvider.getComponent(this); |
| } |
| |
| public void setComponentProvider(ComponentProvider componentProvider) { |
| if (componentProvider == null) |
| return; |
| Component newComponent = componentProvider.getComponent(this); |
| if (newComponent != null) { |
| Component oldComponent = this.componentProvider.getComponent(this); |
| this.content.removeComponent(oldComponent); |
| newComponent.setSizeFull(); |
| this.content.addComponent(newComponent, 0); |
| this.content.setExpandRatio(newComponent, 1); |
| this.content.setComponentAlignment(newComponent, |
| Alignment.TOP_CENTER); |
| this.componentProvider = componentProvider; |
| } |
| } |
| |
| public Alignment getOptionButtonsAlignment() { |
| return content.getComponentAlignment(buttons); |
| } |
| |
| public void setOptionButtonsAlignment(OptionsAlign align) { |
| if (align == OptionsAlign.LEFT) |
| content.setComponentAlignment(buttons, Alignment.MIDDLE_LEFT); |
| else if (align == OptionsAlign.RIGHT) |
| content.setComponentAlignment(buttons, Alignment.MIDDLE_RIGHT); |
| else if (align == OptionsAlign.CENTER) |
| content.setComponentAlignment(buttons, Alignment.MIDDLE_CENTER); |
| } |
| |
| public void setOptionsPanelHeight(float height, Unit unit) { |
| buttons.setHeight(height, unit); |
| } |
| |
| public void setOptionButtonsWidth(float width, Unit unit) { |
| this.optionButtonWidth = width; |
| this.optionButtonWidthUnit = unit; |
| Iterator<Component> it = buttons.iterator(); |
| while (it.hasNext()) { |
| Component c = it.next(); |
| if (c instanceof Button) { |
| c.setWidth(width, unit); |
| } |
| } |
| } |
| |
| public void open(UI parentWindow) { |
| parentWindow.addWindow(this); |
| } |
| |
| public boolean isModal() { |
| return this.modal; |
| } |
| |
| public void setModal(boolean modality) { |
| this.modal = modality; |
| } |
| |
| public OptionListener getOptionListener() { |
| return optionListener; |
| } |
| |
| public void setOptionListener(OptionListener optionListener) { |
| this.optionListener = optionListener; |
| } |
| |
| public void addOption(int optionId, String optionText) { |
| Button button = new Button(); |
| button.setCaption(optionText); |
| if (optionButtonWidth != null) |
| button.setWidth(optionButtonWidth, optionButtonWidthUnit); |
| buttons.addComponent(button); |
| buttons.setComponentAlignment(button, Alignment.MIDDLE_CENTER); |
| button2option.put(button, optionId); |
| option2button.put(optionId, button); |
| button.addClickListener(new Button.ClickListener() { |
| |
| @Override |
| public void buttonClick(ClickEvent event) { |
| Integer optionId = button2option.get(event.getButton()); |
| |
| if (optionListener != null) |
| optionListener.optionSelected(OptionDialog.this, optionId); |
| |
| getComponentProvider().optionSelected(OptionDialog.this, |
| optionId); |
| } |
| }); |
| } |
| |
| public void setOptionEnabled(int optionId, boolean enabled) { |
| Button button = option2button.get(optionId); |
| button.setEnabled(enabled); |
| } |
| |
| public Button getOptionButton(int optionId) { |
| return option2button.get(optionId); |
| } |
| |
| public static void show(UI parentWindow, String caption, String message, |
| String[] options, int w, int h, Unit units, |
| OptionListener optionListener) { |
| OptionDialog optionDialog = new OptionDialog(); |
| if (w > 0 && h > 0) { |
| optionDialog.setWidth(w, units); |
| optionDialog.setHeight(h, units); |
| } |
| |
| optionDialog.setModal(optionDialog.modal); |
| optionDialog.setCaption(caption); |
| optionDialog.setMessage(message); |
| optionDialog.setOptionListener(optionListener); |
| |
| for (int i = 0; i < options.length; i++) { |
| optionDialog.addOption(i, options[i]); |
| } |
| |
| parentWindow.addWindow(optionDialog); |
| } |
| |
| public static void show(UI parentWindow, String caption, String message, |
| String[] options, OptionListener optionListener) { |
| show(parentWindow, caption, message, options, -1, -1, null, |
| optionListener); |
| } |
| } |