/******************************************************************************* * Copyright (c) 2006-2007 IBM Corporation 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: * Nicolas Richeton (nicolas.richeton@gmail.com) - initial implementation *******************************************************************************/ package org.eclipse.nebula.widgets.gallery.example; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.nebula.animation.ScrollingSmoother; import org.eclipse.nebula.animation.movement.BounceOut; import org.eclipse.nebula.animation.movement.ElasticOut; import org.eclipse.nebula.animation.movement.ExpoOut; import org.eclipse.nebula.animation.movement.IMovement; import org.eclipse.nebula.animation.movement.LinearInOut; import org.eclipse.nebula.widgets.gallery.AbstractGalleryItemRenderer; import org.eclipse.nebula.widgets.gallery.AbstractGridGroupRenderer; import org.eclipse.nebula.widgets.gallery.DefaultGalleryGroupRenderer; import org.eclipse.nebula.widgets.gallery.DefaultGalleryItemRenderer; import org.eclipse.nebula.widgets.gallery.Gallery; import org.eclipse.nebula.widgets.gallery.GalleryItem; import org.eclipse.nebula.widgets.gallery.ListItemRenderer; import org.eclipse.nebula.widgets.gallery.NoGroupRenderer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.nebula.examples.AbstractExampleTab; import org.eclipse.nebula.examples.ExamplesView; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Spinner; /** * Demonstrates the Gallery widget. * * @author Nicolas Richeton (nicolas.richeton@gmail.com) */ public class GalleryExampleTab extends AbstractExampleTab { class WidgetParamSelectionListener implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { recreateExample(); } } class GroupRendererParamSelectionListener implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (g != null) { g.setGroupRenderer(getGroupRenderer()); } } } class ItemRendererParamSelectionListener implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (g != null) { g.setItemRenderer(getItemRenderer()); } } } class ContentParamSelectionListener implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { clearAndPopulateGallery(g); } } WidgetParamSelectionListener widgetParamSelectionListener = new WidgetParamSelectionListener(); GroupRendererParamSelectionListener groupParamSelectionListener = new GroupRendererParamSelectionListener(); ItemRendererParamSelectionListener itemRendererParamSelectionListener = new ItemRendererParamSelectionListener(); ContentParamSelectionListener contentParamSelectionListener = new ContentParamSelectionListener(); Image womanImage = null; Image bgImage = null; Image eclipseImage = null; Gallery g = null; ScrollingSmoother scrollingSmoother; // Style options Button bMulti = null; Button bHScroll = null; Button bVScroll = null; // Animation options Button bAnimation = null; // Data options Button bGroupImage = null; Button bGroupDescription = null; Button bItemDescription = null; // Size options Scale scale = null; Scale itemWidthScale = null; Scale itemHeightScale = null; Scale marginsScale = null; DefaultGalleryItemRenderer itemRenderer = null; AbstractGridGroupRenderer groupRenderer = null; private Button bLayoutAutoMargin; private Button bLayoutAlwaysExpanded; private Combo cAnimationMovement; private Spinner sAnimationDuration; private Button bLayoutLowQualityOnAction; private Button bItemDropShadow; private Spinner sItemDropShadowSize; private Button bItemLabel; private Combo cItemRenderer; private Button bDecoratorLeft; private Button bDecoratorUp; private Button bDecoratorRight; private Button bDecoratorDown; private Spinner sDecoratorNumber; private Combo cGroupRenderer; public Control createControl(Composite parent) { int style = SWT.NONE; if (bMulti.getSelection()) style |= SWT.MULTI; if (bHScroll.getSelection()) style |= SWT.H_SCROLL; if (bVScroll.getSelection()) style |= SWT.V_SCROLL; g = new Gallery(parent, style); scrollingSmoother = new ScrollingSmoother(g, new ExpoOut()); scrollingSmoother.smoothControl(bAnimation.getSelection()); if (groupRenderer != null) { groupRenderer.dispose(); } groupRenderer = getGroupRenderer(); g.setGroupRenderer(groupRenderer); if (itemRenderer != null) { itemRenderer.dispose(); } g.setItemRenderer(getItemRenderer()); // Create item image if (womanImage == null) { womanImage = ExamplesView.getImage("icons/woman3.png"); } if (bgImage == null) { bgImage = ExamplesView.getImage("icons/background_small.png"); } if (eclipseImage == null) { eclipseImage = ExamplesView.getImage("icons/eclipse.png"); } g.setLowQualityOnUserAction(bLayoutLowQualityOnAction.getSelection()); // Add items. this.clearAndPopulateGallery(g); return g; } private AbstractGalleryItemRenderer getItemRenderer() { AbstractGalleryItemRenderer result = null; if (cItemRenderer.getSelectionIndex() == 0) { DefaultGalleryItemRenderer renderer = new DefaultGalleryItemRenderer(); renderer.setShowLabels(bItemLabel.getSelection()); renderer.setDropShadowsSize(sItemDropShadowSize.getSelection()); renderer.setDropShadows(bItemDropShadow.getSelection()); result= renderer; } else { ListItemRenderer renderer = new ListItemRenderer(); renderer.setShowLabels(bItemLabel.getSelection()); renderer.setDropShadowsSize(sItemDropShadowSize.getSelection()); renderer.setDropShadows(bItemDropShadow.getSelection()); result= renderer; } return result; } private AbstractGridGroupRenderer getGroupRenderer() { AbstractGridGroupRenderer result = null; if (cGroupRenderer.getSelectionIndex() == 0) { DefaultGalleryGroupRenderer groupRenderer = new DefaultGalleryGroupRenderer(); if (bAnimation.getSelection()) { // Animation groupRenderer.setAnimation(true); // Movement IMovement m = null; switch (cAnimationMovement.getSelectionIndex()) { case 1: m = new BounceOut(); break; case 2: m = new ElasticOut(); break; case 3: m = new LinearInOut(); break; default: m = new ExpoOut(); break; } groupRenderer.setAnimationCloseMovement(m); groupRenderer.setAnimationOpenMovement(m); // Length groupRenderer.setAnimationLength(sAnimationDuration .getSelection()); } else { groupRenderer.setAnimation(false); } result = groupRenderer; } else { NoGroupRenderer groupRenderer = new NoGroupRenderer(); result = groupRenderer; } result.setItemWidth(this.itemWidthScale.getSelection()); result.setItemHeight(this.itemHeightScale.getSelection()); result.setMinMargin(this.marginsScale.getSelection()); result.setAutoMargin(bLayoutAutoMargin.getSelection()); result.setAlwaysExpanded(bLayoutAlwaysExpanded.getSelection()); scrollingSmoother.smoothControl(bAnimation.getSelection()); return result; } private void clearAndPopulateGallery(Gallery g) { g.removeAll(); if ((g.getStyle() & SWT.VIRTUAL) == 0) { this.populateGalleryWithGroups(g); } else { // Virtual mode. // TODO: Virtual mode example } } /** * Add 10 groups containing 10 to 100 items each. * * @param g */ private void populateGalleryWithGroups(Gallery g) { for (int i = 0; i < 10; i++) { GalleryItem gi1 = new GalleryItem(g, SWT.None); gi1.setText("Group " + i + ".jpg"); if (bGroupImage.getSelection()) { gi1.setImage(womanImage); } if (bGroupDescription.getSelection()) { gi1.setText(1, "Group description"); } if (i % 2 == 0) { gi1.setExpanded(true); } for (int j = 0; j < (10 * (i + 1)); j++) { GalleryItem gi2 = new GalleryItem(gi1, SWT.None); if (j % 2 == 0) { gi2.setImage(womanImage); } else { gi2.setImage(bgImage); } gi2.setText("Eclipse " + i + " " + j + ".jpg"); if (bItemDescription.getSelection()) { gi2.setText(1, "Image description"); } if (bDecoratorLeft.getSelection()) { gi2.setData(DefaultGalleryItemRenderer.OVERLAY_TOP_LEFT, getDecoratorImage(eclipseImage, sDecoratorNumber .getSelection())); } if (bDecoratorUp.getSelection()) { gi2.setData(DefaultGalleryItemRenderer.OVERLAY_TOP_RIGHT, getDecoratorImage(eclipseImage, sDecoratorNumber .getSelection())); } if (bDecoratorRight.getSelection()) { gi2.setData( DefaultGalleryItemRenderer.OVERLAY_BOTTOM_RIGHT, getDecoratorImage(eclipseImage, sDecoratorNumber .getSelection())); } if (bDecoratorDown.getSelection()) { gi2.setData(DefaultGalleryItemRenderer.OVERLAY_BOTTOM_LEFT, getDecoratorImage(eclipseImage, sDecoratorNumber .getSelection())); } } } } private Object getDecoratorImage(Image img, int nb) { switch (nb) { case 0: return null; case 1: return img; default: Image[] result = new Image[nb]; for (int i = 0; i < nb; i++) { result[i] = img; } return result; } } public String[] createLinks() { String[] links = new String[4]; links[0] = "<a href=\"http://www.eclipse.org/nebula/widgets/gallery/gallery.php\">Gallery Home Page</a>"; links[1] = "<a href=\"http://www.eclipse.org/nebula/snippets.php#Gallery\">Snippets</a>"; links[2] = "<a href=\"https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Technology&product=Nebula&component=Gallery&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=\">Bugs</a>"; links[3] = "<a href=\"http://www.eclipse.org/projects/project-plan.php?projectid=technology.nebula\">Projet plan</a>"; return links; } private Button createButton(Composite parent, int style, String text, boolean selected, boolean createExampleOnChange) { Button button = new Button(parent, style); button.setText(text); button.setSelection(selected); if (createExampleOnChange) { button.addSelectionListener(new WidgetParamSelectionListener()); } return button; } private Group createEmptyGroup(Composite parent, String text) { Group styleGroup = new Group(parent, SWT.NONE); styleGroup.setText(text); GridData gd = new GridData(); gd.horizontalSpan = 3; gd.horizontalAlignment = SWT.FILL; styleGroup.setLayoutData(gd); return styleGroup; } private void createStyleGroup(Composite parent) { Group styleGroup = createEmptyGroup(parent, "Style"); styleGroup.setLayout(new RowLayout()); bMulti = createButton(styleGroup, SWT.CHECK, "SWT.MULTI", false, true); bVScroll = createButton(styleGroup, SWT.RADIO, "SWT.V_SCROLL", true, true); bHScroll = createButton(styleGroup, SWT.RADIO, "SWT.H_SCROLL", false, true); } private void createAnimationGroup(Composite parent) { Group animationGroup = createEmptyGroup(parent, "Animation"); animationGroup.setLayout(new RowLayout()); bAnimation = createButton(animationGroup, SWT.CHECK, "Animations", false, false); bAnimation.addSelectionListener(groupParamSelectionListener); cAnimationMovement = new Combo(animationGroup, SWT.READ_ONLY); cAnimationMovement.setItems(new String[] { "ExpoOut", "BounceOut", "ElasticOut", "LinearInOut" }); cAnimationMovement.setText("ExpoOut"); cAnimationMovement.addSelectionListener(groupParamSelectionListener); sAnimationDuration = new Spinner(animationGroup, SWT.NONE); sAnimationDuration.setMinimum(250); sAnimationDuration.setMaximum(5000); sAnimationDuration.setIncrement(100); sAnimationDuration.setSelection(500); sAnimationDuration.addSelectionListener(groupParamSelectionListener); } private void createDataGroup(Composite parent) { Group dataGroup = createEmptyGroup(parent, "Data"); dataGroup.setLayout(new RowLayout()); bGroupImage = createButton(dataGroup, SWT.CHECK, "Group image", false, true); bGroupDescription = createButton(dataGroup, SWT.CHECK, "Group descriptions", false, true); bItemDescription = createButton(dataGroup, SWT.CHECK, "Item descriptions", false, true); } private void createLayoutGroup(Composite parent) { Group dataGroup = createEmptyGroup(parent, "Layout"); dataGroup.setLayout(new RowLayout()); bLayoutAutoMargin = createButton(dataGroup, SWT.CHECK, "Auto Margins", false, true); bLayoutAlwaysExpanded = createButton(dataGroup, SWT.CHECK, "Always expanded", false, true); bLayoutLowQualityOnAction = createButton(dataGroup, SWT.CHECK, "Low quality on user action", false, true); } private void createDecoratorsGroup(Composite parent) { Group dataGroup = createEmptyGroup(parent, "Decorators"); dataGroup.setLayout(new RowLayout()); sDecoratorNumber = new Spinner(dataGroup, SWT.NONE); sDecoratorNumber.setMinimum(1); sDecoratorNumber.setMaximum(5); sDecoratorNumber.setIncrement(1); sDecoratorNumber.setSelection(1); sDecoratorNumber.addSelectionListener(contentParamSelectionListener); bDecoratorLeft = createButton(dataGroup, SWT.CHECK, "Top Left", false, false); bDecoratorLeft.addSelectionListener(contentParamSelectionListener); bDecoratorUp = createButton(dataGroup, SWT.CHECK, "Top Right", false, false); bDecoratorUp.addSelectionListener(contentParamSelectionListener); bDecoratorRight = createButton(dataGroup, SWT.CHECK, "Bottom Right", false, false); bDecoratorRight.addSelectionListener(contentParamSelectionListener); bDecoratorDown = createButton(dataGroup, SWT.CHECK, "Bottom Left", false, false); bDecoratorDown.addSelectionListener(contentParamSelectionListener); } private void createItemParametersGroup(Composite parent) { Group dataGroup = createEmptyGroup(parent, "Item parameters"); dataGroup.setLayout(new RowLayout()); cItemRenderer = new Combo(dataGroup, SWT.READ_ONLY); cItemRenderer.setItems(new String[] { "Icon", "List" }); cItemRenderer.setText("Icon"); cItemRenderer.addSelectionListener(itemRendererParamSelectionListener); bItemDropShadow = createButton(dataGroup, SWT.CHECK, "Drop shadow", false, true); sItemDropShadowSize = new Spinner(dataGroup, SWT.NONE); sItemDropShadowSize.setMinimum(0); sItemDropShadowSize.setMaximum(20); sItemDropShadowSize.setIncrement(1); sItemDropShadowSize.setSelection(5); sItemDropShadowSize .addSelectionListener(itemRendererParamSelectionListener); bItemLabel = createButton(dataGroup, SWT.CHECK, "Display labels", false, true); } private void createGroupParametersGroup(Composite parent) { Group dataGroup = createEmptyGroup(parent, "Group parameters"); GridLayoutFactory.swtDefaults().margins(3, 3).numColumns(3).applyTo( dataGroup); cGroupRenderer = new Combo(dataGroup, SWT.READ_ONLY); cGroupRenderer .setItems(new String[] { "Show groups", "Hide groups" }); cGroupRenderer.setText("Show groups"); cGroupRenderer.addSelectionListener(groupParamSelectionListener); GridData gridData = new GridData(); gridData.horizontalSpan = 3; cGroupRenderer.setLayoutData(gridData); // Scale : set item size scale = createScale(dataGroup, "Item size", 16, 512, 16, 64); scale.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { if (g != null) { groupRenderer.setItemSize(scale.getSelection(), scale .getSelection()); itemWidthScale.setSelection(scale.getSelection()); itemHeightScale.setSelection(scale.getSelection()); g.setGroupRenderer(groupRenderer); } } public void widgetDefaultSelected(SelectionEvent arg0) { } }); // Scale : set item width this.itemWidthScale = createScale(dataGroup, "Item width", 16, 512, 16, 64); itemWidthScale.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { if (g != null) { groupRenderer.setItemWidth(itemWidthScale.getSelection()); g.setGroupRenderer(groupRenderer); } } public void widgetDefaultSelected(SelectionEvent arg0) { } }); // Scale : set item height this.itemHeightScale = createScale(dataGroup, "Item height", 16, 512, 16, 64); itemHeightScale.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { if (g != null) { groupRenderer.setItemHeight(itemHeightScale.getSelection()); g.setGroupRenderer(groupRenderer); } } public void widgetDefaultSelected(SelectionEvent arg0) { } }); // Scale : set margins size this.marginsScale = createScale(dataGroup, "Margins", 0, 128, 16, 10); marginsScale.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent arg0) { if (g != null) { groupRenderer.setMinMargin(marginsScale.getSelection()); g.setGroupRenderer(groupRenderer); } } public void widgetDefaultSelected(SelectionEvent arg0) { } }); } public void createParameters(Composite parent) { GridLayoutFactory.swtDefaults().margins(0, 0).numColumns(3).applyTo( parent); createStyleGroup(parent); createAnimationGroup(parent); createDataGroup(parent); createDecoratorsGroup(parent); createLayoutGroup(parent); createGroupParametersGroup(parent); createItemParametersGroup(parent); Button b = new Button(parent, SWT.NONE); b.setText("deselectAll"); b.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { g.deselectAll(); } }); } private Scale createScale(Composite parent, String text, int min, int max, int increment, int value) { GridData gridData = new GridData(); Label l = new Label(parent, SWT.NONE); l.setText(text); gridData.horizontalSpan = 1; l.setLayoutData(gridData); Scale scale = new Scale(parent, SWT.NONE); gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; gridData.horizontalSpan = 2; scale.setLayoutData(gridData); scale.setMaximum(max); scale.setMinimum(min); scale.setPageIncrement(increment); scale.setSelection(value); return scale; } }