//
// Created by Grishul Eugeny
//
// Copyright © Grishul Eugeny 2008
//

import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;

public class ReportControl extends javax.swing.JPanel {
	public DbLayer DbLayerInstance;
	
	public ReportControl() {
		initComponents();
		_currentReport.Text = "";
		_from.setText( "" );
		_date.setText( "" );

		_attachments.setTransferHandler( this.new FileDropHandler() );
	}
	private DbMessage _currentReport = new DbMessage();

	public DbMessage getCurrentReport() {
		return _currentReport;
	}

	public void setCurrentReport( DbLayer dblayerInstance, DbMessage value ) throws Throwable {
		if( value == null )
			value = new DbMessage();

		DbLayerInstance = dblayerInstance;
		_currentReport = value;

		_description.setText( _currentReport.Text );

		if( _currentReport.When == null )
			_date.setText( "" );
		else {
			Calendar date = new GregorianCalendar();
			date.setTimeInMillis( _currentReport.When.getTime() );

			_date.setText( String.format( "%1$te.%1$tm.%1$tY %1$tH:%1$tM:%1$tS", date ) );
		}

		if( _currentReport.From != 0 )
			_from.setText( "От: " + DbLayerInstance.getEmployeeByID( _currentReport.From ).Surname );
		else
			_from.setText( "" );

		refreshAttachments();
	}

	private void refreshAttachments() {
		ArrayList<ListViewItem> items = new ArrayList<ListViewItem>();

		if( _currentReport.Attachments != null )
			for( DbAttachment item : _currentReport.Attachments ) {
				ListViewItem listItem = new ListViewItem( item.Name, item );
				items.add( listItem );
			}

		_attachments.setModel( new ListView( items ) );
	}

	public boolean getEditMode() {
		return _description.isEditable();
	}

	public void setEditMode( boolean value ) {
		_description.setEditable( value );
	}

	@Override
	public void requestFocus() {
		_description.requestFocus();
	}

	private class FileDropHandler extends TransferHandler {
		@Override
		public boolean canImport( JComponent arg0, DataFlavor[] arg1 ) {
			for( int i = 0; i < arg1.length; i++ ) {
				DataFlavor flavor = arg1[i];

				if( flavor.equals( DataFlavor.javaFileListFlavor ) )
					return true;

				System.err.println( "Непонятный дроп: " + flavor );
			}
			return false;
		}

		@Override
		public boolean importData( JComponent comp, Transferable t ) {
			try {
				DataFlavor[] flavors = t.getTransferDataFlavors();
				for( int i = 0; i < flavors.length; i++ ) {
					DataFlavor flavor = flavors[i];
					if( flavor.equals( DataFlavor.javaFileListFlavor ) ) {
						List l = ( List ) t.getTransferData( DataFlavor.javaFileListFlavor );
						Iterator iter = l.iterator();

						while( iter.hasNext() ) {
							File droppedFile = ( File ) iter.next();

							FileInputStream droppedFileReader = null;

							byte[] resultBuf = new byte[( int ) droppedFile.length()];
							try {
								droppedFileReader = new FileInputStream( droppedFile );
								droppedFileReader.read( resultBuf );

								if( _currentReport.Attachments == null )
									_currentReport.Attachments = new ArrayList<DbAttachment>();

								_currentReport.Attachments.add( new DbAttachment( droppedFile.getName(), resultBuf ) );
							} finally {
								if( droppedFileReader != null )
									droppedFileReader.close();
							}
						}

						refreshAttachments();
						return true;
					}
				}

				Toolkit.getDefaultToolkit().beep();
			} catch( Throwable excpt ) {
				JOptionPane.showMessageDialog( comp, excpt.getMessage() );
			}
			return false;
		}
	}

	@SuppressWarnings( "unchecked" )
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        _attachmentMenu = new javax.swing.JPopupMenu();
        _newAttachment = new javax.swing.JMenuItem();
        _saveAttachmentAs = new javax.swing.JMenuItem();
        _deleteAttachment = new javax.swing.JMenuItem();
        _descriptionScroll = new javax.swing.JScrollPane();
        _description = new javax.swing.JTextArea();
        _attachmentsScroll = new javax.swing.JScrollPane();
        _attachments = new javax.swing.JList();
        _contentsLabel = new javax.swing.JLabel();
        _date = new javax.swing.JLabel();
        _from = new javax.swing.JLabel();

