package CHAPTER11;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

// 키보드 입력 이벤트를 처리하는 클래스 (실시간 필터링 기능 제공)
class SearchKeyAdapter extends KeyAdapter {
    private JTextField searchField;
    private DefaultListModel<String> listModel;
    private ArrayList<String> allItems; // 모든 항목을 저장할 리스트

    public SearchKeyAdapter(JTextField searchField, DefaultListModel<String> listModel, ArrayList<String> allItems) {
        this.searchField = searchField;
        this.listModel = listModel;
        this.allItems = allItems;
    }

    @Override
    public void keyReleased(KeyEvent e) {
        String filter = searchField.getText().toLowerCase();
        listModel.clear();
        for (String item : allItems) {
            if (item.toLowerCase().contains(filter)) {
                listModel.addElement(item);
            }
        }
    }
}

public class REAL_SearchKeyAdapter extends JFrame {
    DefaultListModel<String> listModel = new DefaultListModel<>();
    ArrayList<String> initialItems = new ArrayList<>();

    // 초기 항목 추가 메서드
    public void initialItemsAdd(ArrayList<String> initialItems) {
        initialItems.add("Apple");
        initialItems.add("Banana");
        initialItems.add("Cherry");
        initialItems.add("Date");
        initialItems.add("Elderberry");
        initialItems.add("Fig");
        initialItems.add("Grape");
        initialItems.add("Honeydew");
        initialItems.add("Kiwi");
        initialItems.add("Lemon");
        initialItems.add("Mango");
        initialItems.add("Nectarine");
        initialItems.add("Orange");
        initialItems.add("Papaya");
        initialItems.add("Quince");
    }

    public REAL_SearchKeyAdapter() {
        setTitle("실시간 검색 및 추가 기능");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 검색 필드 생성
        JTextField searchField = new JTextField(15);

        // 기본 항목 목록 및 리스트 모델 생성
        listModel = new DefaultListModel<>();
        initialItems = new ArrayList<>();
        initialItemsAdd(initialItems);

        // 기존 항목을 리스트 모델에 추가
        listModel.addAll(initialItems);

        // 새로운 항목을 추가할 리스트
        ArrayList<String> allItems = new ArrayList<>(initialItems);

        JList<String> list = new JList<>(listModel);

        // 검색 필터링 기능 추가
        searchField.addKeyListener(new SearchKeyAdapter(searchField, listModel, allItems));

        // 새로운 아이템 추가를 위한 입력 필드 생성
        JTextField addItemField = new JTextField(15);
        JButton addButton = new JButton("Add Item");

        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String newItem = addItemField.getText().trim();
                if (!newItem.isEmpty() && !allItems.contains(newItem)) {
                    allItems.add(newItem);  // 새로운 항목 추가
                    listModel.addElement(newItem);  // 리스트 모델에 추가
                    addItemField.setText(""); // 추가 입력 필드 초기화
                } else {
                    JOptionPane.showMessageDialog(null, "항목이 이미 존재하거나 빈 값입니다.", "오류", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        // 선택한 항목을 삭제할 버튼 추가
        JButton deleteButton = new JButton("Delete Item");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String selectedItem = list.getSelectedValue();
                if (selectedItem != null) {
                    allItems.remove(selectedItem);  // 항목 리스트에서 제거
                    listModel.removeElement(selectedItem);  // 리스트 모델에서 제거
                } else {
                    JOptionPane.showMessageDialog(null, "삭제할 항목을 선택하세요.", "오류", JOptionPane.WARNING_MESSAGE);
                }
            }
        });

        // 검색 필드와 추가 버튼을 위한 패널
        JPanel searchPanel = new JPanel();
        searchPanel.add(new JLabel("Search:"));
        searchPanel.add(searchField);

        JPanel addPanel = new JPanel();
        addPanel.add(new JLabel("New Item:"));
        addPanel.add(addItemField);
        addPanel.add(addButton);
        addPanel.add(deleteButton);  // 삭제 버튼 추가

        // 컴포넌트 프레임에 추가
        add(searchPanel, BorderLayout.NORTH);
        add(addPanel, BorderLayout.SOUTH);
        add(new JScrollPane(list), BorderLayout.CENTER);

        setVisible(true);
    }

    public static void main(String[] args) {
        new REAL_SearchKeyAdapter();
    }
}


