/****************************************************************************** * Copyright (c) 2016 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 } ); } } }