package org.bodington.applet.components;

import org.bodington.applet.*;
import org.bodington.applet.data.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.text.html.*;

import java.awt.datatransfer.*;
import java.awt.event.*;
import java.beans.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;


public class TextEditorFrame extends javax.swing.JInternalFrame 
    implements java.awt.event.ActionListener,
    DocumentListener, InternalFrameListener
    {
    JEditorPane edit_pane;
    
    // TextEditorPanel panel
        
	URL resource_base;
    RemoteFile remote_file;

    JMenuBar menu_bar;
    JMenu file_menu, edit_menu;
    
    JMenuItem   save_menu_item, close_menu_item,
                copy_menu_item, cut_menu_item, 
                paste_menu_item;
    
    boolean unsaved=false;
    
	public TextEditorFrame( URL url, RemoteFile f )
	    {
		super( "Editing - " + f.getName(), true, true, true, true );
        setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
        addInternalFrameListener( this );

	    resource_base = url;
	    remote_file = f;

        // menu items on menu bar
        save_menu_item  = new JMenuItem( "Save", 'S' );
        close_menu_item  = new JMenuItem( "Close", 'C' );
        copy_menu_item  = new JMenuItem( "Copy", 'C' );
        cut_menu_item  = new JMenuItem( "Cut", 'T' );
        paste_menu_item  = new JMenuItem( "Paste", 'P' );
        
        save_menu_item.addActionListener( this );
        close_menu_item.addActionListener( this );
        copy_menu_item.addActionListener( this );
        cut_menu_item.addActionListener( this );
        paste_menu_item.addActionListener( this );
        
        file_menu = new JMenu( "File" );
        file_menu.add( save_menu_item );
        file_menu.addSeparator();
        file_menu.add( close_menu_item );

        edit_menu = new JMenu( "Edit" );
        edit_menu.add( cut_menu_item );
        edit_menu.add( copy_menu_item );
        edit_menu.add( paste_menu_item );
        
        menu_bar = new JMenuBar();
        menu_bar.add( file_menu );
        menu_bar.add( edit_menu );
        
        setJMenuBar( menu_bar );

        resource_base = url;
        
	    JScrollPane scroller = new JScrollPane();
	    edit_pane = new JEditorPane();
		edit_pane.setEditable( true );
	    //Font unicode_font = new Font( "Arial Unicode MS", Font.PLAIN, 12 );
	    Font unicode_font = new Font( "MS Gothic", Font.PLAIN, 12 );
		edit_pane.setFont( unicode_font );
		
		scroller.getViewport().add( edit_pane );
	    getContentPane().add( scroller );

        //doRefresh();
	    }
    
    public void actionPerformed(ActionEvent e)
        {
        // This method is derived from interface java.awt.event.ActionListener
        // to do: code goes here
        if ( e.getSource() == save_menu_item )
            {
            saveFile();
            }
        else if ( e.getSource() == close_menu_item )
            {
            fireInternalFrameEvent( InternalFrameEvent.INTERNAL_FRAME_CLOSING );
            }
        else if ( e.getSource() == copy_menu_item )
            {
            edit_pane.copy();
            }
        else if ( e.getSource() == cut_menu_item )
            {
            edit_pane.cut();
            }
        else if ( e.getSource() == paste_menu_item )
            {
            edit_pane.paste();
            }
        }

    public void doRefresh()
        {
		TransferRemoteFileDialog dialog = new TransferRemoteFileDialog( BodingtonDesktopPane.findInstance( this ) );
		
		try
		    {
		    URL thing = new URL( resource_base.toExternalForm() + 
		                        remote_file.getHRef() );
    		                     
		    dialog.transfer( thing, edit_pane, new PlainDocument() );
            boolean unsaved=false;
            Document doc = edit_pane.getDocument();
            doc.addDocumentListener( this );
		    }
		catch ( Exception ex )
		    {
			JOptionPane.showMessageDialog(null, "A problem occurred trying to fetch the file to edit.", "Alert", JOptionPane.ERROR_MESSAGE); 
		    }
        }

	public void saveFile()
		{
		try
		    {
            File file = File.createTempFile( "edit", ".txt" );
            Writer writer = new OutputStreamWriter( new FileOutputStream ( file ), "UTF-8" );
                
            edit_pane.write( writer );
            writer.flush();
            writer.close();

		    TransferLocalFileDialog dialog = new TransferLocalFileDialog( BodingtonDesktopPane.findInstance( this ) );
		    String dest;

            RemoteFile target = remote_file.getParent();
		    dest = target.getResourceUrl().toExternalForm() +  target.getPath();
		    if ( !dest.endsWith( "/" ) )
			    dest = dest + "/";
		    dest = dest + "bs_virtual_uploadconfirm.txt";
    			            
		    URL publish_page_url = new URL(	dest );

	        dialog.transfer( file, remote_file.getName(), publish_page_url );
	        
	        unsaved = false;
	        }
	    catch ( Exception ex )
	        {
			JOptionPane.showMessageDialog(null, "A problem occurred trying to save the file.", "Alert", JOptionPane.ERROR_MESSAGE); 
	        }
		}

    public void changedUpdate(DocumentEvent e)
        {
        unsaved = true;
        }

    public void insertUpdate(DocumentEvent e)
        {
        unsaved = true;
        }
        
    public void removeUpdate(DocumentEvent e)
        {
        unsaved = true;
        }
        
    public void internalFrameOpened(InternalFrameEvent e)
        {
        }
        
    public void internalFrameClosing( InternalFrameEvent e )
        {
        System.out.println( "Request to close editor frame" );
        
        if ( unsaved )
            {
			int opt = JOptionPane.showConfirmDialog(null, "Save file before closing?" ); 

			if ( opt == JOptionPane.YES_OPTION )
			    {
			    saveFile();
			    dispose();
			    }
			else if ( opt == JOptionPane.NO_OPTION )
			    {
			    dispose();
			    }
			    
			return;
            }
            
        dispose();
        }
        
    public void internalFrameClosed(InternalFrameEvent e)
        {
        }
    public void internalFrameIconified(InternalFrameEvent e)
        {
        }
    public void internalFrameDeiconified(InternalFrameEvent e)
        {
        }
    public void internalFrameActivated(InternalFrameEvent e)
        {
        }
    public void internalFrameDeactivated(InternalFrameEvent e)
        {
        }

    }
