blob: 21c2d45819ddcf8dab5020648cb88939785fe87b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.openaz.xacml.admin.view.windows;
import java.util.Map;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.openaz.xacml.admin.model.ObligationAdviceContainer;
import org.apache.openaz.xacml.util.XACMLObjectCopy;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class ObligationAdviceEditorWindow extends Window {
/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
@AutoGenerated
private VerticalLayout mainLayout;
@AutoGenerated
private Button buttonSave;
@AutoGenerated
private TreeTable tableExpressions;
@AutoGenerated
private HorizontalLayout horizontalLayout_1;
@AutoGenerated
private Button buttonClear;
@AutoGenerated
private Button buttonRemove;
@AutoGenerated
private Button buttonAdd;
/**
*
*/
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(ObligationAdviceEditorWindow.class);
private final ObligationAdviceEditorWindow self = this;
private final Object root;
private final Map<VariableDefinitionType, PolicyType> variables;
private ObligationAdviceContainer container;
private boolean isSaved = false;
private static final Action ADD_OBLIGATION = new Action ("Add Obligation");
private static final Action ADD_ADVICE = new Action ("Add Advice");
private static final Action ADD_EXPRESSION = new Action ("Add Expression");
private static final Action ADD_ATTRIBUTE = new Action ("Add Attribute");
private static final Action EDIT_OBLIGATION = new Action ("Edit Obligation");
private static final Action EDIT_ADVICE = new Action ("Edit Advice");
private static final Action EDIT_EXPRESSION = new Action ("Edit Expression");
private static final Action EDIT_ATTRIBUTE = new Action ("Edit Attribute");
private static final Action REMOVE_OBLIGATION = new Action ("Remove Obligation");
private static final Action REMOVE_ADVICE = new Action ("Remove Advice");
private static final Action REMOVE_EXPRESSION = new Action ("Remove Expression");
private static final Action REMOVE_ATTRIBUTE = new Action ("Remove Attribute");
/**
* The constructor should first build the main layout, set the
* composition root and then do any custom initialization.
*
* The constructor will not be automatically regenerated by the
* visual editor.
*/
public ObligationAdviceEditorWindow(Object root, Map<VariableDefinitionType, PolicyType> variables) {
buildMainLayout();
//setCompositionRoot(mainLayout);
setContent(mainLayout);
//
// Save
//
if (! (root instanceof ObligationExpressionsType) &&
! (root instanceof AdviceExpressionsType) ) {
throw new IllegalArgumentException("This window supports Obligation or Advice Expressions only.");
}
this.root = root;
this.variables = variables;
this.container = new ObligationAdviceContainer(this.root);
//
// Set our shortcuts
//
this.setCloseShortcut(KeyCode.ESCAPE);
//
// Initialize GUI
//
this.initializeTable();
this.initializeButtons();
this.setupButtons();
//
// Focus
//
this.tableExpressions.focus();
}
protected void initializeTable() {
//
// GUI properties
//
this.tableExpressions.setImmediate(true);
//
// Set the container
//
this.tableExpressions.setContainerDataSource(this.container);
this.tableExpressions.setVisibleColumns(new Object[] {ObligationAdviceContainer.PROPERTY_NAME,
ObligationAdviceContainer.PROPERTY_ID_SHORT,
ObligationAdviceContainer.PROPERTY_EFFECT,
ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT,
ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT});
this.tableExpressions.setColumnHeaders(new String[] {"Name", "ID or Value", (this.root instanceof ObligationExpressionsType ? "Effect" : "Applies"), "Category", "Data Type"});
//this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_NAME, 1.0f);
//this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_ID_SHORT, 1.0f);
//this.tableExpressions.setColumnWi
this.tableExpressions.setSelectable(true);
//
// Expand it out
//
for (Object item : this.tableExpressions.getItemIds()) {
this.tableExpressions.setCollapsed(item, false);
for (Object child : this.tableExpressions.getChildren(item)) {
this.tableExpressions.setCollapsed(child, false);
}
}
this.tableExpressions.setPageLength(this.container.size() + 3);
//
// Respond to events
//
this.tableExpressions.addActionHandler(new Handler() {
private static final long serialVersionUID = 1L;
@Override
public Action[] getActions(Object target, Object sender) {
if (target == null) {
if (self.root instanceof ObligationExpressionsType) {
return new Action[] {ADD_OBLIGATION};
}
if (self.root instanceof AdviceExpressionsType) {
return new Action[] {ADD_ADVICE};
}
}
if (target instanceof ObligationExpressionType) {
return new Action[] {EDIT_OBLIGATION, REMOVE_OBLIGATION, ADD_EXPRESSION};
}
if (target instanceof AdviceExpressionType) {
return new Action[] {EDIT_ADVICE, REMOVE_ADVICE, ADD_EXPRESSION};
}
if (target instanceof AttributeAssignmentExpressionType) {
return new Action[] {EDIT_EXPRESSION, REMOVE_EXPRESSION, ADD_ATTRIBUTE};
}
if (target instanceof AttributeValueType ||
target instanceof AttributeDesignatorType ||
target instanceof AttributeSelectorType ||
target instanceof ApplyType) {
return new Action[] {EDIT_ATTRIBUTE, REMOVE_ATTRIBUTE};
}
return null;
}
@Override
public void handleAction(Action action, Object sender, Object target) {
if (action == ADD_OBLIGATION) {
self.editObligation(null);
return;
}
if (action == EDIT_OBLIGATION) {
assert target instanceof ObligationExpressionType;
self.editObligation((ObligationExpressionType) target);
return;
}
if (action == REMOVE_OBLIGATION) {
assert target instanceof ObligationExpressionType;
if (self.container.removeItem(target) == false) {
logger.error("Failed to remove obligation");
assert false;
}
return;
}
if (action == ADD_ADVICE) {
self.editAdvice(null);
return;
}
if (action == EDIT_ADVICE) {
assert target instanceof AdviceExpressionType;
self.editAdvice((AdviceExpressionType) target);
return;
}
if (action == REMOVE_ADVICE) {
assert target instanceof AdviceExpressionType;
if (self.container.removeItem(target) == false) {
logger.error("Failed to remove advice");
assert false;
}
return;
}
if (action == ADD_EXPRESSION) {
assert target instanceof ObligationExpressionType || target instanceof AdviceExpressionType;
self.editExpression(null, target);
return;
}
if (action == EDIT_EXPRESSION) {
assert target instanceof AttributeAssignmentExpressionType;
self.editExpression((AttributeAssignmentExpressionType) target, self.container.getParent(target));
return;
}
if (action == REMOVE_EXPRESSION) {
assert target instanceof AttributeAssignmentExpressionType;
if (self.container.removeItem(target) == false) {
logger.error("Failed to remove expression");
assert false;
}
return;
}
if (action == ADD_ATTRIBUTE) {
assert target instanceof AttributeAssignmentExpressionType;
self.editAttribute(null, (AttributeAssignmentExpressionType) target);
return;
}
if (action == EDIT_ATTRIBUTE) {
assert target instanceof AttributeValueType ||
target instanceof AttributeDesignatorType ||
target instanceof AttributeSelectorType ||
target instanceof ApplyType;
self.editAttribute(target, (AttributeAssignmentExpressionType) self.container.getParent(target));
return;
}
if (action == REMOVE_ATTRIBUTE) {
assert target instanceof AttributeValueType ||
target instanceof AttributeDesignatorType ||
target instanceof AttributeSelectorType ||
target instanceof ApplyType;
if (self.container.removeItem(target) == false) {
logger.error("Failed to remove attribute");
assert false;
}
return;
}
}
});
//
// Respond to selections
//
this.tableExpressions.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
self.setupButtons();
}
});
this.tableExpressions.addItemClickListener(new ItemClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
if (event.getSource() instanceof AdviceExpressionType) {
self.editAdvice((AdviceExpressionType) event.getSource());
} else if (event.getSource() instanceof ObligationExpressionType) {
self.editObligation((ObligationExpressionType) event.getSource());
} else if (event.getSource() instanceof AttributeAssignmentExpressionType) {
self.editExpression((AttributeAssignmentExpressionType) event.getSource(), self.container.getParent(event.getSource()));
} else {
self.editAttribute(event.getSource(), (AttributeAssignmentExpressionType) self.container.getParent(event.getSource()));
}
}
}
});
//
// Implement a description generator, to display the full XACML ID.
//
this.tableExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() {
private static final long serialVersionUID = 1L;
@Override
public String generateDescription(Component source, Object itemId, Object propertyId) {
if (propertyId == ObligationAdviceContainer.PROPERTY_ID_SHORT) {
if (itemId instanceof AdviceExpressionType) {
return ((AdviceExpressionType) itemId).getAdviceId();
}
if (itemId instanceof ObligationExpressionType) {
return ((ObligationExpressionType) itemId).getObligationId();
}
if (itemId instanceof AttributeAssignmentExpressionType) {
return ((AttributeAssignmentExpressionType) itemId).getAttributeId();
}
if (itemId instanceof AttributeDesignatorType) {
return ((AttributeDesignatorType) itemId).getAttributeId();
}
if (itemId instanceof AttributeSelectorType) {
return ((AttributeSelectorType) itemId).getContextSelectorId();
}
if (itemId instanceof ApplyType) {
return ((ApplyType) itemId).getDescription();
}
}
if (propertyId == ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT) {
if (itemId instanceof AttributeAssignmentExpressionType) {
return ((AttributeAssignmentExpressionType) itemId).getCategory();
}
if (itemId instanceof AttributeDesignatorType) {
return ((AttributeDesignatorType) itemId).getCategory();
}
if (itemId instanceof AttributeSelectorType) {
return ((AttributeSelectorType) itemId).getCategory();
}
if (itemId instanceof ApplyType) {
return null;
}
}
if (propertyId == ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT) {
if (itemId instanceof AttributeValueType) {
return ((AttributeValueType) itemId).getDataType();
}
if (itemId instanceof AttributeDesignatorType) {
return ((AttributeDesignatorType) itemId).getDataType();
}
if (itemId instanceof AttributeSelectorType) {
return ((AttributeSelectorType) itemId).getDataType();
}
/*
if (itemId instanceof ApplyType) {
//
// TODO - get the datatype for the function
//
}
*/
}
return null;
}
});
}
protected void initializeButtons() {
this.buttonAdd.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
if (self.tableExpressions.getValue() == null) {
//
// Add new root advice or obligation
//
if (self.root instanceof AdviceExpressionsType) {
self.editAdvice(null);
} else {
self.editObligation(null);
}
} else {
//
// Add new assignment expression
//
self.editExpression(null, self.tableExpressions.getValue());
}
}
});
this.buttonRemove.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
Object object = self.tableExpressions.getValue();
if (object != null) {
if (object instanceof AttributeValueType ||
object instanceof AttributeDesignatorType ||
object instanceof AttributeSelectorType ||
object instanceof ApplyType) {
if (self.container.removeItem(self.container.getParent(object)) == false) {
logger.error("Failed to remove attribute value/des/sel/apply");
assert false;
}
} else {
if (self.container.removeItem(object) == false) {
logger.error("Failed to remove object");
assert false;
}
}
} else {
logger.error("This code should never get executed if the button was properly disabled.");
}
}
});
this.buttonClear.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
Object object = self.tableExpressions.getValue();
if (object == null) {
if (self.container.removeAllItems() == false) {
logger.error("Failed to remove all items");
assert false;
}
} else {
if (self.container.removeAllAssignments() == false) {
logger.error("Failed to remove all assignments");
assert false;
}
}
}
});
this.buttonSave.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
//
// Mark ourselves as saved
//
self.isSaved = true;
//
// Close the window
//
self.close();
}
});
}
protected void setupButtons() {
Object target = this.tableExpressions.getValue();
if (target == null) {
if (this.root instanceof AdviceExpressionsType) {
this.buttonAdd.setVisible(true);
this.buttonAdd.setCaption("Add Advice");
this.buttonRemove.setCaption("Remove Advice");
this.buttonClear.setCaption("Clear All Advice");
this.buttonClear.setVisible(true);
} else {
this.buttonAdd.setVisible(true);
this.buttonAdd.setCaption("Add Obligation");
this.buttonRemove.setCaption("Remove Obligation");
this.buttonClear.setCaption("Clear All Obligations");
this.buttonClear.setVisible(true);
}
this.buttonRemove.setEnabled(false);
} else {
if (target instanceof AdviceExpressionType ||
target instanceof ObligationExpressionType) {
this.buttonAdd.setVisible(true);
this.buttonAdd.setCaption("Add Assignment");
if (target instanceof AdviceExpressionType) {
this.buttonRemove.setCaption("Remove Advice");
} else {
this.buttonRemove.setCaption("Remove Obligation");
}
this.buttonClear.setCaption("Clear All Assignments");
this.buttonClear.setVisible(true);
} else {
this.buttonAdd.setVisible(false);
this.buttonRemove.setCaption("Remove Assignment");
this.buttonClear.setVisible(false);
}
this.buttonRemove.setEnabled(true);
}
if (this.tableExpressions.size() == 0) {
this.buttonClear.setEnabled(false);
} else {
this.buttonClear.setEnabled(true);
}
}
protected void editAttribute(Object target, final AttributeAssignmentExpressionType parent) {
//
// Make a copy
//
final AttributeAssignmentExpressionType copyAssignment = (parent == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(parent));
//
// Prompt user for attribute right away
//
final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, copyAssignment.getExpression() != null ? copyAssignment.getExpression().getValue() : null, null, self.variables);
builder.setCaption("Define Assignment Attribute");
builder.setModal(true);
builder.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (builder.isSaved() == false) {
return;
}
//
// Yes - update it
//
parent.setExpression(copyAssignment.getExpression());
if (parent.getExpression() != null) {
self.container.removeItem(parent.getExpression().getValue());
}
self.container.addItem(copyAssignment.getExpression().getValue(), parent);
//
// Set the table size
//
self.tableExpressions.setPageLength(self.container.size() + 1);
}
});
builder.center();
UI.getCurrent().addWindow(builder);
}
protected void editExpression(final AttributeAssignmentExpressionType assignment, final Object parent) {
//
// Copy
//
final AttributeAssignmentExpressionType copyAssignment = (assignment == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(assignment));
//
// Create the window
//
final AttributeAssignmentExpressionEditorWindow window = new AttributeAssignmentExpressionEditorWindow(copyAssignment);
window.setCaption(assignment == null ? "Create Attribute Assignment" : "Edit Attribute Assignment");
window.setModal(true);
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user click save?
//
if (window.isSaved() == false) {
return;
}
//
// Was this a new assignment?
//
if (assignment == null) {
//
// Prompt user for attribute right away
//
final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, null, null, self.variables);
builder.setCaption("Define Assignment Attribute");
builder.setModal(true);
builder.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (builder.isSaved() == false) {
return;
}
//
// Yes - add it to the container
//
if (self.container.addItem(copyAssignment, parent) == null) {
logger.error("Failed to add copy assignment");
assert false;
}
//
// Set the table size
//
self.tableExpressions.setPageLength(self.container.size() + 1);
}
});
builder.center();
UI.getCurrent().addWindow(builder);
} else {
//
// No - copy back the data
//
assignment.setAttributeId(copyAssignment.getAttributeId());
assignment.setIssuer(assignment.getIssuer());
assignment.setCategory(copyAssignment.getCategory());
//
// Update the container
//
self.container.updateItem(assignment);
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editAdvice(final AdviceExpressionType advice) {
//
// Copy the advice
//
final AdviceExpressionType copyAdvice = (advice == null ? new AdviceExpressionType() : XACMLObjectCopy.copy(advice));
//
// Setup the window
//
final AdviceEditorWindow window = new AdviceEditorWindow(copyAdvice);
window.setCaption("Edit Advice");
window.setModal(true);
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Is it saved?
//
if (window.isSaved() == false) {
return;
}
//
// Was this a new object?
//
if (advice == null) {
//
// New - add it to the container
//
if (self.container.addItem(copyAdvice) == null) {
logger.error("failed to add advice");
assert false;
}
//
// Set the table size
//
self.tableExpressions.setPageLength(self.container.size() + 1);
} else {
//
// No - copy it back
//
advice.setAdviceId(copyAdvice.getAdviceId());
advice.setAppliesTo(copyAdvice.getAppliesTo());
//
// Update
//
self.container.updateItem(advice);
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editObligation(final ObligationExpressionType obligation) {
//
// Copy the advice
//
final ObligationExpressionType copyObligation = (obligation == null ? new ObligationExpressionType() : XACMLObjectCopy.copy(obligation));
//
// Setup the window
//
final ObligationEditorWindow window = new ObligationEditorWindow(copyObligation);
window.setCaption("Edit Obligation");
window.setModal(true);
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Is it saved?
//
if (window.isSaved() == false) {
return;
}
//
// Was this a new object?
//
if (obligation == null) {
//
// New - add it to the container
//
if (self.container.addItem(copyObligation) == null) {
logger.error("Failed to add obligation");
assert false;
}
//
// Set the table size
//
self.tableExpressions.setPageLength(self.container.size() + 1);
} else {
//
// No - copy it back
//
obligation.setObligationId(copyObligation.getObligationId());
obligation.setFulfillOn(copyObligation.getFulfillOn());
//
// Update
//
self.container.updateItem(obligation);
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
public boolean isSaved() {
return this.isSaved;
}
public Object getRootObject() {
return this.root;
}
@AutoGenerated
private VerticalLayout buildMainLayout() {
// common part: create layout
mainLayout = new VerticalLayout();
mainLayout.setImmediate(false);
mainLayout.setWidth("100%");
mainLayout.setHeight("-1px");
mainLayout.setMargin(true);
mainLayout.setSpacing(true);
// top-level component properties
setWidth("-1px");
setHeight("-1px");
// horizontalLayout_1
horizontalLayout_1 = buildHorizontalLayout_1();
mainLayout.addComponent(horizontalLayout_1);
// tableExpressions
tableExpressions = new TreeTable();
tableExpressions.setCaption("Expressions");
tableExpressions.setImmediate(false);
tableExpressions.setWidth("100%");
tableExpressions.setHeight("-1px");
mainLayout.addComponent(tableExpressions);
mainLayout.setExpandRatio(tableExpressions, 1.0f);
// buttonSave
buttonSave = new Button();
buttonSave.setCaption("Save");
buttonSave.setImmediate(false);
buttonSave.setWidth("-1px");
buttonSave.setHeight("-1px");
mainLayout.addComponent(buttonSave);
mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
return mainLayout;
}
@AutoGenerated
private HorizontalLayout buildHorizontalLayout_1() {
// common part: create layout
horizontalLayout_1 = new HorizontalLayout();
horizontalLayout_1.setImmediate(false);
horizontalLayout_1.setWidth("-1px");
horizontalLayout_1.setHeight("-1px");
horizontalLayout_1.setMargin(false);
horizontalLayout_1.setSpacing(true);
// buttonAdd
buttonAdd = new Button();
buttonAdd.setCaption("Add Expression");
buttonAdd.setImmediate(false);
buttonAdd.setWidth("-1px");
buttonAdd.setHeight("-1px");
horizontalLayout_1.addComponent(buttonAdd);
// buttonRemove
buttonRemove = new Button();
buttonRemove.setCaption("Remove Expression");
buttonRemove.setImmediate(false);
buttonRemove.setWidth("-1px");
buttonRemove.setHeight("-1px");
horizontalLayout_1.addComponent(buttonRemove);
// buttonClear
buttonClear = new Button();
buttonClear.setCaption("Clear Expressions");
buttonClear.setImmediate(false);
buttonClear.setWidth("-1px");
buttonClear.setHeight("-1px");
horizontalLayout_1.addComponent(buttonClear);
return horizontalLayout_1;
}
}