        _newAttachment.setText("новое");
        _newAttachment.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                _newAttachmentActionPerformed(evt);
            }
        });
        _attachmentMenu.add(_newAttachment);

        _saveAttachmentAs.setText("сохранить как..");
        _saveAttachmentAs.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                _saveAttachmentAsActionPerformed(evt);
            }
        });
        _attachmentMenu.add(_saveAttachmentAs);

        _deleteAttachment.setText("удалить");
        _deleteAttachment.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                _deleteAttachmentActionPerformed(evt);
            }
        });
        _attachmentMenu.add(_deleteAttachment);

        _description.setColumns(20);
        _description.setFont(new java.awt.Font("Tahoma", 0, 11));
        _description.setRows(5);
        _description.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                _descriptionKeyReleased(evt);
            }
        });
        _descriptionScroll.setViewportView(_description);

        _attachments.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                _attachmentsMouseClicked(evt);
            }
        });
        _attachmentsScroll.setViewportView(_attachments);

        _contentsLabel.setText("Содержание:");

        _date.setText("Date");

        _from.setText("From");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(_attachmentsScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 429, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addComponent(_from)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 382, Short.MAX_VALUE)
                .addComponent(_date))
            .addComponent(_descriptionScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 429, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGap(170, 170, 170)
                .addComponent(_contentsLabel)
                .addContainerGap(191, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(_date)
                        .addComponent(_from))
                    .addComponent(_contentsLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(_descriptionScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 225, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(_attachmentsScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
    }// </editor-fold>//GEN-END:initComponents

private void _descriptionKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event__descriptionKeyReleased
	_currentReport.Text = _description.getText();
}//GEN-LAST:event__descriptionKeyReleased

private void _newAttachmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event__newAttachmentActionPerformed
	try {
		JFileChooser openFileDialog = new JFileChooser();

		if( openFileDialog.showOpenDialog( this ) == JFileChooser.APPROVE_OPTION ) {
			FileInputStream droppedFileReader = null;

			byte[] resultBuf = new byte[( int ) openFileDialog.getSelectedFile().length()];
			try {
				droppedFileReader = new FileInputStream( openFileDialog.getSelectedFile() );
				droppedFileReader.read( resultBuf );

				if( _currentReport.Attachments == null )
					_currentReport.Attachments = new ArrayList<DbAttachment>();

				_currentReport.Attachments.add( new DbAttachment( openFileDialog.getSelectedFile().getName(), resultBuf ) );
			} finally {
				if( droppedFileReader != null )
					droppedFileReader.close();
			}

			refreshAttachments();
		}
	} catch( Throwable excpt ) {
		JOptionPane.showMessageDialog( this, excpt.getMessage() );
	}
}//GEN-LAST:event__newAttachmentActionPerformed

private void _deleteAttachmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event__deleteAttachmentActionPerformed
	_currentReport.Attachments.remove( ( DbAttachment ) ListView.getSelectedObjectTag( _attachments ) );
	refreshAttachments();
}//GEN-LAST:event__deleteAttachmentActionPerformed

private void _saveAttachmentAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event__saveAttachmentAsActionPerformed
	try {
		DbAttachment current = ( DbAttachment ) ListView.getSelectedObjectTag( _attachments );

		JFileChooser saveFileDialog = new JFileChooser();
		saveFileDialog.setSelectedFile( new File( current.Name ) );
		
		if( saveFileDialog.showSaveDialog( this ) == JFileChooser.APPROVE_OPTION ) {
			FileOutputStream droppedFileReader = null;

			try {
				droppedFileReader = new FileOutputStream( saveFileDialog.getSelectedFile() );
				droppedFileReader.write( current.Data );
			} finally {
				if( droppedFileReader != null )
					droppedFileReader.close();
			}
		}
	} catch( Throwable excpt ) {
		JOptionPane.showMessageDialog( this, excpt.getMessage() );
	}

}//GEN-LAST:event__saveAttachmentAsActionPerformed

private void _attachmentsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event__attachmentsMouseClicked
	try {
		if( SwingUtilities.isRightMouseButton( evt ) ) {
			DbAttachment current = null;

			if( _attachments.getSelectedIndex() != -1 )
				current = ( DbAttachment ) ListView.getSelectedObjectTag( _attachments );

			_newAttachment.setVisible( getEditMode() );
			_deleteAttachment.setVisible( current != null && getEditMode() );
			_saveAttachmentAs.setVisible( current != null );

			_attachmentMenu.show( _attachments, evt.getX(), evt.getY() );
		}
	} catch( Throwable excpt ) {
		JOptionPane.showMessageDialog( this, excpt.getMessage() );
	}

}//GEN-LAST:event__attachmentsMouseClicked
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPopupMenu _attachmentMenu;
    private javax.swing.JList _attachments;
    private javax.swing.JScrollPane _attachmentsScroll;
    private javax.swing.JLabel _contentsLabel;
    private javax.swing.JLabel _date;
    private javax.swing.JMenuItem _deleteAttachment;
    private javax.swing.JTextArea _description;
    private javax.swing.JScrollPane _descriptionScroll;
    private javax.swing.JLabel _from;
    private javax.swing.JMenuItem _newAttachment;
    private javax.swing.JMenuItem _saveAttachmentAs;
    // End of variables declaration//GEN-END:variables
	}
Соседние файлы в папке src