/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.server.headlessclient; import org.apache.wicket.Component; import org.apache.wicket.behavior.IBehavior; import com.servoy.j2db.server.headlessclient.dataui.IOwnTabSequenceHandler; import com.servoy.j2db.server.headlessclient.dataui.ISupportWebTabSeq; import com.servoy.j2db.server.headlessclient.dataui.WebRect; import com.servoy.j2db.ui.IProviderStylePropertyChanges; import com.servoy.j2db.util.ISupplyFocusChildren; /** * Helper class for setting up tabindex attribute modifiers for components. * * @see com.servoy.j2db.server.headlessclient.TabIndexAttributeModifier * * @author gerzse */ public class TabIndexHelper { public static void setUpTabIndexAttributeModifier(Component comp, int newTabIndex) { if (comp instanceof IOwnTabSequenceHandler) { ((IOwnTabSequenceHandler)comp).handleOwnTabIndex(newTabIndex); } else { if (comp instanceof ISupplyFocusChildren) { for (Component c : ((ISupplyFocusChildren<Component>)comp).getFocusChildren()) { setUpTabIndexAttributeModifierInternal(c, newTabIndex); } } else { setUpTabIndexAttributeModifierInternal(comp, newTabIndex); } } } private static void setUpTabIndexAttributeModifierInternal(Component comp, int newTabIndex) { TabIndexAttributeModifier modifier = null; final Component component = comp; for (Object obeh : component.getBehaviors()) { IBehavior beh = (IBehavior)obeh; if (beh instanceof TabIndexAttributeModifier) { modifier = (TabIndexAttributeModifier)beh; break; } } boolean componentChanged = true; boolean changeForClientSide = false; if (modifier == null) { if (newTabIndex != ISupportWebTabSeq.DEFAULT && isTabIndexSupported(component)) component.add(new TabIndexAttributeModifier(newTabIndex)); } else if (newTabIndex != ISupportWebTabSeq.DEFAULT) { if (newTabIndex != modifier.getTabIndex()) { modifier.setTabIndex(newTabIndex); if (!(component instanceof IProviderStylePropertyChanges) || !((IProviderStylePropertyChanges)component).getStylePropertyChanges().isChanged()) { // if is already changed leave it to server side changeForClientSide = true; } } else { componentChanged = false; } } else { component.remove(modifier); } if (componentChanged) { MainPage page = component.findParent(MainPage.class); if (changeForClientSide) { if (page != null) { page.getPageContributor().addTabIndexChange(component.getMarkupId(), newTabIndex); } else { changeForClientSide = false; } } if (!changeForClientSide && component instanceof IProviderStylePropertyChanges) { IProviderStylePropertyChanges changeable = (IProviderStylePropertyChanges)component; changeable.getStylePropertyChanges().setChanged(); if (page != null) { page.getPageContributor().addTabIndexChange(component.getMarkupId(), ISupportWebTabSeq.DEFAULT); } } } } public static int getTabIndex(Component component) { TabIndexAttributeModifier modifier = null; for (Object obeh : component.getBehaviors()) { IBehavior beh = (IBehavior)obeh; if (beh instanceof TabIndexAttributeModifier) { modifier = (TabIndexAttributeModifier)beh; break; } } if (modifier != null) return modifier.getTabIndex(); else return -1; } private static boolean isTabIndexSupported(Component component) { return !(component instanceof WebRect); } }