gui.dialog.PlainTextDialog.java Source code

Java tutorial

Introduction

Here is the source code for gui.dialog.PlainTextDialog.java

Source

package gui.dialog;

import gui.FilenameFilter;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.ListCellRenderer;
import javax.swing.border.TitledBorder;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

import org.apache.log4j.Logger;
import org.apache.log4j.NDC;

import ctex.Main;

import database.Db;

/**
 * 
 * 
 * Driver:    Apache PDFBox - Java PDF Library
 * License: Apache License v2.0. 
 * Driver   http://sourceforge.net/projects/pdfbox/files/PDFBox/
 * Version: PDFBox-0.7.3
 * Driver    JAR Files PDFBox-0.7.3.jar, FontBox-0.1.0-dev.jar
 * 
 * 
 * TODO: autocomplete??? + add PDFLink to DB??? + markieren in TextPane: warscheinlich AbstractDocument
 */

public class PlainTextDialog extends javax.swing.JDialog {
    private static Logger logger = Logger.getLogger(PlainTextDialog.class);

    private static final long serialVersionUID = 1L;
    private javax.swing.JTextPane textArea = new javax.swing.JTextPane();
    private javax.swing.JButton autoText = new javax.swing.JButton(Main.myLang.getString("plain.auto"));
    private File file;
    private String entryType = "";
    private Db theDb = null;
    private int obj = -1;

    /* 
     *  Panel mit AuswahlListe von Optionen
     */
    private javax.swing.DefaultListModel typeListModel = new javax.swing.DefaultListModel();
    private javax.swing.JList typeList = new javax.swing.JList(typeListModel);

