import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;


public class stringsearch extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    JButton fileselect_b, search_b, print_b, end_b;
    JTextField path_f, keyword_f, total_f;
    JTextArea result_f;
    JLabel announce1, announce2, announce3, kensuu, gyo, naiyo;
    JFrame f1;
    JScrollPane sl;
    JFileChooser fileselect;
    File file, cdirectory, filelist, filereader;
    JPanel p;

    int number, kensu, total;
    String path, keyword, read;
    String read2[] = new String[1000];

    //ボタンや入力欄を作る処理
    public stringsearch() {
        p = new JPanel();
        p.setLayout(null);

        f1 = new JFrame();
        this.setSize(500, 600);
        this.setTitle("ストリングスサーチ Var.0.01");

        fileselect_b = new JButton("ファイル選択");
        fileselect_b.setBounds(325, 40, 130, 25);
        fileselect_b.addActionListener(this);
        p.add(fileselect_b);

        path_f = new JTextField();
        path_f.setBounds(20, 40, 300, 25);
        p.add(path_f);

        announce1 = new JLabel("検索ファイル名の選択(直接入力可能)");
        announce1.setBounds(23, 18, 250, 25);
        p.add(announce1);

        search_b = new JButton("検索");
        search_b.setBounds(325, 100, 130, 25);
        search_b.addActionListener(this);
        p.add(search_b);

        keyword_f = new JTextField();
        keyword_f.setBounds(20, 100, 300, 25);
        p.add(keyword_f);

        announce2 = new JLabel("検索文字列の入力");
        announce2.setBounds(23, 80, 250, 25);
        p.add(announce2);

        print_b = new JButton("印字");
        print_b.setBounds(325, 150, 130, 25);
        p.add(print_b);

        result_f = new JTextArea(10, 10);
        result_f.setBounds(23, 200, 434, 300);
        p.add(result_f);

        end_b = new JButton("終了");
        end_b.setBounds(355, 525, 100, 25);
        end_b.addActionListener(this);
        p.add(end_b);

        announce3 = new JLabel("全検索数");
        announce3.setBounds(120, 150, 130, 25);
        p.add(announce3);

        kensuu = new JLabel("件数");
        kensuu.setBounds(23, 175, 250, 25);
        p.add(kensuu);

        gyo = new JLabel("行数");
        gyo.setBounds(100, 175, 250, 25);
        p.add(gyo);

        naiyo = new JLabel("内容");
        naiyo.setBounds(190, 175, 250, 25);
        p.add(naiyo);

        total_f = new JTextField();
        total_f.setBounds(175, 150, 60, 25);
        p.add(total_f);

        sl = new JScrollPane(result_f);
        sl.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        sl.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sl.setBounds(23, 200, 434, 300);
        p.add(sl);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        getContentPane().add(p, BorderLayout.CENTER);

    }

    public void actionPerformed(ActionEvent e) {
        //ファイル選択ボタンを押された時の処理
        if (e.getSource().equals(fileselect_b)) {
            result_f.setText("");
            total_f.setText("");
            total = 0;
            kensu = 0;

            fileselect = new JFileChooser();
            fileselect.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            fileselect.setDialogTitle("ファイルの選択");
            int selected = fileselect.showDialog(this, "選択");
            if (selected == JFileChooser.APPROVE_OPTION) {
                file = fileselect.getSelectedFile();
                path = file.getAbsolutePath();
                path_f.setText(path);
            } else if (selected == JFileChooser.CANCEL_OPTION) {
                path_f.setText("キャンセルされました。");
            } else if (selected == JFileChooser.ERROR_OPTION) {
                path_f.setText("エラーです。");
            }
        }
        //検索ボタンを押された時の処理
        if (e.getSource().equals(search_b)) {
            keyword = keyword_f.getText();
            int i = 0;
            total = 0;
            kensu = 0;
            if (path == null || keyword == null) {
                result_f.setText("検索文字列を入力してください");
            } else {
                result_f.setText("");
                try {
                    FileReader file = new FileReader(path);
                    BufferedReader br = new BufferedReader(file);

                    // マッチしたかを示す。一度マッチしたら true に変更する。
                    boolean matched = false;

                    // ファイル中の行番号
                    int lineNumber = 1;

                    // result_f 用メッセージ。マッチした結果はここに追加する。
                    StringBuilder message = new StringBuilder();

                    while ((read = br.readLine()) != null) {
                        System.out.println(read);

                        String str = new String(read);

                        if (str.indexOf(keyword) >= 0) {
                            matched = true;
                            total++;
                            kensu++;
                            message.append(kensu + "件          " + lineNumber + "行          " + read + "\n");
                        }

                        lineNumber++;
                    }

                    // 結果の出力 - 全検索数
                    total_f.setText(total + "件");

                    // 結果の出力 - 件数, 行数, 内容
                    if (matched) {
                        result_f.setText(message.toString());
                    } else {
                        result_f.setText("検索した文字列が見つかりません");
                    }

                    br.close();

                } catch (FileNotFoundException e2) {
                    result_f.setText("読み込めませんでした。");
                } catch (IOException e2) {
                    result_f.setText("読み込めませんでした。");
                }
            }
        }

        if (e.getSource().equals(end_b)) {
            System.exit(0);
        }
    }

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

    }
}