// $Id:
// FORESTER -- software libraries and applications
// for evolutionary biology research and applications.
//
// Copyright (C) 2008-2009 Christian M. Zmasek
// Copyright (C) 2008-2009 Burnham Institute for Medical Research
// Copyright (C) 2000-2001 Washington University School of Medicine
// and Howard Hughes Medical Institute
// Copyright (C) 2003-2007 Ethalinda K.S. Cannon
// All rights reserved
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
//
// Contact: phylosoft @ gmail . com
// WWW: https://sites.google.com/site/cmzmasek/home/software/forester

package org.forester.archaeopteryx;

import java.awt.AWTPermission;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

final class TextFrame extends JFrame implements ActionListener, ClipboardOwner {

    /**
     *
     */
    private static final long           serialVersionUID = -5012834229705518363L;
    private static Color                ta_text_color    = new Color( 0, 0, 0 ),
            ta_background_color = new Color( 240, 240, 240 ), background_color = new Color( 215, 215, 215 ),
            button_background_color = new Color( 215, 215, 215 ), button_text_color = new Color( 0, 0, 0 );
    private final static Font           button_font      = new Font( "Helvetica", Font.PLAIN, 10 ),
            ta_font = new Font( "Helvetica", Font.PLAIN, 10 );
    private boolean                     can_use_clipboard;
    private final String                text;
    private final JTextArea             jtextarea;
    private final JButton               close_button;
    private JButton                     copy_button;
    private final JPanel                buttonjpanel;
    private final Container             contentpane;
    private final LinkedList<TextFrame> _tframes;

    private TextFrame( final String s, final String title, final LinkedList<TextFrame> tframes ) {
        // first things first
        setTitle( title );
        text = s;
        _tframes = tframes;
        // check to see if we have permission to use the clipboard:
        can_use_clipboard = true;
        final SecurityManager sm = System.getSecurityManager();
        if ( sm != null ) {
            try {
                sm.checkPermission( new AWTPermission( "accessClipboard" ) );
            }
            catch ( final Exception e ) {
                can_use_clipboard = false;
            }
        }
        // set up the frame
        setBackground( background_color );
        buttonjpanel = new JPanel();
        buttonjpanel.setBackground( background_color );
        close_button = new JButton( "          Close          " );
        close_button.setBackground( button_background_color );
        close_button.setForeground( button_text_color );
        close_button.setFont( button_font );
        close_button.addActionListener( this );
        buttonjpanel.add( close_button );
        if ( can_use_clipboard ) {
            copy_button = new JButton( "Copy to clipboard" );
            copy_button.setBackground( button_background_color );
            copy_button.setForeground( button_text_color );
            copy_button.setFont( button_font );
            copy_button.addActionListener( this );
            buttonjpanel.add( copy_button );
        }
        contentpane = getContentPane();
        contentpane.setLayout( new BorderLayout() );
        jtextarea = new JTextArea( text );
        jtextarea.setBackground( ta_background_color );
        jtextarea.setForeground( ta_text_color );
        jtextarea.setFont( ta_font );
        jtextarea.setEditable( false );
        jtextarea.setWrapStyleWord( true );
        jtextarea.setLineWrap( true );
        contentpane.add( new JScrollPane( jtextarea ), BorderLayout.CENTER );
        buttonjpanel.setLayout( new FlowLayout( FlowLayout.CENTER, 20, 5 ) );
        contentpane.add( buttonjpanel, BorderLayout.SOUTH );
        setSize( 500, 400 );
        addWindowListener( new WindowAdapter() {

            @Override
            public void windowClosing( final WindowEvent e ) {
                removeMe();
            }
        } );
        setVisible( true );
    }

    @Override
    public void actionPerformed( final ActionEvent e ) {
        final Object o = e.getSource();
        if ( o == close_button ) {
            removeMe();
        }
        else if ( o == copy_button ) {
            copy();
        }
    }

    @Override
    public void lostOwnership( final Clipboard clipboard, final Transferable contents ) {
    }

    private void copy() {
        if ( !can_use_clipboard ) {
            // can't do this!
            return;
        }
        final Clipboard sys_clipboard = getToolkit().getSystemClipboard();
        final StringSelection contents = new StringSelection( jtextarea.getText() );
        sys_clipboard.setContents( contents, this );
    }

    void close() {
        setVisible( false );
        dispose();
    }

    void removeMe() {
        final int i = _tframes.indexOf( this );
        if ( i >= 0 ) {
            _tframes.remove( i );
        }
        close();
    }

    static TextFrame instantiate( final String s, final String title, final LinkedList<TextFrame> tframes ) {
        return new TextFrame( s, title, tframes );
    }
}