    /**
     *    @Constructor: CTex_Plain_Text_Dialog
     * 
     *    input: String entryType
     *  input: CTex_Db theDb
     * 
     */
    public PlainTextDialog(String entryType, Db theDb) {

        this.theDb = theDb;
        this.entryType = entryType;
        setTitle(Main.myLang.getString("plain.Text.title") + " " + entryType);

        getRootPane().registerKeyboardAction(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setResizable(false);
        setModal(true);
        setLayout(new BorderLayout());
        setPreferredSize(new java.awt.Dimension(700, 500));

        // Toolbar
        getContentPane().add(getToolbar(), BorderLayout.PAGE_START);

        // Haupt Panel "Text Area und JList mit erlaublen Typs
        getContentPane().add(getCenterPanel());

        getContentPane().add(getButtomPanel(), BorderLayout.PAGE_END);

        pack();
        setVisible(true);

    }

    /**
     *    @Method: getToolbar
     * 
     *    output: JToolBar
     * 
     *  initialisiert Toolbar
     */
    private javax.swing.JToolBar getToolbar() {

        javax.swing.JToolBar toolbar = new javax.swing.JToolBar();
        javax.swing.JButton claerArea = new javax.swing.JButton(
                new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/page.png")));
        claerArea.setToolTipText(Main.myLang.getString("plain.Text.cleartipp"));
        javax.swing.JButton openFile = new javax.swing.JButton(
                new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/folder.png")));
        openFile.setToolTipText(Main.myLang.getString("menu.file.openfile"));

        claerArea.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textArea.setText("");
            }
        });

        openFile.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pdfExtractor();
            }
        });

        toolbar.setFloatable(false);
        toolbar.add(claerArea);
        toolbar.add(openFile);

        return toolbar;
    }

    /**
     *    @Method: getCenterPanel
     * 
     *    output: JPanel
     * 
     *  initialisiert die mitlere Panel aus TextArea und TypeList
     */
    private javax.swing.JPanel getCenterPanel() {

        javax.swing.JPanel centerPanel = new javax.swing.JPanel();
        centerPanel.setLayout(new GridBagLayout());

        GridBagConstraints cons = new GridBagConstraints();
        cons.gridx = 0;
        cons.gridy = 0;
        cons.insets = new Insets(2, 2, 2, 2);

        centerPanel.add(getTextArea(), cons);
        cons.gridx = 1;
        centerPanel.add(getTypeList(), cons);

        return centerPanel;
    }

    /**
     *    @Method: getTextArea
     * 
     *    output: JPanel
     * 
     *  initialisiert TextArea
     */
    private javax.swing.JPanel getTextArea() {
        javax.swing.JPanel textPanel = new javax.swing.JPanel();
        TitledBorder title = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(java.awt.Color.black),
                Main.myLang.getString("plain.paste.text"));
        title.setTitleJustification(TitledBorder.CENTER);
        textPanel.setBorder(title);

        javax.swing.JScrollPane scroll = getScrolpane(textArea);
        scroll.setPreferredSize(new java.awt.Dimension(530, 370));

        textPanel.add(scroll);

        return textPanel;
    }

    /**
     *    @Method: getScrolpane
     * 
     *    output: JScrollPane
     * 
     *  fuer TextArea und Type List
     */
    private javax.swing.JScrollPane getScrolpane(java.awt.Component comp) {
        javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane();
        scrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setViewportView(comp);
        return scrollPane;
    }

    /**
     *    @Method: getButtomPanel
     * 
     *    output: JPanel
     * 
     *  initialisiert die untere Bottom Panel
     */
    private javax.swing.JPanel getButtomPanel() {

        javax.swing.JPanel buttomPanel = new javax.swing.JPanel();
        javax.swing.JButton accept = new javax.swing.JButton(Main.myLang.getString("plain.accept"));
        javax.swing.JButton canel = new javax.swing.JButton(Main.myLang.getString("button.cancel"));

        accept.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent con) {
                savetoDb();
            }
        });

        canel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent con) {
                dispose();
            }
        });

        buttomPanel.add(accept);
        buttomPanel.add(canel);
        return buttomPanel;

    }

    /**
     *    @Method: getTypeList
     * 
     *    output: JPanel
     * 
     *  initialisiert die Liste mit allowed Typs
     */
    private javax.swing.JPanel getTypeList() {

        javax.swing.JPanel typeListPanel = new javax.swing.JPanel();
        typeListPanel.setLayout(new GridBagLayout());
        GridBagConstraints cons = new GridBagConstraints();
        cons.gridx = 0;
        cons.gridy = 0;
        cons.insets = new Insets(2, 2, 2, 2);

        inittypeList();

        TitledBorder title = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(java.awt.Color.black),
                Main.myLang.getString("plain.allowed.field"));
        title.setTitleJustification(TitledBorder.CENTER);
        typeListPanel.setBorder(title);
        typeList.setCellRenderer(new myrenderer());
        typeList.addMouseListener(new TypeListMousListner(textArea, typeList, typeListModel));

        javax.swing.JScrollPane scroll = getScrolpane(typeList);
        scroll.setPreferredSize(new java.awt.Dimension(120, 370));
        typeListPanel.add(scroll);

        cons.gridy = 1;

        typeListPanel.add(autoText, cons);

        return typeListPanel;

    }

    /**
     *    @Procedure: inittypeList
     * 
     *  initialisiert den JList mit den Req. und Opt. Field aus DB
     */
    private void inittypeList() {

        container.ContainerType type = theDb.getType(this.entryType);

        /* Die Requiedfields */
        for (int i = 0; i < type.getRequiredFields().size(); i++) {
            typeListModel.addElement(new typeLabel(type.getRequiredFields().get(i).toString()));
        }

        /* Die Optionalfields */
        for (int i = 0; i < type.getOptionalFields().size(); i++) {
            typeListModel.addElement(new typeLabel(type.getOptionalFields().get(i).toString()));
        }

    }

    /**
     *    @Procedure: pdfExtractor
     * 
     *  Ruft den FileChooser, startet den pdfParser oder TODO: txtParser
     *  und setzt den Inhalt von TextArea
     */
    private void pdfExtractor() {

        String pdfText = null;

        javax.swing.JFileChooser openFile = new javax.swing.JFileChooser();
        openFile.setFileFilter(
                new FilenameFilter("Pdf (*.pdf) and Text (*.txt) files", new String[] { "pdf", "txt" }));
        int returnVal = openFile.showOpenDialog(this);
        if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            this.file = openFile.getSelectedFile();
            try {
                // Setting the path of the opened file
                if (file.getPath().endsWith(".pdf")) {
                    pdfText = pdfParser(file);
                    textArea.setText(pdfText);
                } else if (file.getPath().endsWith(".txt")) {
                    /*
                     * TODO: Parse of .txt
                     */
                }

            } catch (Exception e) {
                System.out.println("Error:File");
            }
        }
    }

    /**
     *    @Method: pdfParser
     * 
     *    input : File
     *  output: String
     *  
     *  Diese Methode liet den Text aus der Pdf Datei aus und gibt den Text als String zurck
     */
    private String pdfParser(File pdfFile) {
        NDC.push("pdfParser");

        PDDocument document = null;
        try {
            document = PDDocument.load(pdfFile);
        } catch (IOException e) {
            logger.error("Could not load document", e);
            NDC.pop();
            return null;
        }

        if (document.isEncrypted()) {
            NDC.pop();
            return "Encrypted documents are not supported";
        }

        PDFTextStripper stripper;
        try {
            stripper = new PDFTextStripper();
        } catch (IOException e) {
            logger.error("Could not create stripper", e);
            NDC.pop();
            return null;
        }

        stripper.setStartPage(1);
        stripper.setEndPage(2);

        String text;
        try {
            text = stripper.getText(document);
        } catch (Exception e) {
            logger.error("Could not parse PDF", e);
            NDC.pop();
            return null;
        }
        NDC.pop();
        return text;
    }

    /**
     *  TODO: Typs stehen in typeListModel!!!
     */
    private void savetoDb() {

        String key = "CrossRefPdf_" + this.file.getName();
        int entryTypeId = theDb.addType(this.entryType, false, true, true);
        int entryId = theDb.addObject(entryTypeId, key);

        for (int i = 0; i < typeListModel.size(); i++) {
            if (((gui.dialog.typeLabel) typeListModel.getElementAt(i)).getvalue() != null) {
                int typeId = theDb.addType(((gui.dialog.typeLabel) typeListModel.getElementAt(i)).getName(), false,
                        false, true);
                theDb.addTypeLink(entryTypeId, typeId, false);
                int attributeId = theDb.addAttribute(typeId,
                        ((gui.dialog.typeLabel) typeListModel.getElementAt(i)).getvalue(), false);
                this.obj = theDb.addObjectLink(entryId, attributeId);
                this.obj = theDb.getObject(key).getId();
            }
        }

        if (this.file.getPath().endsWith(".pdf")) {
            int typeId = theDb.addType("pdfField", false, false, true);
            theDb.addTypeLink(entryTypeId, typeId, false);
            int attributeId = theDb.addAttribute(typeId, this.file.getPath(), false);
            this.obj = theDb.addObjectLink(entryId, attributeId);
            this.obj = theDb.getObject(key).getId();

        }

        this.dispose();
    }

    public int getObj() {
        return this.obj;
    }

}

