/******************************************************************************* * Copyright (c) 2008, 2012 EclipseSource and others. * 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: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.rap.internal.design.example.stacks; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.PopupDialog; import org.eclipse.rap.internal.design.example.ILayoutSetConstants; import org.eclipse.rap.internal.design.example.Messages; import org.eclipse.rap.internal.design.example.builder.DummyBuilder; import org.eclipse.rap.internal.design.example.managers.ItemData; import org.eclipse.rap.internal.design.example.managers.ViewToolBarManager; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.ui.interactiondesign.ConfigurableStack; import org.eclipse.rap.ui.interactiondesign.layout.ElementBuilder; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.presentations.IStackPresentationSite; /** * This popup dialog is used for configure presentation properties. Its opened * in the <code>{@link ExampleConfigAction#run()}</code> method. */ public class ConfigurationDialog extends PopupDialog { private static final int OFFSET = 3; private final IStackPresentationSite site; private final ConfigAction action; private final HashMap actionButtonMap = new HashMap(); private final List actionList = new ArrayList(); private final ElementBuilder builder; private Button viewMenuBox; private boolean viewMenuVisChanged; private Label lastImageLabel; private Label description; public ConfigurationDialog( final Shell parent, final int shellStyle, final IStackPresentationSite site, final ConfigAction action ) { super( parent, shellStyle, true, false, false, false, false, null, null ); //parent.setBackgroundMode( SWT.INHERIT_NONE ); this.site = site; this.action = action; builder = new DummyBuilder( parent, ILayoutSetConstants.SET_ID_CONFIG_DIALOG ); viewMenuVisChanged = false; } @Override protected void adjustBounds() { getShell().layout(); IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); Rectangle bounds = window.getShell().getBounds(); int newWidth = getShell().getBounds().width + 20; int newHeight = getShell().getBounds().height + 20; getShell().setBounds( bounds.x + ( bounds.width / 2 ) - ( newWidth / 2 ), bounds.y + ( bounds.height / 2 ) - ( newHeight / 2 ), newWidth, newHeight ); } public boolean close( final boolean save ) { if( save ) { // save the viewmenu visibility saveViewMenuVisibility(); // Save ViewActionVisibility saveViewActionVisibilities(); } return close(); } @Override public boolean close() { ConfigurableStack stackPresentation = ( ConfigurableStack ) action.getStackPresentation(); IToolBarManager manager = stackPresentation.getPartToolBarManager(); if( manager != null ) { manager.update( true ); } action.fireToolBarChange(); return super.close(); } @Override protected Control createDialogArea( final Composite parent ) { Composite background = new Composite( parent, SWT.NONE ); background.setLayout( new FormLayout() ); Color white = builder.getColor( ILayoutSetConstants.CONFIG_WHITE ); Composite configComposite = new Composite( background, SWT.NONE ); FormData fdConfigComposite = new FormData(); fdConfigComposite.top = new FormAttachment( 0, 0 ); fdConfigComposite.left = new FormAttachment( 0, 10 ); fdConfigComposite.right = new FormAttachment( 100, -10 ); fdConfigComposite.bottom = new FormAttachment( 100, -10 ); configComposite.setLayoutData( fdConfigComposite ); configComposite.setLayout( new FormLayout() ); // Fill with ViewActions loadActionSettings( configComposite ); // Viewmenu hookViewMenuArea( white, configComposite ); // OK / Cancel buttons Button cancel = new Button( configComposite, SWT.PUSH ); cancel.setText( Messages.get().ConfigurationDialog_Cancel ); FormData fdCancel = new FormData(); cancel.setLayoutData( fdCancel ); fdCancel.bottom = new FormAttachment( 100, 0 ); fdCancel.right = new FormAttachment( 100, 0 ); fdCancel.width = 90; cancel.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { close( false ); }; } ); Button ok = new Button( configComposite, SWT.PUSH ); ok.setText( Messages.get().ConfigurationDialog_Ok ); FormData fdOK = new FormData(); ok.setLayoutData( fdOK ); fdOK.right = new FormAttachment( cancel, -OFFSET ); fdOK.bottom = fdCancel.bottom; fdOK.width = 90; ok.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { close( true ); }; } ); ok.moveAbove( cancel ); return background; } private void hookViewMenuArea( final Color white, final Composite configComposite ) { if( action.hasPartMenu() ) { viewMenuBox = new Button( configComposite, SWT.CHECK ); viewMenuBox.setForeground( white ); viewMenuBox.setSelection( action.isPartMenuVisible() ); viewMenuVisChanged = viewMenuBox.getSelection(); FormData fdViewMenuBox = new FormData(); viewMenuBox.setLayoutData( fdViewMenuBox ); viewMenuBox.setData( RWT.CUSTOM_VARIANT, "configMenuButton" ); //$NON-NLS-1$ if( lastImageLabel != null ) { fdViewMenuBox.top = new FormAttachment( lastImageLabel, OFFSET ); fdViewMenuBox.left = new FormAttachment( lastImageLabel, OFFSET + 5 ); } else { fdViewMenuBox.top = new FormAttachment( description, OFFSET ); fdViewMenuBox.left = new FormAttachment( 0, OFFSET + 5 ); } viewMenuBox.setText( Messages.get().ConfigurationDialog_ViewMenu ); } } private void loadActionSettings( final Composite container ) { ConfigurableStack stackPresentation = ( ConfigurableStack ) action.getStackPresentation(); IToolBarManager manager = stackPresentation.getPartToolBarManager(); description = null; description = new Label( container, SWT.NONE ); description.setText( Messages.get().ConfigurationDialog_VisibleActions ); FormData fdActionDesc = new FormData(); description.setLayoutData( fdActionDesc ); if( viewMenuBox != null ) { fdActionDesc.top = new FormAttachment( viewMenuBox, OFFSET ); } else { fdActionDesc.top = new FormAttachment( 0, OFFSET ); } fdActionDesc.left = new FormAttachment( 0, OFFSET ); if( manager != null ) { String paneId = stackPresentation.getPaneId( site ); if( manager instanceof ViewToolBarManager ) { //manager.update( true ); ItemData[] itemsData = ( ( ViewToolBarManager) manager ).getItemsData(); for( int i = 0; i < itemsData.length; i++ ) { ItemData itemData = itemsData[ i ]; // handle parameter String itemId = itemData.getId(); Image icon = itemData.getImage(); String text = ""; //$NON-NLS-1$ if( itemData.getText() != null && !itemData.getText().equals( "" ) ) { //$NON-NLS-1$ text = itemData.getText(); } else { text = itemData.getToolTipText(); } // render the dialog Label imageLabel = new Label( container, SWT.NONE ); imageLabel.setImage( icon ); FormData fdImageLabel = new FormData(); imageLabel.setLayoutData( fdImageLabel ); if( lastImageLabel != null ) { fdImageLabel.top = new FormAttachment( lastImageLabel, OFFSET ); lastImageLabel = imageLabel; } else { fdImageLabel.top = new FormAttachment( description, OFFSET ); lastImageLabel = imageLabel; } fdImageLabel.left = new FormAttachment( 0, OFFSET * 4 ); Button check = new Button( container, SWT.CHECK ); check.setText( text ); check.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); boolean selected = action.isViewActionVisibile( paneId, itemId ); FormData fdCheck = new FormData(); check.setLayoutData( fdCheck ); fdCheck.left = new FormAttachment( imageLabel, OFFSET + 5 ); fdCheck.top = fdImageLabel.top; check.setSelection( selected ); check.setData( RWT.CUSTOM_VARIANT, "configMenuButton" ); //$NON-NLS-1$ actionButtonMap.put( itemId, check ); actionList.add( itemId ); lastImageLabel = imageLabel; } } } } @Override public int open() { int result = super.open(); Shell shell = getShell(); shell.setData( RWT.CUSTOM_VARIANT, "confDialog" ); //$NON-NLS-1$ shell.setBackgroundMode( SWT.INHERIT_NONE ); shell.setText( Messages.get().ConfigurationDialog_ConfigurationFor + site.getSelectedPart().getName() ); String configDialogIcon = ILayoutSetConstants.CONFIG_DIALOG_ICON; shell.setImage( builder.getImage( configDialogIcon ) ); shell.setActive(); shell.setFocus(); action.fireToolBarChange(); adjustBounds(); return result; } private void saveViewActionVisibilities() { ConfigurableStack stackPresentation = ( ConfigurableStack ) action.getStackPresentation(); String paneId = stackPresentation.getPaneId( site ); for( int i = 0; i < actionList.size(); i++ ) { String actionId = ( String ) actionList.get( i ); Button check = ( Button ) actionButtonMap.get( actionId ); action.saveViewActionVisibility( paneId, actionId, check.getSelection() ); } } private void saveViewMenuVisibility() { if( viewMenuBox != null ) { boolean selection = viewMenuBox.getSelection(); if( selection != viewMenuVisChanged ) { action.savePartMenuVisibility( selection ); } } } }