org.jboss.as.console.client.shared.viewframework.TabbedFormLayoutPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of switchyard-console-as7-core
Show all versions of switchyard-console-as7-core
Bundles the core AS7 console as a GWT module. Includes minor customizations to support extensions.
/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.jboss.as.console.client.shared.viewframework;
import com.google.gwt.event.logical.shared.BeforeSelectionEvent;
import com.google.gwt.event.logical.shared.BeforeSelectionHandler;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.as.console.client.widgets.forms.AddressBinding;
import org.jboss.as.console.client.widgets.forms.FormMetaData;
import org.jboss.as.console.client.widgets.forms.FormToolStrip;
import org.jboss.as.console.client.widgets.forms.PropertyBinding;
import org.jboss.ballroom.client.widgets.forms.DisclosureGroupRenderer;
import org.jboss.ballroom.client.widgets.forms.EditListener;
import org.jboss.ballroom.client.widgets.forms.Form;
import org.jboss.ballroom.client.widgets.forms.FormAdapter;
import org.jboss.ballroom.client.widgets.forms.FormItem;
import org.jboss.ballroom.client.widgets.forms.FormValidation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Makes a Form with items automatically separated onto tabs.
*
* Note that this class doesn't yet support grouped FormItems.
*
* @author Stan Silvert [email protected] (C) 2011 Red Hat Inc.
* @author Heiko Braun
*/
public class TabbedFormLayoutPanel implements FormAdapter, SingleEntityView {
private Class beanType;
private FormMetaData formMetaData;
private FormItemObserver[] observers;
private Map> forms;
private List listeners = new ArrayList();
private FormAdapter lastFormAdded;
private Map tools = new HashMap();
private List formItemNames = new ArrayList();
private TabPanel tabPanel;
private EntityToDmrBridge bridge;
private AddressBinding address;
private List> additionalViews = Collections.EMPTY_LIST;
private final EnumSet hideButtons;
public TabbedFormLayoutPanel(Class beanType, FormMetaData formMetaData, EnumSet hideButtons,
FormItemObserver... observers) {
this.beanType = beanType;
this.formMetaData = formMetaData;
this.observers = observers;
this.tabPanel = new TabPanel();
this.tabPanel.setStyleName("default-tabpanel");
this.forms = makeForms();
this.hideButtons = hideButtons;
}
public Widget asWidget() {
// populate tabs
Set keys = forms.keySet();
for(String key : keys) {
VerticalPanel layout = new VerticalPanel();
layout.setStyleName("fill-layout-width");
final FormAdapter form = forms.get(key);
// toolstrip
final FormToolStrip toolStrip = new FormToolStrip(
form,
new FormToolStrip.FormCallback() {
@Override
public void onSave(Map changeset) {
bridge.onSaveDetails(form.getEditedEntity(), form.getChangedValues());
}
@Override
public void onDelete(T entity) {
bridge.onRemove(entity);
}
}
);
tools.put(key, toolStrip);
// belongs to top level tools
toolStrip.providesDeleteOp(false);
toolStrip.providesEditSaveOp(!hideButtons.contains(FrameworkButton.EDIT_SAVE));
layout.add(toolStrip.asWidget());
// help widget
if (address != null) {
layout.add(HelpWidgetFactory.makeHelpWidget(address, form));
}
layout.add(form);
// add to tab panel
tabPanel.add(layout, key);
}
// cancel when switching forms
tabPanel.addBeforeSelectionHandler(new BeforeSelectionHandler() {
@Override
public void onBeforeSelection(BeforeSelectionEvent event) {
cancel();
}
});
// additional views
for(SingleEntityView tabView : additionalViews)
tabPanel.add(tabView.asWidget(), tabView.getTitle());
tabPanel.selectTab(0);
return tabPanel;
}
@Override
public void updatedEntity(T entity) {
for (FormAdapter form : forms.values()) {
form.edit(entity);
}
}
private Map> makeForms() {
Map> formsMap = new LinkedHashMap>();
for (Map.Entry> entry : formMetaData.getTabbedAttributes().entrySet())
{
if(!"CUSTOM".equals(entry.getKey())) // handled manually
{
FormAdapter form = makeForm(entry.getValue());
formsMap.put(entry.getKey(), form);
formItemNames.addAll(form.getFormItemNames());
this.lastFormAdded = form;
}
}
return formsMap;
}
private FormAdapter makeForm(List bindings) {
Form form = new Form(beanType);
if (bindings.size() < 3) {
form.setNumColumns(1);
} else {
form.setNumColumns(2);
}
List baseBindings = formMetaData.getBaseAttributes();
// FormItem[][] items = new FormItem[baseBindings.size()][];
List items = new ArrayList();
// for (PropertyBinding propBinding : baseBindings) {
for (PropertyBinding propBinding : bindings) {
if (baseBindings.contains(propBinding)) {
items.add(propBinding.getFormItemForEdit(observers));
}
}
form.setFields(items.toArray(new FormItem[items.size()][]));
for (String subgroup : formMetaData.getGroupNames()) {
List groupBindings = formMetaData.getGroupedAttribtes(subgroup);
// FormItem[][] groupItems = new FormItem[groupBindings.size()][];
List groupItems = new ArrayList();
// for (PropertyBinding propBinding : groupBindings) {
for (PropertyBinding propBinding : bindings) {
if (groupBindings.contains(propBinding)) {
groupItems.add(propBinding.getFormItemForEdit(observers));
}
}
if (groupItems.size() > 0) {
form.setFieldsInGroup(subgroup, new DisclosureGroupRenderer(), groupItems.toArray(new FormItem[groupItems.size()][]));
}
}
return form;
}
@Override
public void edit(T bean) {
for (FormAdapter form : forms.values()) {
form.edit(bean);
}
for (SingleEntityView subView : additionalViews) {
subView.updatedEntity(bean);
}
notifyListeners(bean);
}
protected void notifyListeners(T bean) {
for (EditListener listener : listeners) {
listener.editingBean(bean);
}
}
@Override
public void addEditListener(EditListener listener) {
this.listeners.add(listener);
}
@Override
public void bind(CellTable table) {
for (FormAdapter form : forms.values()) {
form.bind(table);
}
}
@Override
public void cancel() {
Set keys = forms.keySet();
for (String key : keys) {
tools.get(key).doCancel();
}
}
@Override
public Map getChangedValues() {
Map changedValues = new HashMap();
for (FormAdapter form : forms.values()) {
changedValues.putAll(form.getChangedValues());
}
return changedValues;
}
@Override
public Class getConversionType() {
return this.beanType;
}
@Override
public T getEditedEntity() {
return this.lastFormAdded.getEditedEntity();
}
@Override
public List getFormItemNames() {
return this.formItemNames;
}
@Override
public T getUpdatedEntity() {
return this.lastFormAdded.getUpdatedEntity();
}
@Override
public void removeEditListener(EditListener listener) {
this.listeners.remove(listener);
}
@Override
public void setEnabled(boolean isEnabled) {
Set keys = forms.keySet();
for (String key : keys) {
FormAdapter form = forms.get(key);
form.setEnabled(isEnabled);
}
}
@Override
public FormValidation validate() {
FormValidation formValidation = new FormValidation();
for (FormAdapter form : forms.values()) {
FormValidation tabValidation = form.validate();
for (String error : tabValidation.getErrors()) {
formValidation.addError(error);
}
}
return formValidation;
}
public void add(Widget widget, String title) {
tabPanel.add(widget, title);
}
public void setBridge(EntityToDmrBridge bridge) {
this.bridge = bridge;
}
public void setHelpAddress(AddressBinding address) {
this.address = address;
}
@Override
public void clearValues() {
Set keys = forms.keySet();
for (String key : keys) {
FormAdapter form = forms.get(key);
form.clearValues();
}
}
@Override
public String getTitle() {
// no title for composite
return null;
}
public void setAdditionalViews(List> additionalViews) {
this.additionalViews = additionalViews;
}
}