
com.sibvisions.rad.ui.vaadin.impl.component.WrappedPopupMenuButton Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jvxvaadin-server Show documentation
Show all versions of jvxvaadin-server Show documentation
Vaadin UI implementation for JVx
The newest version!
/*
* Copyright 2018 SIB Visions GmbH
*
* 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.
*
*
* History
*
* 21.03.2018 - [JR] - creation
*/
package com.sibvisions.rad.ui.vaadin.impl.component;
import java.util.List;
import jvx.rad.ui.event.ActionHandler;
import jvx.rad.ui.event.UIActionEvent;
import jvx.rad.ui.menu.IMenuItem;
import jvx.rad.ui.menu.IPopupMenu;
import com.sibvisions.rad.ui.vaadin.ext.ui.MenuBar;
import com.sibvisions.rad.ui.vaadin.ext.ui.extension.CssExtension;
import com.sibvisions.rad.ui.vaadin.ext.ui.extension.IDynamicCss;
import com.sibvisions.rad.ui.vaadin.impl.VaadinFactory;
import com.sibvisions.rad.ui.vaadin.impl.menu.VaadinMenuItem;
import com.sibvisions.rad.ui.vaadin.impl.menu.VaadinPopupMenu;
import com.sibvisions.rad.ui.vaadin.impl.menu.WrappedMenuBar;
import com.sibvisions.util.type.StringUtil;
import com.vaadin.server.Resource;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
/**
* The WrappedPopupMenuButton
is a layout which embedds a {@link MenuBar} to act
* as button with a popup menu.
*
* @author Ren? Jahn
*/
public class WrappedPopupMenuButton extends CssLayout
implements Command
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class members
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/** the menu bar. */
private InternalMenuBar menubar;
/** the popup menu. */
private IPopupMenu menu;
/** the default item if clicked. */
private IMenuItem miDefault;
/** the root menu item. */
private MenuItem itemRoot;
/** the default item. */
private MenuItem itemDefault;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Initialization
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Creates a new instance of WrappedPopupMenuButton
.
*/
public WrappedPopupMenuButton()
{
setSizeFull();
addStyleName("wrappedpopupmenubutton");
menubar = new InternalMenuBar();
menubar.setPopupStyleName("jvxpopupmenubuttonpopup usedefault");
addComponent(menubar);
menubar.addStyleName("jvxpopupbutton v-no-defaultitem v-nocaption");
itemRoot = menubar.addItem("", null);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Interface implementation
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* {@inheritDoc}
*/
public void menuSelected(MenuItem selectedItem)
{
if (miDefault instanceof VaadinMenuItem && ((VaadinMenuItem)miDefault).hasActionEventHandler())
{
ActionHandler handler = miDefault.eventAction();
((VaadinFactory)miDefault.getFactory()).synchronizedDispatchEvent(handler, new UIActionEvent(miDefault.getEventSource(),
UIActionEvent.ACTION_PERFORMED,
System.currentTimeMillis(),
0,
miDefault.getActionCommand()));
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// User-defined methods
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Sets the popup menu.
*
* @param pMenu the menu
*/
public void setPopupMenu(IPopupMenu pMenu)
{
if (menu != null)
{
MenuBar mbar = ((WrappedMenuBar)((VaadinPopupMenu)menu).getMenuBar().getResource()).getMenuBar();
mbar.removeMarkAsDirtyConnector(menubar);
menubar.clearIds();
}
menu = pMenu;
if (menu != null)
{
MenuBar mbar = ((WrappedMenuBar)((VaadinPopupMenu)menu).getMenuBar().getResource()).getMenuBar();
mbar.addMarkAsDirtyConnector(menubar);
((InternalMenuBar)menubar).button = this;
}
}
/**
* Gets the popup menu.
*
* @return the menu
*/
public IPopupMenu getPopupMenu()
{
return menu;
}
/**
* Sets the menu item which acts as default item.
*
* @param pItem the default menu item
*/
public void setDefaultMenuItem(IMenuItem pItem)
{
if (itemDefault != null)
{
menubar.bIgnore = true;
try
{
menubar.removeItem(itemDefault);
menubar.addStyleName("v-no-defaultitem");
itemDefault = null;
itemRoot.setCommand(null);
}
finally
{
menubar.bIgnore = false;
}
}
miDefault = pItem;
if (miDefault != null)
{
menubar.bIgnore = true;
try
{
itemRoot.removeChildren();
itemRoot.setCommand(this);
itemDefault = menubar.addItem("", null);
menubar.removeStyleName("v-no-defaultitem");
}
finally
{
menubar.bIgnore = false;
}
}
menubar.markAsDirty();
}
/**
* Gets the default menu item.
*
* @return the menu item
* @see #setDefaultMenuItem(IMenuItem)
*/
public IMenuItem getDefaultMenuItem()
{
return miDefault;
}
/**
* Gets the css extension of the menu bar.
*
* @return the menu bar
*/
public CssExtension getCssExtension()
{
return menubar.getCssExtension();
}
/**
* Sets the tab index.
*
* @param pIndex the tab index
*/
public void setTabIndex(int pIndex)
{
menubar.setTabIndex(pIndex);
}
/**
* Gets the tab index.
*
* @return the tab index
*/
public int getTabIndex()
{
return menubar.getTabIndex();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Overwritten methods
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* {@inheritDoc}
*/
@Override
public void setIcon(Resource pIcon)
{
itemRoot.setIcon(pIcon);
}
/**
* {@inheritDoc}
*/
@Override
public Resource getIcon()
{
return itemRoot.getIcon();
}
/**
* {@inheritDoc}
*/
@Override
public void setCaption(String pText)
{
itemRoot.setText(pText);
if (StringUtil.isEmpty(pText))
{
menubar.addStyleName("v-nocaption");
}
else
{
menubar.removeStyleName("v-nocaption");
}
}
/**
* {@inheritDoc}
*/
@Override
public String getCaption()
{
return itemRoot.getText();
}
/**
* {@inheritDoc}
*/
@Override
public void setEnabled(boolean pEnabled)
{
itemRoot.setEnabled(pEnabled);
if (itemDefault != null)
{
itemDefault.setEnabled(pEnabled);
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean isEnabled()
{
return itemRoot.isEnabled();
}
//****************************************************************
// Subclass definition
//****************************************************************
/**
* The InternalMenuBar
is a {@link MenuBar} which updates the button menu after
* the underlying popup menu has changed.
*
* @author Ren? Jahn
*/
public static class InternalMenuBar extends MenuBar
implements IDynamicCss
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class members
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/** the referenced button. */
private WrappedPopupMenuButton button;
/** the CSS extension. */
private CssExtension cssext;
/** whether to ignore menu changes. */
private boolean bIgnore = false;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Overwritten methods
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* {@inheritDoc}
*/
@Override
public void markAsDirty()
{
if (bIgnore)
{
return;
}
if (button != null && button.menu != null)
{
bIgnore = true;
try
{
MenuBar mbar = ((WrappedMenuBar)((VaadinPopupMenu)button.menu).getMenuBar().getResource()).getMenuBar();
mbar.copyIds(this);
setId(((AbstractComponent)button.menu.getResource()).getId());
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy