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

fr.ird.observe.client.form.spi.init.TabInfoInitializer Maven / Gradle / Ivy

package fr.ird.observe.client.form.spi.init;

/*-
 * #%L
 * ObServe Toolkit :: Common Client
 * %%
 * Copyright (C) 2008 - 2017 IRD, Ultreia.io
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * .
 * #L%
 */

import com.google.common.collect.ImmutableCollection;
import fr.ird.observe.client.form.FormUI;
import fr.ird.observe.client.form.FormUIHandler;
import fr.ird.observe.client.form.spi.FormUIComponentInitializerSupport;
import fr.ird.observe.client.form.spi.FormUIInitializerContext;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashSet;
import java.util.Set;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import org.nuiton.jaxx.runtime.swing.TabInfo;
import org.nuiton.jaxx.validator.swing.SwingValidatorMessage;
import org.nuiton.jaxx.validator.swing.SwingValidatorMessageTableModel;
import org.nuiton.validator.NuitonValidatorScope;

/**
 * Created by tchemit on 20/09/17.
 *
 * @author Tony Chemit - [email protected]
 */
public class TabInfoInitializer> extends FormUIComponentInitializerSupport {

    public TabInfoInitializer() {
        super(TabInfo.class);
    }

    @Override
    public void init(V context, TabInfo component) {
        if (component.getProperties() != null) {
            context.registerMainTabModel(component);
            MyPropertyChangeListener listener = new MyPropertyChangeListener(component);
            component.addPropertyChangeListener(TabInfo.VALID_PROPERTY, listener);
        }
    }

    public static  void install(U ui, ImmutableCollection components) {
        MyTableModelListener listener = new MyTableModelListener(components);
        ui.getErrorTableModel().addTableModelListener(listener);
    }

    public static  void onOpenUi(U ui, ImmutableCollection components) {
        onTableModelChanged(ui.getErrorTableModel(), components);
    }

    public static  void onCloseSafe(U ui) {
        for (TableModelListener tableModelListener : ui.getErrorTableModel().getTableModelListeners()) {
            if (tableModelListener instanceof MyTableModelListener) {
                ui.getErrorTableModel().removeTableModelListener(tableModelListener);
                break;
            }
        }
    }

    static void onTableModelChanged(SwingValidatorMessageTableModel errorTableModel, ImmutableCollection components) {
        Set errorProperties = new HashSet<>();
        int rowCount = errorTableModel.getRowCount();
        for (int i = 0; i < rowCount; i++) {
            SwingValidatorMessage row = errorTableModel.getRow(i);
            if (NuitonValidatorScope.ERROR.equals(row.getScope())) {
                errorProperties.add(row.getField());
            }
        }
        for (TabInfo tabModel : components) {
            boolean valid = !errorProperties.removeAll(tabModel.getProperties());
            tabModel.setValid(valid);
        }
    }

    private static class MyTableModelListener implements TableModelListener {

        private final ImmutableCollection components;

        MyTableModelListener(ImmutableCollection components) {
            this.components = components;
        }

        @Override
        public void tableChanged(TableModelEvent e) {

            SwingValidatorMessageTableModel errorTableModel = (SwingValidatorMessageTableModel) e.getSource();

            onTableModelChanged(errorTableModel, components);
        }
    }

    private static class MyPropertyChangeListener implements PropertyChangeListener {
        private final TabInfo component;

        MyPropertyChangeListener(TabInfo component) {
            this.component = component;
        }

        @Override
        public void propertyChange(PropertyChangeEvent e) {
            Boolean newValue = (Boolean) e.getNewValue();
            component.setIcon(newValue ? null : FormUIHandler.ERROR_ICON);
        }
    }
}