//package CHAP12;
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.event.KeyAdapter;
//import java.awt.event.KeyEvent;
//import java.awt.event.ActionEvent;
//import java.awt.event.ActionListener;
//import java.util.ArrayList;
//
//// 키보드 입력 이벤트를 처리하는 클래스 (실시간 필터링 기능 제공)
//class SearchKeyAdapter extends KeyAdapter {
//    private JTextField searchField;
//    private DefaultListModel<String> listModel;
//    private ArrayList<String> allItems; // 모든 항목을 저장할 리스트
//
//    public SearchKeyAdapter(JTextField searchField, DefaultListModel<String> listModel, ArrayList<String> allItems) {
//        this.searchField = searchField;
//        this.listModel = listModel;
//        this.allItems = allItems;
//    }
//
//    @Override
//    public void keyReleased(KeyEvent e) {
//        String filter = searchField.getText().toLowerCase();
//        listModel.clear();
//        for (String item : allItems) {
//            if (item.toLowerCase().contains(filter)) {
//                listModel.addElement(item);
//            }
//        }
//    }
//}
//
//public class REAL_12_SearchKeyAdapter extends JFrame {
//	DefaultListModel<String> listModel = new DefaultListModel<>();
//    ArrayList<String> initialItems = new ArrayList<>();
//    
//    public void initialItemsAdd(ArrayList<String> initialItems) {
//    	initialItems.add("Apple");
//    	initialItems.add("Banana");
//    	initialItems.add("Cherry");
//    	initialItems.add("Date");
//    	initialItems.add("Elderberry");
//    	initialItems.add("Fig");
//    	initialItems.add("Grape");
//    	initialItems.add("Honeydew");
//    	initialItems.add("Kiwi");
//    	initialItems.add("Lemon");
//    	initialItems.add("Mango");
//    	initialItems.add("Nectarine");
//    	initialItems.add("Orange");
//    	initialItems.add("Papaya");
//    	initialItems.add("Quince");
//    }
//    public REAL_12_SearchKeyAdapter() {
//        setTitle("실시간 검색 및 추가 기능");
//        setSize(400, 400);
//        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        setLayout(new BorderLayout());
//
//        // 검색 필드 생성
//        JTextField searchField = new JTextField(15);
//
//        // 기본 항목 목록 및 리스트 모델 생성
//        listModel = new DefaultListModel<>();
//        initialItems = new ArrayList<>();
//        initialItemsAdd(initialItems);
//
//        // 기존 항목을 리스트 모델에 추가
//        listModel.addAll(initialItems);
//
//        // 새로운 항목을 추가할 리스트
//        ArrayList<String> allItems = new ArrayList<>(initialItems);
//
//        JList<String> list = new JList<>(listModel);
//
//        // 검색 필터링 기능 추가
//        searchField.addKeyListener(new SearchKeyAdapter(searchField, listModel, allItems));
//
//        // 새로운 아이템 추가를 위한 입력 필드 생성
//        JTextField addItemField = new JTextField(15);
//        JButton addButton = new JButton("Add Item");
//
//        addButton.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                String newItem = addItemField.getText().trim();
//                if (!newItem.isEmpty() && !allItems.contains(newItem)) {
//                    allItems.add(newItem);  // 새로운 항목 추가
//                    listModel.addElement(newItem);  // 리스트 모델에 추가
//                    addItemField.setText(""); // 추가 입력 필드 초기화
//                } else {
//                    JOptionPane.showMessageDialog(null, "항목이 이미 존재하거나 빈 값입니다.", "오류", JOptionPane.ERROR_MESSAGE);
//                }
//            }
//        });
//
//        // 검색 필드와 추가 버튼을 위한 패널
//        JPanel searchPanel = new JPanel();
//        searchPanel.add(new JLabel("Search:"));
//        searchPanel.add(searchField);
//
//        JPanel addPanel = new JPanel();
//        addPanel.add(new JLabel("New Item:"));
//        addPanel.add(addItemField);
//        addPanel.add(addButton);
//
//        // 컴포넌트 프레임에 추가
//        add(searchPanel, BorderLayout.NORTH);
//        add(addPanel, BorderLayout.SOUTH);
//        add(new JScrollPane(list), BorderLayout.CENTER);
//
//        setVisible(true);
//    }
//
//    public static void main(String[] args) {
//        new REAL_12_SearchKeyAdapter();
//    }
//}
