/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2013 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.scripting.solutionmodel; import java.util.Iterator; import org.mozilla.javascript.annotations.JSFunction; import org.mozilla.javascript.annotations.JSGetter; import org.mozilla.javascript.annotations.JSSetter; import com.servoy.base.persistence.IMobileProperties; import com.servoy.base.persistence.IMobileProperties.MobileProperty; import com.servoy.base.persistence.constants.IPartConstants; import com.servoy.base.solutionmodel.IBaseSMMethod; import com.servoy.j2db.documentation.ServoyDocumented; import com.servoy.j2db.persistence.GraphicalComponent; import com.servoy.j2db.persistence.Part; import com.servoy.j2db.solutionmodel.ISMHeader; import com.servoy.j2db.util.Utils; /** * Solution model header object on form. * * @author rgansevles */ @ServoyDocumented(category = ServoyDocumented.RUNTIME) public class JSHeader extends JSPart implements ISMHeader { JSHeader(JSForm form, Part part, boolean isNew) { super(form, part, isNew); } @Override public JSForm getJSParent() { return (JSForm)super.getJSParent(); } /** * Flag to set a set the header sticky so it will not scroll out of view. * * @sample * var form = solutionModel.newForm('newForm1', myDatasource); * var header = form.newHeader() * header.sticky = false // default: true */ @Override @JSGetter public boolean getSticky() { return getBaseComponent(false).getPartType() == IPartConstants.TITLE_HEADER; } @Override @JSSetter public void setSticky(boolean sticky) { getBaseComponent(true).setPartType(sticky ? TITLE_HEADER : HEADER); } /** * Creates a new left-button on the form header. * * @sample * var form = solutionModel.newForm('newForm1', myDatasource); * var header = form.newHeader() * var button = header.newLeftButton('back', form.getMethod('goBack')) * * @param text the text on the button * * @param jsmethod the method assigned to handle an onAction event * * @return a new JSButton object */ @JSFunction @Override public JSButton newLeftButton(String text, IBaseSMMethod jsmethod) { return newButtonImpl(true, text, jsmethod); } /** * Returns the left-button on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var button = header.getLeftButton() * button.iconType = JSButton.ICON_HOME * * @return a JSButton object if the left-button exists, null otherwise */ @JSFunction @Override public JSButton getLeftButton() { return getButtonImpl(true); } /** * Remove the left-button on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var removed = header.removeLeftButton() * * @return true if button existed and was removed */ @JSFunction @Override public boolean removeLeftButton() { return removeComponent(IMobileProperties.HEADER_LEFT_BUTTON); } /** * Creates a new right-button on the form header. * * @sample * var form = solutionModel.newForm('newForm1', myDatasource); * var header = form.newHeader() * var button = header.newRightButton('save', form.getMethod('doSave')) * * @param text the text on the button * * @param jsmethod the method assigned to handle an onAction event * * @return a new JSButton object */ @JSFunction @Override public JSButton newRightButton(String text, IBaseSMMethod jsmethod) { return newButtonImpl(false, text, jsmethod); } /** * Returns the right-button on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var button = header.getRightButton() * button.iconType = JSButton.ICON_GEARS * * @return a JSButton object if the right-button exists, null otherwise */ @JSFunction @Override public JSButton getRightButton() { return getButtonImpl(false); } /** * Remove the right-button on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var removed = header.removeRightButton() * * @return true if button existed and was removed */ @JSFunction @Override public boolean removeRightButton() { return removeComponent(IMobileProperties.HEADER_RIGHT_BUTTON); } /** * Creates a new header text label on the form header. * * @sample * var form = solutionModel.newForm('newForm1', myDatasource); * var header = form.newHeader() * var title = header.newHeaderText('Contacts') * * @param text the text on the header * * @return a new JSTitle object */ @JSFunction @Override public JSTitle newHeaderText(String txt) { JSLabel label = getJSParent().newLabel(txt, 0, 0, 10, 10); label.getBaseComponent(true).putCustomMobileProperty(IMobileProperties.HEADER_ITEM.propertyName, Boolean.TRUE); label.getBaseComponent(true).putCustomMobileProperty(IMobileProperties.HEADER_TEXT.propertyName, Boolean.TRUE); return new JSTitle(getJSParent(), label.getBaseComponent(false), true); } /** * Returns the header text label on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var title = header.getHeaderText() * title.text = 'Customers' * * @return a JSTitle object if the header text exists, null otherwise */ @JSFunction @Override public JSTitle getHeaderText() { JSForm form = getJSParent(); for (GraphicalComponent label : Utils.iterate(form.getApplication().getFlattenedSolution().getFlattenedForm(form.getSupportChild()).getGraphicalComponents())) { if (Boolean.TRUE.equals(label.getCustomMobileProperty(IMobileProperties.HEADER_TEXT.propertyName))) { return new JSTitle(getJSParent(), label, false); } } return null; } /** * Remove the header text label on the form header if present. * * @sample * var form = solutionModel.getForm('myform'); * var header = form.getHeader() * var removed = header.removeHeaderText() * * @return true if header text existed and was removed */ @JSFunction @Override public boolean removeHeaderText() { return removeComponent(IMobileProperties.HEADER_TEXT); } private JSButton newButtonImpl(boolean left, String txt, Object method) { JSButton button = getJSParent().newButton(txt, 0, 0, 10, 10, method); button.getBaseComponent(true).putCustomMobileProperty(IMobileProperties.HEADER_ITEM.propertyName, Boolean.TRUE); button.getBaseComponent(true).putCustomMobileProperty( left ? IMobileProperties.HEADER_LEFT_BUTTON.propertyName : IMobileProperties.HEADER_RIGHT_BUTTON.propertyName, Boolean.TRUE); return button; } private JSButton getButtonImpl(boolean left) { JSForm form = getJSParent(); for (GraphicalComponent button : Utils.iterate(form.getApplication().getFlattenedSolution().getFlattenedForm(form.getSupportChild()).getGraphicalComponents())) { if (Boolean.TRUE.equals(button.getCustomMobileProperty(left ? IMobileProperties.HEADER_LEFT_BUTTON.propertyName : IMobileProperties.HEADER_RIGHT_BUTTON.propertyName))) { return new JSButton(form, button, form.getApplication(), false); } } return null; } private boolean removeComponent(MobileProperty<Boolean> property) { JSForm form = getJSParent(); form.checkModification(); Iterator<GraphicalComponent> graphicalComponents = form.getSupportChild().getGraphicalComponents(); while (graphicalComponents.hasNext()) { GraphicalComponent button = graphicalComponents.next(); if (Boolean.TRUE.equals(button.getCustomMobileProperty(property.propertyName))) { form.getSupportChild().removeChild(button); return true; } } return false; } }