/*******************************************************************************
* Copyright (c) 2002, 2013 Innoopract Informationssysteme GmbH 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.rap.demo.presentation;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.internal.dnd.DragUtil;
import org.eclipse.ui.presentations.*;
class StackPresentationImpl extends StackPresentation {
private static final int TITLE_HEIGHT = 30;
private List<IPresentablePart> presentableParts = new ArrayList<IPresentablePart>();
private Control control;
private IPresentablePart current;
private Label content;
private Button head;
protected StackPresentationImpl( final IStackPresentationSite stackSite,
final Composite parent )
{
super( stackSite );
Display display = parent.getDisplay();
Composite background = new Composite( parent, SWT.NONE );
background.setBackgroundMode( SWT.INHERIT_FORCE );
background.setLayout( new FormLayout() );
content = new Label( background, SWT.NONE );
content.setBackground( display.getSystemColor( SWT.COLOR_WHITE ) );
FormData fdContent = createFormData( content );
fdContent.top = new FormAttachment( 0, TITLE_HEIGHT );
fdContent.left = new FormAttachment( 0, 2 );
fdContent.right = new FormAttachment( 100, -2 );
fdContent.bottom = new FormAttachment( 100, -2 );
content.addControlListener( new ControlAdapter() {
@Override
public void controlResized( final ControlEvent evt ) {
layout();
}
} );
head = new Button( background, SWT.PUSH | SWT.FLAT | SWT.LEAD );
FontData fontData = head.getFont().getFontData()[ 0 ];
head.setFont( new Font( display,
fontData.getName(),
fontData.getHeight() + 2,
fontData.getStyle() ) );
FormData fdHead = createFormData( head );
fdHead.top = new FormAttachment( 0, -1 );
fdHead.left = new FormAttachment( 0, -1 );
fdHead.height = TITLE_HEIGHT + 1;
fdHead.right = new FormAttachment( 100, 1 );
head.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent evt ) {
Object[] parts = presentableParts.toArray();
SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent evt ) {
TableItem item = ( TableItem )evt.item;
IPresentablePart part = ( IPresentablePart )item.getData();
getSite().selectPart( part );
Control control = ( Control )evt.widget;
control.getShell().close();
}
};
PopupDialog popupDialog = new StackPopup( head.getShell(),
content,
parts,
listener );
popupDialog.open();
}
} );
Label topLeft = createImageLabel( background, Images.IMG_TOP_LEFT );
FormData fdTopLeft = createFormData( topLeft );
fdTopLeft.left = new FormAttachment( 0, 0 );
fdTopLeft.top = new FormAttachment( 0, 0 );
Label topRight = createImageLabel( background, Images.IMG_TOP_RIGHT );
FormData fdTopRight = createFormData( topRight );
fdTopRight.top = new FormAttachment( 0, 0 );
fdTopRight.left = new FormAttachment( 100, -topRight.getSize().x );
Label topCenter = new Label( background, SWT.NONE );
topCenter.setBackgroundImage( Images.IMG_TOP_CENTER );
FormData fdTopCenter = createFormData( topCenter );
fdTopCenter.top = new FormAttachment( 0, 0 );
fdTopCenter.left = new FormAttachment( topLeft );
fdTopCenter.right = new FormAttachment( topRight );
fdTopCenter.height = Images.IMG_TOP_CENTER.getBounds().height;
Label middleLeft = new Label( background, SWT.NONE );
middleLeft.setBackgroundImage( Images.IMG_MIDDLE_LEFT );
FormData fdMiddleLeft = createFormData( middleLeft );
fdMiddleLeft.top = new FormAttachment( topLeft );
fdMiddleLeft.left = new FormAttachment( 0, 0 );
fdMiddleLeft.width = Images.IMG_MIDDLE_LEFT.getBounds().width;
fdMiddleLeft.bottom
= new FormAttachment( 100, -Images.IMG_BOTTOM_LEFT.getBounds().height );
Label middleRight = new Label( background, SWT.NONE );
middleRight.setBackgroundImage( Images.IMG_MIDDLE_RIGHT );
FormData fdMiddleRight = createFormData( middleRight );
fdMiddleRight.top = new FormAttachment( topRight );
fdMiddleRight.left
= new FormAttachment( 100, -Images.IMG_MIDDLE_RIGHT.getBounds().width );
fdMiddleRight.width = Images.IMG_MIDDLE_RIGHT.getBounds().width;
int height = -Images.IMG_BOTTOM_RIGHT.getBounds().height;
fdMiddleRight.bottom = new FormAttachment( 100, height );
Label bottomLeft = createImageLabel( background, Images.IMG_BOTTOM_LEFT );
FormData fdBottomLeft = createFormData( bottomLeft );
fdBottomLeft.left = new FormAttachment( 0, 0 );
fdBottomLeft.top = new FormAttachment( middleLeft );
Label bottomRight = createImageLabel( background, Images.IMG_BOTTOM_RIGHT );
FormData fdBottomRight = createFormData( bottomRight );
fdBottomRight.top = new FormAttachment( middleRight );
fdBottomRight.left = new FormAttachment( 100, -bottomRight.getSize().x );
Label bottomCenter = new Label( background, SWT.NONE );
bottomCenter.setBackgroundImage( Images.IMG_BOTTOM_CENTER );
FormData fdBottomCenter = createFormData( bottomCenter );
fdBottomCenter.bottom = new FormAttachment( 100, 0 );
fdBottomCenter.left = new FormAttachment( bottomLeft );
fdBottomCenter.right = new FormAttachment( bottomRight );
fdBottomCenter.height = Images.IMG_BOTTOM_CENTER.getBounds().height;
Label middleCenter = new Label( background, SWT.NONE );
middleCenter.setBackgroundImage( Images.IMG_MIDDLE_CENTER );
FormData fdMiddleCenter = createFormData( middleCenter );
fdMiddleCenter.top = new FormAttachment( topCenter );
fdMiddleCenter.left = new FormAttachment( middleLeft );
fdMiddleCenter.right = new FormAttachment( middleRight );
fdMiddleCenter.bottom = new FormAttachment( bottomCenter );
control = background;
}
private FormData createFormData( final Control control ) {
FormData result = new FormData();
control.setLayoutData( result );
return result;
}
private Label createImageLabel( final Composite background,
final Image cornerImage )
{
Label result = new Label( background, SWT.NONE );
result.setImage( cornerImage );
Rectangle boundsLeft = cornerImage.getBounds();
result.setSize( boundsLeft.width, boundsLeft.height );
return result;
}
@Override
public void addPart( final IPresentablePart newPart, final Object cookie ) {
presentableParts.add( newPart );
}
@Override
public void dispose() {
}
@Override
public Control getControl() {
return control;
}
@Override
public Control[] getTabList( final IPresentablePart part ) {
return null;
}
@Override
public void removePart( final IPresentablePart oldPart ) {
presentableParts.remove( oldPart );
}
@Override
public void selectPart( final IPresentablePart toSelect ) {
if( toSelect != null ) {
toSelect.setVisible( true );
head.setImage( toSelect.getTitleImage() );
head.setText( toSelect.getTitle() );
} else {
head.setText( "" );
head.setImage( null );
}
if( current != null ) {
current.setVisible( false );
}
current = toSelect;
layout();
}
protected void layout() {
if( current != null ) {
Rectangle clientArea = DragUtil.getDisplayBounds( content );
Rectangle bounds = Geometry.toControl( current.getControl().getParent(),
clientArea );
current.setBounds( bounds );
}
}
@Override
public void setActive( final int newState ) {
}
@Override
public void setBounds( final Rectangle bounds ) {
control.setBounds( bounds.x + 4,
bounds.y + 4,
bounds.width - 8,
bounds.height - 8 );
}
@Override
public void setState( final int state ) {
}
@Override
public void setVisible( final boolean isVisible ) {
}
@Override
public void showPaneMenu() {
}
@Override
public void showSystemMenu() {
}
@Override
public StackDropResult dragOver( final Control currentControl,
final Point location )
{
return null;
}
}