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

com.codename1.impl.javase.simulator.PropertyDetailsPanel Maven / Gradle / Ivy

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.codename1.impl.javase.simulator;

import com.codename1.io.Log;
import com.codename1.ui.Component;
import java.awt.BorderLayout;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author shannah
 */
public class PropertyDetailsPanel extends JPanel {
    private JTable propertiesTable;
    private JTextField filter;
    private Component currentComponent;
    private Map propertiesMap = new LinkedHashMap();
    private List propertiesList = new ArrayList();
    private PropertiesTableRowSorter rowSorter;
    
    
    public PropertyDetailsPanel() {
        buildUI();
    }
    
    public void setCurrentComponent(Component currentComponent) {
        if (currentComponent != this.currentComponent) {
            this.currentComponent = currentComponent;
            update();
        }
    }
    
    private void buildUI() {
        setLayout(new BorderLayout());
        propertiesTable = new JTable(new PropertiesTableModel());
        rowSorter = new PropertiesTableRowSorter((PropertiesTableModel) propertiesTable.getModel());
        propertiesTable.setRowSorter(rowSorter);
        filter = new JTextField();
        filter.putClientProperty("JTextField.variant", "search");
        filter.setToolTipText("Filter properties");
        filter.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                rowSorter.updateFilter();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                rowSorter.updateFilter();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                rowSorter.updateFilter();
            }
        });
        JScrollPane scroller = new JScrollPane(propertiesTable);
        add(filter, BorderLayout.NORTH);
        add(scroller, BorderLayout.CENTER);

        
    }
    
    private void update() {
        updateProperties(currentComponent);
        revalidate();
        
    }
    
    private static String methodPropertyName_(String name) {
        return name.startsWith("get") ? name.substring(3) : name.startsWith("is") ? name.substring(2) : name;
    }
    
    private class ComponentProperty {
        private Method setter, getter;
        private String name;
        private Component cmp;
        
        Object getValue() {
            if (getter != null) {
                try {
                    return getter.invoke(cmp, new Object[0]);
                } catch (Exception ex){}
            }
            return null;
        }
        
        String getStringValue() {
            return String.valueOf(getValue());
        }
        
        void setValue(Object value) {
            if (setter != null) {
                try {
                    setter.invoke(cmp, new Object[]{value});
                
                } catch (Exception ex) {
                    Log.e(ex);
                }
            }
        }
    }
    
    private void addGetter(String propertyName, Method getter) {
        ComponentProperty prop = propertiesMap.get(propertyName);
        if (prop == null) {
            prop = new ComponentProperty();
            prop.name = propertyName;
            prop.cmp = currentComponent;
            propertiesMap.put(propertyName, prop);
            propertiesList.add(prop);
        }
        prop.getter = getter;
    }
    
    private void addSetter(String propertyName, Method setter) {
        ComponentProperty prop = propertiesMap.get(propertyName);
        if (prop == null) {
            prop = new ComponentProperty();
            prop.name = propertyName;
            prop.cmp = currentComponent;
            propertiesMap.put(propertyName, prop);
            propertiesList.add(prop);
        }
        prop.setter = setter;
    }
    
    
    
    
    private void updateProperties(Object cmp) {
        
        propertiesMap.clear();
        propertiesList.clear();
        if (cmp == null) return;
        Class cls = cmp.getClass();
        Method[] methods = cls.getMethods();
        Arrays.sort(methods, new Comparator() {

            @Override
            public int compare(Method o1, Method o2) {
                return methodPropertyName_(o1.getName()).toLowerCase().compareTo(methodPropertyName_(o2.getName()).toLowerCase());
            }
        });
       
        for (int i=0; i {

        PropertiesTableRowSorter(PropertiesTableModel model) {
            super(model);
            if (filter != null && filter.getText().length() > 0) {
                setRowFilter(RowFilter.regexFilter(filter.getText(), 0));
            } else {
                setRowFilter(null);
            }
        }

        void updateFilter() {

            if (filter != null && !filter.getText().isEmpty()) {
                setRowFilter(RowFilter.regexFilter(filter.getText(), 0));
            } else {
                setRowFilter(null);
            }
        }
    }
   
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy