All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.as.console.client.shared.viewframework.TabbedFormLayoutPanel Maven / Gradle / Ivy

Go to download

Bundles the core AS7 console as a GWT module. Includes minor customizations to support extensions.

There is a newer version: 0.7.0.Final
Show newest version
/*
 * 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;

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy