blob: c3c6982c5af649336ae8d3b8691645118b247121 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.directory.studio.templateeditor.editor.widgets;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Base64;
import org.apache.directory.studio.entryeditors.IEntryEditor;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginConstants;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginUtils;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateFileChooser;
/**
* This class implements an Editor FileChooser.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class EditorFileChooser extends EditorWidget<TemplateFileChooser>
{
/** The widget's composite */
private Composite composite;
/** The icon label */
private Label iconLabel;
/** The size label */
private Label sizeLabel;
/** The 'Save As...' toolbar item */
private ToolItem saveAsToolItem;
/** The 'Clear' toolbar item */
private ToolItem clearToolItem;
/** The 'Browse...' toolbar item */
private ToolItem browseToolItem;
/** The file data as bytes array */
private byte[] fileBytes;
/** The icon Image we might have to create */
private Image iconImage;
/**
* Creates a new instance of EditorFileChooser.
*
* @param editor the associated editor
* @param templateFileChooser the associated template file chooser
* @param toolkit the associated toolkit
*/
public EditorFileChooser( IEntryEditor editor, TemplateFileChooser templateFileChooser, FormToolkit toolkit )
{
super( templateFileChooser, editor, toolkit );
}
/**
* {@inheritDoc}
*/
public Composite createWidget( Composite parent )
{
// Creating and initializing the widget UI
Composite composite = initWidget( parent );
// Updating the widget's content
updateWidget();
// Adding the listeners
addListeners();
return composite;
}
/**
* Creates and initializes the widget UI.
*
* @param parent the parent composite
* @return the associated composite
*/
private Composite initWidget( Composite parent )
{
composite = getToolkit().createComposite( parent );
composite.setLayoutData( getGridata() );
// Creating the layout
GridLayout gl = new GridLayout( getLayoutNumberOfColumns(), false );
gl.marginHeight = gl.marginWidth = 0;
gl.horizontalSpacing = gl.verticalSpacing = 0;
composite.setLayout( gl );
// Icon Label
if ( getWidget().isShowIcon() )
{
// Creating the label for hosting the icon
iconLabel = getToolkit().createLabel( composite, null );
iconLabel.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, false, false ) );
// Getting the icon (if available)
ImageData iconData = null;
String icon = getWidget().getIcon();
if ( ( icon != null ) && ( !icon.equals( "" ) ) ) //$NON-NLS-1$
{
try
{
iconData = new ImageData( new ByteArrayInputStream( Base64.getDecoder().decode( icon ) ) );
}
catch ( SWTException e )
{
// Nothing to do, we just need to return the default image.
}
}
// Assigning the icon
if ( iconData != null )
{
iconImage = new Image( PlatformUI.getWorkbench().getDisplay(), iconData );
iconLabel.setImage( iconImage );
}
else
{
iconLabel.setImage( EntryTemplatePlugin.getDefault().getImage( EntryTemplatePluginConstants.IMG_FILE ) );
}
}
// Size Label
sizeLabel = getToolkit().createLabel( composite, null );
sizeLabel.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, true, false ) );
// Toolbar (if needed)
if ( needsToolbar() )
{
ToolBar toolbar = new ToolBar( composite, SWT.HORIZONTAL | SWT.FLAT );
toolbar.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, false, false ) );
// Save As Button
if ( getWidget().isShowSaveAsButton() )
{
saveAsToolItem = new ToolItem( toolbar, SWT.PUSH );
saveAsToolItem.setToolTipText( Messages.getString( "EditorFileChooser.SaveAs" ) ); //$NON-NLS-1$
saveAsToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_SAVE_AS ) );
}
// Clear Button
if ( getWidget().isShowClearButton() )
{
clearToolItem = new ToolItem( toolbar, SWT.PUSH );
clearToolItem.setToolTipText( Messages.getString( "EditorFileChooser.Clear" ) ); //$NON-NLS-1$
clearToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_CLEAR ) );
}
// Browse Button
if ( getWidget().isShowBrowseButton() )
{
browseToolItem = new ToolItem( toolbar, SWT.PUSH );
browseToolItem.setToolTipText( Messages.getString( "EditorFileChooser.Browse" ) ); //$NON-NLS-1$
browseToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_BROWSE_FILE ) );
}
}
return composite;
}
/**
* Gets the number of columns needed for the layout.
*
* @return the number of columns needed
*/
private int getLayoutNumberOfColumns()
{
int numberOfColumns = 1;
// Icon
if ( getWidget().isShowIcon() )
{
numberOfColumns++;
}
// Toolbar
if ( needsToolbar() )
{
numberOfColumns++;
}
return numberOfColumns;
}
/**
* Indicates if the widget needs a toolbar for actions.
*
* @return<code>true</code> if the widget needs a toolbar for actions,
* <code>false</code> if not
*/
private boolean needsToolbar()
{
return getWidget().isShowSaveAsButton() || getWidget().isShowClearButton() || getWidget().isShowBrowseButton();
}
/**
* Updates the widget's content.
*/
private void updateWidget()
{
// Initializing the image bytes from the given entry.
initImageBytesFromEntry();
// Updating the file label
updateSizeLabel();
// Updating the states of the buttons
updateButtonsStates();
}
/**
* Initializes the image bytes from the given entry.
*/
private void initImageBytesFromEntry()
{
// Getting the file bytes in the attribute
IAttribute attribute = getAttribute();
if ( ( attribute != null ) && ( attribute.isBinary() ) && ( attribute.getValueSize() > 0 ) )
{
fileBytes = attribute.getBinaryValues()[0];
return;
}
fileBytes = null;
}
/**
* Updates the "Size" label.
*/
private void updateSizeLabel()
{
sizeLabel.setText( getFileSizeString() );
sizeLabel.update();
}
/**
* Adds the listeners.
*/
private void addListeners()
{
// Save As toolbar item
if ( ( saveAsToolItem != null ) && ( !saveAsToolItem.isDisposed() ) )
{
saveAsToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
saveAsToolItemAction();
}
} );
}
// Clear toolbar item
if ( ( clearToolItem != null ) && ( !clearToolItem.isDisposed() ) )
{
clearToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
clearToolItemAction();
}
} );
}
// Browse toolbar item
if ( ( browseToolItem != null ) && ( !browseToolItem.isDisposed() ) )
{
browseToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
browseToolItemAction();
}
} );
}
}
/**
* Gets the size string.
*
* @return the size string
*/
private String getFileSizeString()
{
if ( fileBytes != null )
{
int length = fileBytes.length;
if ( length > 1000000 )
{
return NLS.bind( Messages.getString( "EditorFileChooser.MB" ), new Object[] //$NON-NLS-1$
{ ( length / 1000000 ), length } );
}
else if ( length > 1000 )
{
return NLS.bind( Messages.getString( "EditorFileChooser.KB" ), new Object[] //$NON-NLS-1$
{ ( length / 1000 ), length } );
}
else
{
return NLS.bind( Messages.getString( "EditorFileChooser.Bytes" ), new Object[] //$NON-NLS-1$
{ length } );
}
}
else
{
return Messages.getString( "EditorFileChooser.NoValue" ); //$NON-NLS-1$
}
}
/**
* This method is called when the 'Save As...' toolbar item is clicked.
*/
private void saveAsToolItemAction()
{
// Launching a FileDialog to select where to save the file
FileDialog fd = new FileDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.SAVE );
String selected = fd.open();
if ( selected != null )
{
// Getting the selected file
File selectedFile = new File( selected );
if ( ( !selectedFile.exists() ) || ( selectedFile.canWrite() ) )
{
try
{
FileOutputStream fos = new FileOutputStream( selectedFile );
fos.write( fileBytes );
fos.close();
}
catch ( Exception e )
{
// Logging the error
EntryTemplatePluginUtils.logError( e, "An error occurred while saving the file to disk.", //$NON-NLS-1$
new Object[0] );
// Launching an error dialog
MessageDialog
.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.getString( "EditorFileChooser.ErrorSavingMessageDialogTitle" ), Messages.getString( "EditorFileChooser.ErrorSavingMessageDialogMessage" ) ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
/**
* This method is called when the 'Clear...' toolbar item is clicked.
*/
private void clearToolItemAction()
{
// Launching a confirmation dialog
if ( MessageDialog.openConfirm( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages
.getString( "EditorFileChooser.Confirmation" ), Messages //$NON-NLS-1$
.getString( "EditorFileChooser.ConfirmationClearFile" ) ) ) //$NON-NLS-1$
{
// Removing the file bytes
fileBytes = null;
// Refreshing the states of the buttons
updateButtonsStates();
// Updating the size label
updateSizeLabel();
// Updating the entry
updateEntry();
}
}
/**
* This method is called when the 'Browse...' toolbar item is clicked.
*/
private void browseToolItemAction()
{
// Launching a FileDialog to select the file to load
FileDialog fd = new FileDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.OPEN );
String selected = fd.open();
if ( selected != null )
{
// Getting the selected file
File selectedFile = new File( selected );
if ( ( selectedFile.exists() ) && ( selectedFile.canRead() ) )
{
try
{
FileInputStream fis = null;
ByteArrayOutputStream baos = null;
try
{
fis = new FileInputStream( selectedFile );
baos = new ByteArrayOutputStream( ( int ) selectedFile.length() );
byte[] buf = new byte[4096];
int len;
while ( ( len = fis.read( buf ) ) > 0 )
{
baos.write( buf, 0, len );
}
fileBytes = baos.toByteArray();
}
finally
{
if ( fis != null )
{
fis.close();
}
if ( baos != null )
{
baos.close();
}
}
}
catch ( Exception e )
{
// Logging the error
EntryTemplatePluginUtils.logError( e, "An error occurred while reading the file from disk.", //$NON-NLS-1$
new Object[0] );
// Launching an error dialog
MessageDialog
.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.getString( "EditorFileChooser.ErrorReadingMessageDialogTitle" ), Messages.getString( "EditorFileChooser.ErrorReadingMessageDialogMessage" ) ); //$NON-NLS-1$ //$NON-NLS-2$
}
// Refreshing the states of the buttons
updateButtonsStates();
}
else
{
// Logging the error
EntryTemplatePluginUtils.logError( null,
"An error occurred while reading the file from disk. File does not exist or is not readable.", //$NON-NLS-1$
new Object[0] );
// Launching an error dialog
MessageDialog
.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.getString( "EditorFileChooser.ErrorReadingMessageDialogTitle" ), Messages.getString( "EditorFileChooser.ErrorReadingMessageDialogMessage" ) ); //$NON-NLS-1$ //$NON-NLS-2$
}
// Updating the size label
updateSizeLabel();
// Updating the entry
updateEntry();
}
}
/**
* This method is called when the entry has been updated in the UI.
*/
private void updateEntry()
{
// Getting the attribute
IAttribute attribute = getAttribute();
if ( attribute == null )
{
if ( ( fileBytes != null ) && ( fileBytes.length != 0 ) )
{
// Creating a new attribute with the value
addNewAttribute( fileBytes );
}
}
else
{
if ( ( fileBytes != null ) && ( fileBytes.length != 0 ) )
{
// Modifying the existing attribute
modifyAttributeValue( fileBytes );
}
else
{
// Deleting the attribute
deleteAttribute();
}
}
}
/**
* Updates the states of the buttons.
*/
private void updateButtonsStates()
{
if ( ( fileBytes != null ) && ( fileBytes.length > 0 ) )
{
if ( ( saveAsToolItem != null ) && ( !saveAsToolItem.isDisposed() ) )
{
saveAsToolItem.setEnabled( true );
}
if ( ( clearToolItem != null ) && ( !clearToolItem.isDisposed() ) )
{
clearToolItem.setEnabled( true );
}
if ( ( browseToolItem != null ) && ( !browseToolItem.isDisposed() ) )
{
browseToolItem.setEnabled( true );
}
}
else
{
if ( ( saveAsToolItem != null ) && ( !saveAsToolItem.isDisposed() ) )
{
saveAsToolItem.setEnabled( false );
}
if ( ( clearToolItem != null ) && ( !clearToolItem.isDisposed() ) )
{
clearToolItem.setEnabled( false );
}
if ( ( browseToolItem != null ) && ( !browseToolItem.isDisposed() ) )
{
browseToolItem.setEnabled( true );
}
}
}
/**
* {@inheritDoc}
*/
public void update()
{
updateWidget();
}
/**
* {@inheritDoc}
*/
public void dispose()
{
if ( iconImage != null )
{
iconImage.dispose();
}
}
}