Package org.eclipse.sapphire.ui.forms.swt.internal

Source Code of org.eclipse.sapphire.ui.forms.swt.internal.StatusDialog

/******************************************************************************
* Copyright (c) 2014 Oracle
* 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
*
* Contributors:
*    Konstantin Komissarchik - initial implementation
******************************************************************************/

package org.eclipse.sapphire.ui.forms.swt.internal;

import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gd;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdfill;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdhhint;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdvalign;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdwhint;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.glayout;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.glspacing;

import java.util.Iterator;
import java.util.SortedSet;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.sapphire.LocalizableText;
import org.eclipse.sapphire.Text;
import org.eclipse.sapphire.modeling.Status;
import org.eclipse.sapphire.ui.forms.swt.SwtResourceCache;
import org.eclipse.sapphire.ui.forms.swt.SwtUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

/**
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/

public final class StatusDialog extends Dialog
{
    @Text( "Error" )
    private static LocalizableText errorDialogTitle;
   
    @Text( "Warning" )
    private static LocalizableText warningDialogTitle;
   
    @Text( "Problems" )
    private static LocalizableText problemsDialogTitle;
   
    @Text( "[error]" )
    private static LocalizableText errorMessagePrefix;
   
    @Text( "[warning]" )
    private static LocalizableText warningMessagePrefix;
   
    @Text( "Copy" )
    private static LocalizableText copyMenuItemLabel;
   
    static
    {
        LocalizableText.init( StatusDialog.class );
    }

    private final Status status;
    private TreeViewer treeViewer;
    private Tree tree;
   
    private StatusDialog( final Shell shell, final Status status )
    {
        super( shell );
        this.status = status;
    }
   
    public static void open( final Shell shell,
                             final Status status )
    {
        if( status.children().isEmpty() )
        {
            if( status.severity() == Status.Severity.ERROR )
            {
                MessageDialog.openError( shell, errorDialogTitle.text(), status.message() );
            }
            else
            {
                MessageDialog.openWarning( shell, warningDialogTitle.text(), status.message() );
            }
        }
        else
        {
            ( new StatusDialog( shell, status ) ).open();
        }
    }
   
    @Override
   
    protected Control createDialogArea( final Composite parent )
    {
        getShell().setText( problemsDialogTitle.text() );
       
        final Composite composite = (Composite) super.createDialogArea( parent );
        composite.setLayout( glspacing( glayout( 2, 10, 10 ), 10 ) );
       
        final Label imageLabel = new Label( composite, SWT.NONE );
        imageLabel.setLayoutData( gdvalign( gd(), SWT.TOP ) );
       
        if( this.status.severity() == Status.Severity.ERROR )
        {
            imageLabel.setImage( getShell().getDisplay().getSystemImage( SWT.ICON_ERROR ) );
        }
        else
        {
            imageLabel.setImage( getShell().getDisplay().getSystemImage( SWT.ICON_WARNING ) );
        }
       
        this.treeViewer = new TreeViewer( composite, SWT.BORDER | SWT.MULTI );
       
        this.tree = this.treeViewer.getTree();
        this.tree.setLayoutData( gdwhint( gdhhint( gdfill(), 100 ), 400 ) );
       
        final ITreeContentProvider contentProvider = new ITreeContentProvider()
        {
            public Object[] getElements( final Object input )
            {
                return StatusDialog.this.status.children().toArray();
            }

            public Object[] getChildren( final Object element )
            {
                return ( (Status) element ).children().toArray();
            }

            public boolean hasChildren( final Object element )
            {
                return ( ! ( (Status) element ).children().isEmpty() );
            }

            public Object getParent( final Object element )
            {
                return findParent( null, StatusDialog.this.status.children(), (Status) element );
            }
           
            private Status findParent( final Status parent,
                                       final SortedSet<Status> children,
                                       final Status element )
            {
                for( Status child : children )
                {
                    if( child == element )
                    {
                        return parent;
                    }
                    else
                    {
                        final Status result = findParent( child, child.children(), element );
                       
                        if( result != null )
                        {
                            return result;
                        }
                    }
                }
               
                return null;
            }

            public void inputChanged( final Viewer viewer,
                                      final Object oldInput,
                                      final Object newInput )
            {
            }
           
            public void dispose()
            {
            }
        };
       
        final ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
       
        final ILabelProvider labelProvider = new ILabelProvider()
        {
            private Image errorImage;
            private Image warningImage;
           
            public String getText( final Object element )
            {
                return ( (Status) element ).message();
            }

            public Image getImage( final Object element )
            {
                if( ( (Status) element ).severity() == Status.Severity.ERROR )
                {
                    return getErrorImage();
                }
                else
                {
                    return getWarningImage();
                }
            }
           
            private Image getErrorImage()
            {
                if( this.errorImage == null )
                {
                    this.errorImage = SwtUtil.createImageDescriptor( SwtResourceCache.class, "Error.png" ).createImage();
                }
               
                return this.errorImage;
            }
           
            private Image getWarningImage()
            {
                if( this.warningImage == null )
                {
                    this.warningImage = SwtUtil.createImageDescriptor( SwtResourceCache.class, "Warning.png" ).createImage();
                }
               
                return this.warningImage;
            }

            public void addListener( final ILabelProviderListener listener )
            {
            }

            public void removeListener( final ILabelProviderListener listener )
            {
            }
           
            public boolean isLabelProperty( final Object element,
                                            final String property )
            {
                return false;
            }

            public void dispose()
            {
                if( this.errorImage != null )
                {
                    this.errorImage.dispose();
                }
               
                if( this.warningImage != null )
                {
                    this.warningImage.dispose();
                }
            }
        };
       
        this.treeViewer.setContentProvider( contentProvider );
        this.treeViewer.setLabelProvider( labelProvider );
        this.treeViewer.setInput( this );
       
        final Menu menu = new Menu( this.tree );
        this.tree.setMenu( menu );
       
        final MenuItem copyMenuItem = new MenuItem( menu, SWT.PUSH );
        copyMenuItem.setText( copyMenuItemLabel.text() );
        copyMenuItem.setImage( sharedImages.getImage( ISharedImages.IMG_TOOL_COPY ) );
       
        copyMenuItem.addSelectionListener
        (
            new SelectionAdapter()
            {
                @Override
                public void widgetSelected( final SelectionEvent event )
                {
                    copySelectionToClipboard();
                }
            }
        );
       
        return composite;
    }
   
    @Override
   
    protected void createButtonsForButtonBar( final Composite parent )
    {
        createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true );
    }
   
    @Override
   
    protected boolean isResizable()
    {
        return true;
    }
   
    private void copySelectionToClipboard()
    {
        final StringBuilder buf = new StringBuilder();
        final String nl = System.getProperty( "line.separator" );
        final IStructuredSelection selection = (IStructuredSelection) this.treeViewer.getSelection();
       
        for( Iterator<?> itr = selection.iterator(); itr.hasNext(); )
        {
            final Status st = (Status) itr.next();
           
            if( buf.length() > 0 )
            {
                buf.append( nl );
            }
           
            buf.append( st.severity() == Status.Severity.ERROR ? errorMessagePrefix : warningMessagePrefix );
            buf.append( ' ' );
            buf.append( st.message() );
        }
       
        final String text = buf.toString();
       
        if( text.length() > 0 )
        {
            final Clipboard clipboard = new Clipboard( this.tree.getDisplay() );
            final TextTransfer textTransfer = TextTransfer.getInstance();
            clipboard.setContents( new Object[] { text }, new Transfer[] { textTransfer } );
        }
    }
   
}
TOP

Related Classes of org.eclipse.sapphire.ui.forms.swt.internal.StatusDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.