/****************************************************************************** * Copyright (c) 2007 g-Eclipse consortium * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * Mariusz Wojtysiak - initial API and implementation * *****************************************************************************/ package eu.geclipse.ui.views.jobdetails; import java.io.ByteArrayInputStream; import java.io.InputStream; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IPersistableElement; import org.eclipse.ui.IStorageEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.ide.IDE; import eu.geclipse.core.model.IGridJob; import eu.geclipse.ui.internal.Activator; /** * Job detail for showing complex values. * {@link JobDetailsView} show only simple form of complex value. * Whole value is shown in editor after pressing button */ abstract public class JobComplexDetail extends JobTextDetail { private static Image image; String editorId; private Button button; private Composite composite; /** * @param section the section, in which detail will be shown * @param name the detail name * @param editorId id of editor, which should be opened after pressing "Show" button */ public JobComplexDetail( final IJobDetailsSection section, final String name, final String editorId ) { super( section, name ); this.editorId = editorId; } /* (non-Javadoc) * @see eu.geclipse.ui.views.jobdetails.JobTextDetail#createWidgets(org.eclipse.swt.widgets.Composite, org.eclipse.ui.forms.widgets.FormToolkit) */ @Override protected void createWidgets( final Composite parent, final FormToolkit formToolkit ) { super.createWidgets( parent, formToolkit ); this.composite = formToolkit.createComposite( parent ); GridLayout layout = new GridLayout( 3, false ); layout.marginWidth = 0; layout.marginHeight = 0; this.composite.setLayout( layout ); GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = SWT.TOP; this.composite.setLayoutData( gridData ); getDetailText().setParent( this.composite ); GridData layoutData = (GridData)getDetailText().getLayoutData(); layoutData.heightHint = 40; this.button = createButton( this.composite, formToolkit ); } /* (non-Javadoc) * @see eu.geclipse.ui.views.jobdetails.JobTextDetail#dispose() */ @Override public void dispose() { dispose( this.button ); dispose( this.composite ); this.button = null; this.composite = null; super.dispose(); } private Button createButton( final Composite parent, final FormToolkit formToolkit ) { Button createdButton = formToolkit.createButton( parent, null, SWT.NONE ); createdButton.setImage( getButtonImage() ); createdButton.addSelectionListener( new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( final SelectionEvent e ) { try { IGridJob inputJob = getInputJob(); if( inputJob != null ) { String value = getComplexValue( inputJob ); if( value != null ) { IDE.openEditor( PlatformUI.getWorkbench() .getActiveWorkbenchWindow() .getActivePage(), createEditorInput( inputJob, value ), getEditorId() ); } } } catch( PartInitException exception ) { Activator.logException( exception ); } } } ); return createdButton; } protected String getComplexValue( final IGridJob inputJob ) { return getValue( inputJob ); } protected IEditorInput createEditorInput( final IGridJob inputJob, final String value ) { return new EditorInput( inputJob, getName(), value ); } private class EditorInput implements IStorageEditorInput { private IGridJob inputJob; private String detailName; private String detailValue; private IStorage storage; EditorInput( final IGridJob inputJob, final String detailName, final String detailValue ) { super(); this.detailName = detailName; this.inputJob = inputJob; this.detailValue = detailValue; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals( final Object obj ) { boolean equals = false; if( obj instanceof EditorInput ) { EditorInput otherInput = ( EditorInput )obj; equals = otherInput.inputJob == this.inputJob && otherInput.detailName.equals( this.detailName ); } return equals; } public IStorage getStorage() throws CoreException { if( this.storage == null ) { this.storage = createStorage( this.detailValue ); } return this.storage; } public boolean exists() { return false; } public ImageDescriptor getImageDescriptor() { return ImageDescriptor.getMissingImageDescriptor(); } public String getName() { return this.detailName; } public IPersistableElement getPersistable() { return null; } public String getToolTipText() { return String.format( Messages.JobEditedDetail_editorNameFormat, JobComplexDetail.this.getName(), this.inputJob.getName() ); } @SuppressWarnings("unchecked") public Object getAdapter( final Class adapter ) { Object adaptableObject = null; if( adapter.isAssignableFrom( IStorage.class ) ) { adaptableObject = this.storage; } return adaptableObject; } private IStorage createStorage( final String string ) { return new IStorage() { public InputStream getContents() throws CoreException { return new ByteArrayInputStream( string.getBytes() ); } public IPath getFullPath() { return null; } public String getName() { return null; } public boolean isReadOnly() { return true; } @SuppressWarnings("unchecked") public Object getAdapter( final Class adapter ) { return null; } }; } } /* (non-Javadoc) * @see eu.geclipse.ui.views.jobdetails.JobTextDetail#setVisible(boolean) */ @Override protected void setVisible( final boolean visible ) { setVisible( this.composite, visible ); setVisible( this.button, visible ); super.setVisible( visible ); } /* (non-Javadoc) * @see eu.geclipse.ui.views.jobdetails.JobTextDetail#reuseWidgets(eu.geclipse.ui.views.jobdetails.IJobDetail) */ @Override public void reuseWidgets( final IJobDetail oldDetail ) { JobComplexDetail detail = (JobComplexDetail)oldDetail; this.composite = detail.composite; this.button = detail.button; super.reuseWidgets( oldDetail ); } private Image getButtonImage() { if( image == null ) { ImageDescriptor imageDescriptor = Activator.getDefault() .getImageRegistry() .getDescriptor( Activator.IMG_SEE ); image = imageDescriptor.createImage(); } return image; } protected String getEditorId() { return JobComplexDetail.this.editorId; } }