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

jdplus.toolkit.desktop.plugin.ui.properties.l2fprod.NamedParametersEditor Maven / Gradle / Ivy

package jdplus.toolkit.desktop.plugin.ui.properties.l2fprod;

import com.l2fprod.common.beans.editor.AbstractPropertyEditor;
import jdplus.toolkit.base.api.data.Parameter;
import jdplus.toolkit.desktop.plugin.util.NbComponents;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Demortier Jeremy
 */
public class NamedParametersEditor extends AbstractPropertyEditor {

    private NamedParameters nparameters;

    public NamedParametersEditor() {
        editor = new JButton(new AbstractAction("...") {

            @Override
            public void actionPerformed(ActionEvent e) {
                Window ancestor = SwingUtilities.getWindowAncestor(editor);
                final ParametersEditorDlg dialog = new ParametersEditorDlg(ancestor, nparameters);
                dialog.setTitle("Coefficients");
                dialog.setVisible(true);
                if (dialog.dirty) {
                    fireChanged();
                }
            }
        });
    }

    void fireChanged() {
        NamedParameters old=nparameters;
        nparameters=new NamedParameters().addAll(old.all());
        firePropertyChange(old, nparameters);
    }

    @Override
    public Object getValue() {
        return nparameters;
    }

    @Override
    public void setValue(Object value) {

        if (null != value && value instanceof NamedParameters) {
            nparameters = (NamedParameters) value;
        }
    }

    @Override
    public String getAsText() {
        return "";
    }
}

class ParametersEditorDlg extends JDialog {

    NamedParameters parameters;
    Parameter[] initial;

    boolean dirty = false;

    public ParametersEditorDlg(final Window owner, NamedParameters parameters) {

        super(owner);
        this.parameters = parameters;
        this.initial = parameters.parameters();

        final JPanel pane = new JPanel(new BorderLayout());
        pane.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
        final JTable table = new JTable(
                new DefaultTableModel() {

            @Override
            public int getColumnCount() {
                return 3;
            }

            @Override
            public String getColumnName(int column) {
                return switch (column) {
                    case 0 ->
                        "Variable";
                    case 1 ->
                        "Fixed";
                    case 2 ->
                        "Value";
                    default ->
                        "";
                };
            }

            @Override
            public Class getColumnClass(int columnIndex) {
                return switch (columnIndex) {
                    case 0 ->
                        String.class;
                    case 1 ->
                        Boolean.class;
                    case 2 ->
                        Double.class;
                    default ->
                        null;
                };
            }

            @Override
            public boolean isCellEditable(int row, int column) {
                return column != 0;
            }

            @Override
            public int getRowCount() {
                return parameters.size();
            }

            @Override
            public Object getValueAt(int row, int column) {

                return switch (column) {
                    case 0 ->
                        parameters.get(row).getName();
                    case 1 ->
                        parameters.get(row).getObject().isFixed();
                    case 2 ->
                        parameters.get(row).getObject().getValue();
                    default ->
                        null;
                }; //== ParameterType.Fixed;
            }

            @Override
            public void setValueAt(Object aValue, int row, int column) {
                switch (column) {
                    case 2 -> {
                        double val = Double.parseDouble(aValue.toString());
                        Parameter p = parameters.get(row).getObject();
                        if (p.isFixed()) {
                            p = Parameter.fixed(val);
                        } else if (val == 0) {
                            p = Parameter.undefined();
                        } else {
                            p = Parameter.initial(val);
                        }
                        parameters.set(row, p);
                    }
                    case 1 -> {
                        Boolean f = (Boolean) aValue;
                        Parameter p = parameters.get(row).getObject();
                        if (f) {
                            p = Parameter.fixed(p.getValue());
                        } else {
                            p = Parameter.initial(p.getValue());
                        }
                        parameters.set(row, p);
                    }
                }

                fireTableCellUpdated(row, column);
            }
        });
        table.setFillsViewportHeight(true);
        final JPanel buttonPane = new JPanel();
        BoxLayout layout = new BoxLayout(buttonPane, BoxLayout.LINE_AXIS);
        buttonPane.setLayout(layout);
        final JButton restoreButton = new JButton("Restore");
        restoreButton.setPreferredSize(new Dimension(80, 27));
        restoreButton.setFocusPainted(false);
        restoreButton.setEnabled(true);
        restoreButton.addActionListener(ev -> {
            try {
                parameters.set(initial);
                dirty = false;
                SwingUtilities.invokeLater(() -> {
                    table.updateUI();
                });

            } catch (Exception ex) {
                System.err.println(ex.getMessage());
            }
        });
        buttonPane.add(restoreButton);

        buttonPane.add(Box.createGlue());
        final JButton okButton = new JButton("Ok");
        okButton.setPreferredSize(new Dimension(80, 27));
        okButton.addActionListener(ev -> {
            dirty = true;
            ParametersEditorDlg.this.setVisible(false);
        });
        okButton.setFocusPainted(false);
        buttonPane.add(okButton);
        final JButton cancelButton = new JButton("Cancel");
        cancelButton.setPreferredSize(new Dimension(80, 27));
        cancelButton.setFocusPainted(false);
        cancelButton.addActionListener(ev -> {
            parameters.set(initial);
            dirty = false;
            ParametersEditorDlg.this.setVisible(false);
        });
        buttonPane.add(cancelButton);

        buttonPane.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
        pane.add(buttonPane, BorderLayout.SOUTH);

        pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        pane.add(NbComponents.newJScrollPane(table), BorderLayout.CENTER);
        setMinimumSize(new Dimension(150, 200));
        setContentPane(pane);
        pack();
        setLocationRelativeTo(owner);
        setModal(true);
    }

    public NamedParameters getParameters() {
        return parameters;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy