/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved. * * The contents of this file are subject to the terms of the GNU * General Public License Version 3 only ("GPL"). * You may not use this file except in compliance with the License. * You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html * See the License for the specific language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each file. * */ package org.jopendocument.tools; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.jopendocument.io.ODTContentExtractor; /** * A small application to find documents containing a given text */ public class ContentFinder extends JFrame { private static final long serialVersionUID = -8535510980733968129L; private File selectedDir; final JTextField textFieldFolder = new JTextField(200); public ContentFinder() { JPanel p = new JPanel(); p.setLayout(new BorderLayout()); p.add(new JLabel("Explore folder:"), BorderLayout.WEST); p.add(textFieldFolder, BorderLayout.CENTER); final JButton buttonSelection = new JButton("Select folder"); buttonSelection.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openSelectionDialog(); } }); p.add(buttonSelection, BorderLayout.EAST); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(new JLabel("Find text:"), BorderLayout.WEST); final JTextField textFieldRecherche = new JTextField(200); mainPanel.add(textFieldRecherche, BorderLayout.CENTER); final JLabel status = new JLabel(""); mainPanel.add(status, BorderLayout.SOUTH); final JTextArea result = new JTextArea(); result.setEditable(false); JScrollPane scroll = new JScrollPane(result); final JButton searchButton = new JButton("Find"); searchButton.setEnabled(false); // JPanel framePanel = new JPanel(); framePanel.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.weightx = 1; c.weighty = 0; c.gridx = 0; c.gridy = 0; c.fill = GridBagConstraints.HORIZONTAL; c.insets = new Insets(2, 2, 2, 2); framePanel.add(p, c); // c.gridy++; framePanel.add(mainPanel, c); // c.gridy++; c.weighty = 1; c.fill = GridBagConstraints.BOTH; framePanel.add(scroll, c); // c.gridy++; c.gridy++; c.weightx = 0; c.weighty = 0; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.EAST; framePanel.add(searchButton, c); this.setContentPane(framePanel); searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { searchButton.setEnabled(false); if (selectedDir == null) { openSelectionDialog(); } Runnable r = new Runnable() { public void run() { if (selectedDir != null && selectedDir.isDirectory()) { File files[] = selectedDir.listFiles(); result.setText(""); for (int i = 0; i < files.length; i++) { File file = files[i]; final String name = file.getName(); if (name.endsWith(".sxw") || name.endsWith(".sxc") || name.endsWith(".ods") || name.endsWith(".odt")) { updateStatus("Looking at:" + file.getAbsolutePath()); ODTContentExtractor l = new ODTContentExtractor(file); try { l.load(); } catch (IOException e) { e.printStackTrace(); } if (l.containsIgnoreCase(textFieldRecherche.getText())) { result.append(file.getAbsolutePath() + "\n"); } } updateStatus("Done"); } } SwingUtilities.invokeLater(new Runnable() { public void run() { searchButton.setEnabled(true); } }); } private void updateStatus(final String s) { SwingUtilities.invokeLater(new Runnable() { public void run() { status.setText(s); } }); } }; Thread th = new Thread(r); th.start(); } }); textFieldRecherche.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { checkDocument(); } private void checkDocument() { if (textFieldRecherche.getText().trim().length() == 0) { searchButton.setEnabled(false); } else { searchButton.setEnabled(true); } } public void insertUpdate(DocumentEvent e) { checkDocument(); } public void removeUpdate(DocumentEvent e) { checkDocument(); } }); textFieldFolder.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { checkDocument(); } private void checkDocument() { String fNma = textFieldFolder.getText().trim(); File f = new File(fNma); if (f.exists() && f.isDirectory()) { selectedDir = f; textFieldFolder.setBackground(Color.WHITE); } else { textFieldFolder.setBackground(new Color(255, 220, 110)); } } public void insertUpdate(DocumentEvent e) { checkDocument(); } public void removeUpdate(DocumentEvent e) { checkDocument(); } }); } protected void openSelectionDialog() { JFileChooser fChooser = new JFileChooser(); fChooser.setApproveButtonText("Look in folder..."); fChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (fChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File fi = fChooser.getSelectedFile(); if (fi != null && fi.isDirectory()) { this.selectedDir = fi; this.textFieldFolder.setText(fi.getAbsolutePath()); } } } public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); final JFrame f = new ContentFinder(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(new Dimension(800, 400)); f.setLocation(100, 100); f.setVisible(true); } }