/**
*    Objekt der in JList angezeigt wird
*/
class typeLabel extends javax.swing.JLabel {

    private static final long serialVersionUID = 1L;
    private boolean enabel = false;
    private String Name = null;
    private String value = null;

    typeLabel(String text) {
        this.Name = text;
        this.setText(text);

    }

    typeLabel(javax.swing.ImageIcon icon) {
        this.setIcon(icon);

    }

    public void setEnabel() {
        this.enabel = true;
    }

    public boolean isEnable() {
        return enabel;
    }

    public String getName() {
        return Name;
    }

    public void setvalue(String value) {
        this.value = value;
    }

    public String getvalue() {
        return this.value;
    }

}

/**
*    
*/
class myrenderer extends gui.dialog.typeLabel implements ListCellRenderer {

    private static final long serialVersionUID = 1L;

    public myrenderer() {
        super((new javax.swing.ImageIcon("images/icon.gif")));
    }

    public java.awt.Component getListCellRendererComponent(javax.swing.JList list, Object value, int index,
            boolean isSelected, boolean hasFocus) {
        if (value instanceof String) {
            this.setText((String) value);
        } else if (value instanceof gui.dialog.typeLabel) {
            this.setText(((gui.dialog.typeLabel) value).getText());
            this.setFont(new java.awt.Font("Times New Roman", java.awt.Font.BOLD, 16));
            this.setVerticalTextPosition(1);
            this.setHorizontalAlignment(javax.swing.JLabel.LEFT);
        }

        if (isSelected) {
            if (!((gui.dialog.typeLabel) value).isEnable()) {
                this.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/icon.gif")));
            } else {
                this.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/mark.png")));
            }
            this.setBackground(java.awt.Color.LIGHT_GRAY);
            this.setOpaque(true);
        } else {
            if (!((gui.dialog.typeLabel) value).isEnable()) {
                this.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/icon.gif")));
            } else {
                this.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("images/mark.png")));
            }
            this.setBackground(java.awt.Color.WHITE);
            this.setOpaque(true);
        }

        return (this);

    }
}

