package com.chemhack.jsMolEditor.client.widget; import com.google.gwt.user.client.ui.*; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.Command; import com.google.gwt.core.client.GWT; import com.chemhack.jsMolEditor.client.resources.MyImageBundle; import java.util.ArrayList; import java.util.List; public class ToggleDropDownButton extends Composite { MyImageBundle myImageBundle = (MyImageBundle) GWT.create(MyImageBundle.class); List<OptionButton> options = new ArrayList<OptionButton>(); ToggleButton dropDownButton = new ToggleButton(myImageBundle.dropDownSmall().createImage()); SimplePanel selectedOptionWrapper = new SimplePanel(); HorizontalPanel hp = new HorizontalPanel(); VerticalPanel dropDownMenu = new VerticalPanel(); PopupPanel dropDownWrapper = new PopupPanel(); boolean isMenuShowed = false; Command upAllToggle; ClickListener defaultOptionClickListener = new ClickListener() { public void onClick(Widget sender) { OptionButton optionButton = (OptionButton) sender; if (optionButton != selectedOptionWrapper.getWidget()) { //Selecting new option from dropdown menu selectOption(optionButton); toggleMenuShowed(); } if (upAllToggle != null) upAllToggle.execute(); ((OptionButton) selectedOptionWrapper.getWidget()).setDown(true); } }; private void toggleMenuShowed() { if (isMenuShowed) { hideDropDownMenu(); } else { showDropDownMenu(); } } public ToggleDropDownButton() { super(); hp.add(selectedOptionWrapper); hp.add(dropDownButton); dropDownMenu.setWidth(hp.getOffsetWidth() + "px"); dropDownWrapper.add(dropDownMenu); dropDownWrapper.setStyleName(null); initWidget(hp); dropDownButton.addClickListener(new ClickListener() { public void onClick(Widget sender) { toggleMenuShowed(); } }); } private void selectOption(OptionButton selectedOption) { selectedOption.removeFromParent(); selectedOption.setDown(false); selectedOptionWrapper.clear(); selectedOptionWrapper.add(selectedOption); } private void showDropDownMenu() { dropDownWrapper.setPopupPosition(hp.getAbsoluteLeft(), hp.getAbsoluteTop() + hp.getOffsetHeight()); dropDownWrapper.show(); dropDownMenu.clear(); for (OptionButton option : options) { if (option != selectedOptionWrapper.getWidget()) { option.setDown(false); dropDownMenu.add(option); } } dropDownButton.setDown(true); isMenuShowed = true; } private void hideDropDownMenu() { dropDownWrapper.hide(); dropDownButton.setDown(false); isMenuShowed = false; } public void addOption(Image image, String text, ClickListener clickListener) { OptionButton option = new OptionButton(image, text, clickListener); options.add(option); } public void setSelectedIndex(int index) { selectOption(options.get(index)); } private class OptionButton extends ToggleButton { public Image image; public String text; private OptionButton(Image image, String text, ClickListener clickListener) { super(image); setTitle(text); addClickListener(clickListener); addClickListener(defaultOptionClickListener); } } public void setDown(boolean down) { ((OptionButton) selectedOptionWrapper.getWidget()).setDown(down); } public void setUpAllToggle(Command upAllToggle) { this.upAllToggle = upAllToggle; } }