/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */

/**
 * Copyright (c) 2007, Aberystwyth University
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 *  - Neither the name of the Centre for Advanced Software and
 *    Intelligent Systems (CASIS) nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
package org.purl.sword.client;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * Panel to display output messages. Text or characters can be sent to the
 * panel for display. The panel also includes a button to clear any
 * text that is currently displayed.
 *
 * @author Neil Taylor
 */
public class MessageOutputPanel extends JPanel
    implements ActionListener {

    /**
     * The text area that displays the messages.
     */
    private JTextArea messages = null;

    /**
     * Create a new instance and initialise the panel.
     */
    public MessageOutputPanel() {
        super();

        setLayout(new GridBagLayout());

        messages = new JTextArea();

        JScrollPane detailsPane = new JScrollPane(messages,
                                                  JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                                  JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        JButton clearButton = new JButton("Clear");
        clearButton.addActionListener(this);

        //add components and set constraints
        //dpc = details pane constraint
        GridBagConstraints dpc = new GridBagConstraints();
        dpc.gridx = 0;
        dpc.gridy = 0;
        dpc.fill = GridBagConstraints.BOTH;
        dpc.weightx = 0.75;
        dpc.weighty = 0.45;
        dpc.gridwidth = 2;
        dpc.insets = new Insets(5, 5, 5, 5);
        add(detailsPane, dpc);

        //cbc = clear button constraint
        GridBagConstraints cbc = new GridBagConstraints();
        cbc.gridx = 1;
        cbc.gridy = 1;
        cbc.insets = new Insets(0, 0, 5, 5);
        cbc.anchor = GridBagConstraints.LINE_END;
        add(clearButton, cbc);

    }

    /**
     * Add a message to the text area. The message will be added with a carriage return.
     *
     * @param message The message.
     */
    public void addMessage(String message) {
        messages.insert(message + "\n", messages.getDocument().getLength());
    }

    /**
     * Add a single character to the text area.
     *
     * @param character The character.
     */
    public void addCharacter(Character character) {
        messages.insert(character.toString(), messages.getDocument().getLength());
    }

    /**
     * Clear the text from the display.
     *
     * @param arg0 The action event.
     *
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent arg0) {
        messages.setText("");
    }
}