/**
*  Class TypeListMousListner
*  
*  ueberwacht die actionen von JList
*
*/
class TypeListMousListner implements MouseListener {

    private javax.swing.DefaultListModel listModel = new javax.swing.DefaultListModel();
    private javax.swing.JTextPane textArea = new javax.swing.JTextPane();
    private javax.swing.JList list = new javax.swing.JList();

    private int markierenStart = -1;
    private int markierenEnd = -1;

    TypeListMousListner(javax.swing.JTextPane textArea, javax.swing.JList list,
            javax.swing.DefaultListModel listModel) {
        this.textArea = textArea;
        this.listModel = listModel;
        this.list = list;
    }

    public void mouseClicked(MouseEvent e) {

        if (e.getClickCount() == 2) {

            StyledDocument doc = this.textArea.getStyledDocument();
            Style farbe = doc.addStyle("farbe", null);

            /*
             * Set Atribut value of Type
             */
            if (textArea.getSelectedText() != null) {
                ((gui.dialog.typeLabel) listModel.getElementAt(list.getSelectedIndex())).setEnabel();
                ((gui.dialog.typeLabel) listModel.getElementAt(list.getSelectedIndex()))
                        .setvalue(textArea.getSelectedText());
                list.repaint();
            }

            /*
             * Set Selected Style of TextPane Document
             */
            StyleConstants.setBold(farbe, true);

            if (this.markierenStart == -1) {
                if (this.textArea.getSelectedText() != null) {
                    StyleConstants.setForeground(farbe, Color.RED);
                    doc.setCharacterAttributes(this.textArea.getSelectionStart(),
                            this.textArea.getSelectedText().length(), farbe, true);

                    this.markierenStart = this.textArea.getSelectionStart();
                    this.markierenEnd = this.textArea.getSelectionEnd();
                }
            } else {
                if (this.textArea.getSelectedText() != null) {
                    StyleConstants.setForeground(farbe, Color.RED);
                    doc.setCharacterAttributes(this.textArea.getSelectionStart(),
                            this.textArea.getSelectedText().length(), farbe, true);
                    StyleConstants.setForeground(farbe, Color.BLUE);
                    doc.setCharacterAttributes(this.markierenStart, (this.markierenEnd - this.markierenStart),
                            farbe, true);

                    this.markierenStart = this.textArea.getSelectionStart();
                    this.markierenEnd = this.textArea.getSelectionEnd();

                }
            }

        }
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

}

/**
 * 
 * @author allendds
 *         informationen fuer markierung speichern   
 */
class MarkText {

    int start = -1;
    int end = -1;

    MarkText() {
    }

}