/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

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)
        {
        }

    }
