/*
* 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.ldapbrowser.ui.actions;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.studio.ldapbrowser.common.actions.BrowserAction;
import org.apache.directory.studio.ldapbrowser.common.actions.CopyAction;
import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.apache.directory.studio.ldapbrowser.core.utils.ModelConverter;
import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin;
import org.apache.directory.studio.ldifparser.LdifUtils;
import org.apache.directory.studio.valueeditors.IValueEditor;
import org.apache.directory.studio.valueeditors.ValueEditorManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
/**
* This Action copies values of the seleced Entry to the Clipboard.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class CopyValueAction extends BrowserAction
{
public enum Mode
{
/**
* UTF8 Mode.
*/
UTF8,
/**
* Base64 Mode.
*/
BASE64,
/**
* Hexadecimal Mode.
*/
HEX,
/**
* LDIF Mode.
*/
LDIF,
/**
* Display mode, copies the display value.
*/
DISPLAY,
}
private Mode mode;
private ValueEditorManager valueEditorManager;
/**
* Creates a new instance of CopyValueAction.
*
* @param mode
* the copy Mode
*/
public CopyValueAction( Mode mode, ValueEditorManager valueEditorManager )
{
this.mode = mode;
this.valueEditorManager = valueEditorManager;
}
/**
* {@inheritDoc}
*/
public String getText()
{
switch ( mode )
{
case UTF8:
return getValueSet().size() > 1 ? Messages.getString( "CopyValueAction.CopyValuesUTF" ) : Messages.getString( "CopyValueAction.CopyValueUTF" ); //$NON-NLS-1$ //$NON-NLS-2$
case BASE64:
return getValueSet().size() > 1 ? Messages.getString( "CopyValueAction.CopyValuesBase" ) : Messages.getString( "CopyValueAction.CopyValueBase" ); //$NON-NLS-1$ //$NON-NLS-2$
case HEX:
return getValueSet().size() > 1 ? Messages.getString( "CopyValueAction.VopyValuesHex" ) : Messages.getString( "CopyValueAction.CopyValueHex" ); //$NON-NLS-1$ //$NON-NLS-2$
case LDIF:
return getValueSet().size() > 1 ? Messages.getString( "CopyValueAction.CopyValuePairs" ) : Messages.getString( "CopyValueAction.CopyValuePair" ); //$NON-NLS-1$ //$NON-NLS-2$
case DISPLAY:
return getValueSet().size() > 1 ? Messages.getString( "CopyValueAction.CopyDisplayValues" ) : Messages.getString( "CopyValueAction.CopyDisplayValue" ); //$NON-NLS-1$ //$NON-NLS-2$
default:
return Messages.getString( "CopyValueAction.CopyValue" ); //$NON-NLS-1$
}
}
/**
* {@inheritDoc}
*/
public ImageDescriptor getImageDescriptor()
{
switch ( mode )
{
case UTF8:
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_UTF8 );
case BASE64:
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_BASE64 );
case HEX:
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_HEX );
case LDIF:
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_LDIF );
case DISPLAY:
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_DISPLAY );
default:
return null;
}
}
/**
* {@inheritDoc}
*/
public String getCommandId()
{
return null;
}
/**
* {@inheritDoc}
*/
public boolean isEnabled()
{
return getValueSet().size() > 0 || getSelectedSearchResults().length > 0;
}
/**
* {@inheritDoc}
*/
public void run()
{
StringBuffer text = new StringBuffer();
Set<IValue> valueSet = getValueSet();
if ( !valueSet.isEmpty() )
{
for ( Iterator<IValue> iterator = valueSet.iterator(); iterator.hasNext(); )
{
IValue value = iterator.next();
switch ( mode )
{
case UTF8:
text.append( LdifUtils.utf8decode( value.getBinaryValue() ) );
if ( iterator.hasNext() )
{
text.append( BrowserCoreConstants.LINE_SEPARATOR );
}
break;
case BASE64:
text.append( LdifUtils.base64encode( value.getBinaryValue() ) );
if ( iterator.hasNext() )
{
text.append( BrowserCoreConstants.LINE_SEPARATOR );
}
break;
case HEX:
text.append( LdifUtils.hexEncode( value.getBinaryValue() ) );
if ( iterator.hasNext() )
{
text.append( BrowserCoreConstants.LINE_SEPARATOR );
}
break;
case LDIF:
text.append( ModelConverter.valueToLdifAttrValLine( value ).toFormattedString(
Utils.getLdifFormatParameters() ) );
break;
case DISPLAY:
IValueEditor ve = valueEditorManager.getCurrentValueEditor( value );
String displayValue = ve.getDisplayValue( value );
text.append( displayValue );
if ( iterator.hasNext() )
{
text.append( BrowserCoreConstants.LINE_SEPARATOR );
}
break;
}
}
}
else if ( getSelectedSearchResults().length > 0 )
{
Dn dn = getSelectedSearchResults()[0].getDn();
switch ( mode )
{
case UTF8:
case DISPLAY:
text.append( dn.getName() );
break;
case BASE64:
text.append( LdifUtils.base64encode( LdifUtils.utf8encode( dn.getName() ) ) );
break;
case HEX:
text.append( LdifUtils.hexEncode( LdifUtils.utf8encode( dn.getName() ) ) );
break;
case LDIF:
text.append( ModelConverter.dnToLdifDnLine( dn )
.toFormattedString( Utils.getLdifFormatParameters() ) );
break;
}
}
if ( text.length() > 0 )
{
CopyAction.copyToClipboard( new Object[]
{ text.toString() }, new Transfer[]
{ TextTransfer.getInstance() } );
}
}
/**
* Gets a Set containing all the Values
*
* @return
* a Set containing all the Values
*/
protected Set<IValue> getValueSet()
{
Set<IValue> valueSet = new LinkedHashSet<IValue>();
for ( AttributeHierarchy ah : getSelectedAttributeHierarchies() )
{
for ( IAttribute att : ah )
{
valueSet.addAll( Arrays.asList( att.getValues() ) );
}
}
for ( IAttribute att : getSelectedAttributes() )
{
valueSet.addAll( Arrays.asList( att.getValues() ) );
}
valueSet.addAll( Arrays.asList( getSelectedValues() ) );
return valueSet;
}
}