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

org.jdesktop.swingx.prompt.BuddySupport Maven / Gradle / Ivy

There is a newer version: 1.7.2
Show newest version
package org.jdesktop.swingx.prompt;

import org.jdesktop.swingx.plaf.TextUIWrapper;

import javax.swing.Box;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.plaf.basic.BasicTextUI;
import java.awt.Component;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class BuddySupport {

    public enum Position {
        LEFT, RIGHT
    }

    public static final String OUTER_MARGIN = "outerMargin";

    public static void addLeft(Component c, JTextField textField) {
        add(c, Position.LEFT, textField);
    }

    public static void addRight(Component c, JTextField textField) {
        add(c, Position.RIGHT, textField);
    }

    public static void add(Component c, Position pos, JTextField textField) {
        TextUIWrapper.getDefaultWrapper().install(textField, true);

        List leftBuddies = buddies(Position.LEFT, textField);
        List rightBuddies = buddies(Position.RIGHT, textField);

        // ensure buddies are added
        setLeft(textField, leftBuddies);
        setRight(textField, rightBuddies);

        // check if component is already here
        if (isBuddy(c, textField)) {
            throw new IllegalStateException("Component already added.");
        }

        if (Position.LEFT == pos) {
            leftBuddies.add(c);
        } else {
            rightBuddies.add(0, c);
        }

        addToComponentHierarchy(c, pos, textField);
    }

    public static void addGap(int width, Position pos, JTextField textField) {
        add(createGap(width), pos, textField);
    }

    public static void setRight(JTextField textField, List rightBuddies) {
        set(rightBuddies, Position.RIGHT, textField);
    }

    public static void setLeft(JTextField textField, List leftBuddies) {
        set(leftBuddies, Position.LEFT, textField);
    }

    public static void set(List buddies, Position pos, JTextField textField) {
        textField.putClientProperty(pos, buddies);
    }

    private static void addToComponentHierarchy(Component c, Position pos, JTextField textField) {
        textField.add(c, pos.toString());
    }

    public static List getLeft(JTextField textField) {
        return getBuddies(Position.LEFT, textField);
    }

    public static List getRight(JTextField textField) {
        return getBuddies(Position.RIGHT, textField);
    }

    public static List getBuddies(Position pos, JTextField textField) {
        return Collections.unmodifiableList(buddies(pos, textField));
    }

    @SuppressWarnings("unchecked")
    private static List buddies(Position pos, JTextField textField) {
        List buddies = (List) textField.getClientProperty(pos);

        if (buddies != null) {
            return buddies;
        }
        return new ArrayList<>();
    }

    public static boolean isBuddy(Component c, JTextField textField) {
        return buddies(Position.LEFT, textField).contains(c) || buddies(Position.RIGHT, textField).contains(c);
    }

    /**
     * Because {@link BasicTextUI} removes all components when uninstalled and
     * therefore all buddies are removed when the LnF changes.
     *
     * @param c
     * @param textField
     */
    public static void remove(JComponent c, JTextField textField) {
        buddies(Position.LEFT, textField).remove(c);
        buddies(Position.RIGHT, textField).remove(c);

        textField.remove(c);
    }

    public static void removeAll(JTextField textField) {
        List left = buddies(Position.LEFT, textField);
        for (Component c : left) {
            textField.remove(c);
        }
        left.clear();
        List right = buddies(Position.RIGHT, textField);
        for (Component c : right) {
            textField.remove(c);
        }
        right.clear();
    }

    public static void setOuterMargin(JTextField buddyField, Insets margin) {
        buddyField.putClientProperty(OUTER_MARGIN, margin);
    }

    public static Insets getOuterMargin(JTextField buddyField) {
        return (Insets) buddyField.getClientProperty(OUTER_MARGIN);
    }

    public static void ensureBuddiesAreInComponentHierarchy(JTextField textField) {
        for (Component c : getLeft(textField)) {
            addToComponentHierarchy(c, Position.LEFT, textField);
        }
        for (Component c : getRight(textField)) {
            addToComponentHierarchy(c, Position.RIGHT, textField);
        }
    }

    /**
     * Create a gap to insert between to buddies.
     *
     * @param width
     */
    public static Component createGap(int width) {
        return Box.createHorizontalStrut(width);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy