/** * Copyright 2008-2016 Qualogy Solutions B.V. * * 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 com.qualogy.qafe.gwt.client.vo.functions.execute; import java.util.ArrayList; import java.util.List; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.IndexedPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.PushButton; import com.google.gwt.user.client.ui.TabBar; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TextBoxBase; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.qualogy.qafe.gwt.client.component.HasChoice; import com.qualogy.qafe.gwt.client.component.HasDataGridMethods; import com.qualogy.qafe.gwt.client.component.HasEditable; import com.qualogy.qafe.gwt.client.component.HasVisible; import com.qualogy.qafe.gwt.client.component.QLabel; import com.qualogy.qafe.gwt.client.component.QRootPanel; import com.qualogy.qafe.gwt.client.component.QSliderBar; import com.qualogy.qafe.gwt.client.component.QSuggestBox; import com.qualogy.qafe.gwt.client.component.QWindowPanel; import com.qualogy.qafe.gwt.client.component.SpreadsheetCell; import com.qualogy.qafe.gwt.client.context.ClientApplicationContext; import com.qualogy.qafe.gwt.client.ui.renderer.RendererHelper; import com.qualogy.qafe.gwt.client.ui.renderer.TabPanelRenderer; import com.qualogy.qafe.gwt.client.util.QAMLConstants; import com.qualogy.qafe.gwt.client.util.QAMLUtil; import com.qualogy.qafe.gwt.client.vo.functions.BuiltInComponentGVO; import com.qualogy.qafe.gwt.client.vo.functions.BuiltInFunctionGVO; import com.qualogy.qafe.gwt.client.vo.functions.SetPropertyGVO; @Deprecated public class SetPropertyExecute extends AbstractBuiltInExecute implements ExecuteCommand { public static final String MENU = "@menu"; public static final String TOOLBAR = "@toolbar"; public void execute(BuiltInFunctionGVO builtInFunction) { if (builtInFunction instanceof SetPropertyGVO) { SetPropertyGVO setProperty = (SetPropertyGVO) builtInFunction; if (builtInFunction.getComponents() != null) { for (BuiltInComponentGVO builtInComponentGVO : builtInFunction.getComponents()) { String component = builtInComponentGVO.getComponentIdUUID(); List<UIObject> uiObjects = null; if (component == null) { uiObjects = RendererHelper.getNamedComponent(builtInComponentGVO.getComponentName()); } else if (component.contains(MENU) || component.contains(TOOLBAR)) { uiObjects = getUIObjectsForMenuOrToolbar(component); } else { uiObjects = getUIObjects(component, setProperty); } if (uiObjects != null){ for (int i=0; i< uiObjects.size(); i++) { UIObject uiObject = uiObjects.get(i); if (uiObject != null) { processProperty(uiObject, builtInComponentGVO, setProperty); if ((uiObject instanceof HasWidgets) && (appliesToChild(uiObject, setProperty))) { HasWidgets hasWidgets = (HasWidgets) uiObject; processWidgets(hasWidgets, builtInComponentGVO, setProperty); } // Choice items are also stored with the same id or name of the parent choice in repository to make it accessble for getting values. // So When setting a property of a choice we need to skip the items comes just after the Choice. // For eg: When we set the visibility of Choice we have to do it for only Choice to for the items. if ((uiObject instanceof HasChoice) && (uiObject instanceof IndexedPanel)) { int choiceItemCount = ((IndexedPanel)uiObject).getWidgetCount(); i += choiceItemCount; } } } } } } } FunctionsExecutor.setProcessedBuiltIn(true); } /** * Get all UIObjects of a UUID. <br> * In case of a datagrid column, the UUID is virtual and starts with "datagridId.columnId|" * All the cells of that column will be returned in that case. * * @param uuid the UUID of a real component or a virtual UUID that denotes a column of a dataGrid. * @param setProperty * @return the UIObjects of the given UUID */ @SuppressWarnings("unused") private List<UIObject> getUIObjects(String uuid, SetPropertyGVO setProperty) { List<UIObject> uiObjects = RendererHelper.getComponent(uuid); if (uiObjects == null) { List<UIObject> parentUIObjects = getParentUIObjects(uuid); if (parentUIObjects != null) { uiObjects = new ArrayList<UIObject>(); for (UIObject parentUIObject : parentUIObjects) { if (parentUIObject instanceof HasDataGridMethods) { HasDataGridMethods hasDataGridMethods = (HasDataGridMethods)parentUIObject; int rowIndex = getRowIndex(uuid, hasDataGridMethods); boolean rowSelection = (rowIndex > -1); boolean applyToAllRecords = false; String propertyName = setProperty.getProperty(); if (QAMLConstants.PROPERTY_DISPLAYNAME.equals(propertyName)) { applyToAllRecords = true; } else if (QAMLConstants.PROPERTY_VISIBLE.equals(propertyName) && !rowSelection) { applyToAllRecords = true; } if (applyToAllRecords) { uiObjects.add(parentUIObject); continue; } uiObjects = collectCellUIObjects(uuid, rowIndex, uiObjects); } } } } return uiObjects; } /** * This method is to get the menubar uiobject reference when set-property is used with ref="rootpanelid@menu" or ref="rootpanelid@toolbar" * So we can set properties of menubar or toolbar dynamically. * @param component * @return */ private List<UIObject> getUIObjectsForMenuOrToolbar(String component) { List<UIObject> uiObjects; String type = ""; if (component.contains(MENU)) { type = MENU; component = component.replace(MENU, ""); } else if (component.contains(TOOLBAR)) { type = TOOLBAR; component = component.replace(TOOLBAR, ""); } uiObjects = RendererHelper.getComponent(component); QRootPanel p = null; UIObject ui = null; // get handle to the QRootPanel if (uiObjects != null && uiObjects.get(0) instanceof VerticalPanel) { VerticalPanel verticalPanel = (VerticalPanel)uiObjects.get(0); if (verticalPanel.getParent().getParent().getParent() instanceof QRootPanel) { p = (QRootPanel)verticalPanel.getParent().getParent().getParent(); } } if (p != null) { if (MENU.equals(type)) { ui = p.getMenuBar(); } else if (TOOLBAR.equals(type)) { ui = p.getToolbar(); } } uiObjects = new ArrayList<UIObject>(); if (ui != null){ uiObjects.add(ui); } return uiObjects; } private boolean appliesToChild(UIObject uiObject, SetPropertyGVO setProperty) { if (uiObject instanceof HasWidgets) { return !(QAMLConstants.PROPERTY_HEIGHT.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_WIDTH.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_TOOLTIP.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_DISPLAYNAME.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_TITLE.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_VISIBLE.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_ENABLED.equals(setProperty.getProperty())); } return false; } private void processWidgets(HasWidgets hasWidgets, BuiltInComponentGVO builtInComponentGVO, SetPropertyGVO setProperty) { for (Widget widget : hasWidgets) { processProperty(widget, builtInComponentGVO, setProperty); if (widget instanceof HasWidgets) { HasWidgets innerHasWidget = (HasWidgets) widget; processWidgets(innerHasWidget, builtInComponentGVO, setProperty); } } } // CHECKSTYLE.OFF: CyclomaticComplexity private void processProperty(UIObject uiObject, BuiltInComponentGVO builtInComponentGVO, SetPropertyGVO setProperty) { if (QAMLConstants.PROPERTY_ENABLED.equals(setProperty.getProperty()) || QAMLConstants.PROPERTY_DISABLED.equals(setProperty.getProperty())) { boolean value = Boolean.valueOf(setProperty.getValue()).booleanValue(); if (QAMLConstants.PROPERTY_DISABLED.equals(setProperty.getProperty())) { value = !value; } if (uiObject instanceof HasEnabled) { HasEnabled hasEnabled = (HasEnabled)uiObject; hasEnabled.setEnabled(value); } else if (uiObject instanceof HasWidgets) { SetMaskHelper.setMaskEnable(uiObject.getElement().getAttribute(QAMLConstants.PROPERTY_ID), value, true); DOM.setElementPropertyBoolean(uiObject.getElement(), QAMLConstants.PROPERTY_DISABLED, !value); } else if (uiObject instanceof QSuggestBox) { QSuggestBox suggestField = (QSuggestBox)uiObject; suggestField.getTextBox().setEnabled(value); } else if (uiObject instanceof SpreadsheetCell) { SpreadsheetCell cell = (SpreadsheetCell) uiObject; cell.setEditable(value); } } else if (QAMLConstants.PROPERTY_EDITABLE.equals(setProperty.getProperty())) { boolean editable = Boolean.valueOf(setProperty.getValue()).booleanValue(); HasEditable hasEditable = null; if (uiObject instanceof HasEditable) { hasEditable = (HasEditable)uiObject; } else if (uiObject instanceof TextBoxBase) { TextBoxBase textboxBase = (TextBoxBase)uiObject; if (textboxBase.getParent() instanceof HasEditable) { hasEditable = (HasEditable)textboxBase.getParent(); } else { textboxBase.setReadOnly(!editable); } } if (hasEditable != null) { hasEditable.setEditable(editable); } } else if (QAMLConstants.PROPERTY_VISIBLE.equals(setProperty.getProperty())) { boolean value = Boolean.valueOf(setProperty.getValue()).booleanValue(); if(uiObject instanceof HasVisible) { ((HasVisible)uiObject).processVisible(value); } else if (uiObject instanceof HasDataGridMethods) { HasDataGridMethods hasDataGridMethods = (HasDataGridMethods)uiObject; boolean resolved = false; String uuid = builtInComponentGVO.getComponentIdUUID(); if (uuid != null) { boolean containsColumn = uuid.contains("."); if (containsColumn) { String columnId = uuid.replaceFirst(".+\\.", "").replaceFirst("\\|.+", ""); hasDataGridMethods.setColumnVisible(columnId, value); resolved = true; } } if (!resolved) { uiObject.setVisible(value); hasDataGridMethods.redraw(); } } else { uiObject.setVisible(value); if (uiObject instanceof Panel) { Panel p = (Panel) uiObject; Widget parent = p.getParent(); if (parent != null && parent instanceof DeckPanel) { DeckPanel deckPanel = (DeckPanel) parent; int widgetIndex = deckPanel.getWidgetIndex(p); if (widgetIndex != -1) { if (deckPanel.getParent() != null && deckPanel.getParent().getParent() != null && deckPanel.getParent().getParent() instanceof TabPanel) { TabPanel tabs = ((TabPanel) (deckPanel.getParent().getParent())); TabPanelRenderer.setTabVisibility(tabs, widgetIndex, value, uiObject); } } } } } } else if (QAMLConstants.PROPERTY_HEIGHT.equals(setProperty.getProperty())) { try { String height = setProperty.getValue(); if (!QAMLUtil.containsUnitIdentifier(height)) { height += QAMLUtil.DEFAULT_UNIT; } uiObject.setHeight(height); } catch (Exception e) { ClientApplicationContext.getInstance().log("Set Property on height failed", "Please check value of height (" + setProperty.getValue() + ")", true); } } else if (QAMLConstants.PROPERTY_WIDTH.equals(setProperty.getProperty())) { try { String width = setProperty.getValue(); if (!QAMLUtil.containsUnitIdentifier(width)) { width += QAMLUtil.DEFAULT_UNIT; } uiObject.setWidth(width); } catch (Exception e) { ClientApplicationContext.getInstance().log("Set Property on width failed", "Please check value of width (" + setProperty.getValue() + ")", true); } } else if(QAMLConstants.PROPERTY_TOOLTIP.equals(setProperty.getProperty())){ uiObject.setTitle(setProperty.getValue()); } else if(QAMLConstants.PROPERTY_TITLE.equals(setProperty.getProperty())){ if(uiObject instanceof CaptionPanel){ CaptionPanel p = (CaptionPanel) uiObject; p.setCaptionText(setProperty.getValue()); } } else if(QAMLConstants.PROPERTY_DISPLAYNAME.equals(setProperty.getProperty())){ if (uiObject instanceof HasDataGridMethods) { HasDataGridMethods hasDataGridMethods = (HasDataGridMethods)uiObject; String uuid = builtInComponentGVO.getComponentIdUUID(); if (uuid != null) { boolean containsColumn = uuid.contains("."); if (containsColumn) { String columnId = uuid.replaceFirst(".+\\.", "").replaceFirst("\\|.+", ""); String value = setProperty.getValue(); hasDataGridMethods.setColumnLabel(columnId, value); } } } else if (uiObject instanceof PushButton) { ((PushButton)uiObject).getUpFace().setText(setProperty.getValue()); ((PushButton)uiObject).getDownFace().setText(setProperty.getValue()); } else if (uiObject instanceof HasText) { HasText t = (HasText)uiObject; t.setText(setProperty.getValue()); } else if (uiObject instanceof VerticalPanel) { VerticalPanel vp = (VerticalPanel)uiObject; Widget tabPanelWidget = vp.getParent().getParent().getParent(); if (tabPanelWidget instanceof TabPanel) { TabPanel tp = (TabPanel)tabPanelWidget; TabBar tb = tp.getTabBar(); int tabCount =tp.getWidgetCount(); for (int i=0;i < tabCount;i++){ Widget w = tp.getWidget(i); if (w == vp){ tb.setTabText(i, setProperty.getValue()); } } } } else if (uiObject instanceof QWindowPanel) { QWindowPanel p = (QWindowPanel) uiObject; p.setCaption(setProperty.getValue()); } } else if(QAMLConstants.PROPERTY_SELECTED_ROW.equals(setProperty.getProperty())){ if (uiObject instanceof HasDataGridMethods){ HasDataGridMethods hasDataGridMethods = (HasDataGridMethods)uiObject; try { int rowNr = Integer.parseInt(setProperty.getValue()); hasDataGridMethods.selectRow(rowNr); } catch (Exception e){ ClientApplicationContext.getInstance().log("Set property on the datagrid selected row: the value ("+ setProperty.getValue()+") cannot be translated into an integer", e); } } } else if (QAMLConstants.PROPERTY_SELECTED.equals(setProperty.getProperty())){ if (uiObject instanceof CheckBox){ boolean value = Boolean.valueOf(setProperty.getValue()).booleanValue(); ((CheckBox)(uiObject)).setValue(value); } else if (uiObject instanceof ListBox){ ListBox listBox = (ListBox)uiObject; int size = listBox.getItemCount(); boolean selected=false; for(int i=0;i<size &&!selected;i++){ if (listBox.getValue(i).equals(setProperty.getValue())){ selected=true; listBox.setSelectedIndex(i); } } } } else if (QAMLConstants.PROPERTY_CURRENT_PAGE.equals(setProperty.getProperty())) { if (uiObject instanceof HasDataGridMethods) { HasDataGridMethods dataGridSortableTable = (HasDataGridMethods) uiObject; try { if (setProperty.getValue() != null) { dataGridSortableTable.setCurrentPage(Integer.parseInt(setProperty.getValue())); } } catch (Exception e) { e.printStackTrace(); } } } else if (QAMLConstants.PROPERTY_PAGESIZE.equals(setProperty.getProperty())) { if (uiObject instanceof HasDataGridMethods) { HasDataGridMethods dataGridSortableTable = (HasDataGridMethods) uiObject; try { if (setProperty.getValue() != null) { dataGridSortableTable.setPageSize(Integer.parseInt(setProperty.getValue())); } } catch (Exception e) { e.printStackTrace(); } } } else if (QAMLConstants.PROPERTY_MAX_TICKS.equals(setProperty.getProperty())) { if (uiObject instanceof QSliderBar){ QSliderBar slider = (QSliderBar)uiObject; slider.setMaxValue(Double.valueOf(setProperty.getValue())); } } else if (QAMLConstants.PROPERTY_MIN_TICKS.equals(setProperty.getProperty())) { if (uiObject instanceof QSliderBar){ QSliderBar slider = (QSliderBar)uiObject; slider.setMinValue(Double.valueOf(setProperty.getValue())); } } else if (QAMLConstants.PROPERTY_TICKSIZE.equals(setProperty.getProperty())) { if (uiObject instanceof QSliderBar){ QSliderBar slider = (QSliderBar)uiObject; slider.setStepSize(Integer.valueOf(setProperty.getValue())); } } else if (QAMLConstants.PROPERTY_TICK_LABELS.equals(setProperty.getProperty())) { if (uiObject instanceof QSliderBar){ QSliderBar slider = (QSliderBar)uiObject; slider.setTickLabels(Integer.valueOf(setProperty.getValue())); } } } // CHECKSTYLE.ON: CyclomaticComplexity }