/****************************************************************************** * Copyright (c) 2011, 2016 Stephan Schwiebert 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: * Stephan Schwiebert - initial API and implementation * *******************************************************************************/ package org.eclipse.gef.cloudio.internal.ui.view; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.gef.cloudio.internal.ui.TagCloud; import org.eclipse.gef.cloudio.internal.ui.TagCloudViewer; import org.eclipse.gef.cloudio.internal.ui.data.Type; import org.eclipse.gef.cloudio.internal.ui.layout.DefaultLayouter; import org.eclipse.gef.cloudio.internal.ui.layout.ILayouter; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageLoader; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.part.ViewPart; /** * * @author sschwieb * */ public class TagCloudView extends ViewPart { private TagCloudViewer viewer; private TypeLabelProvider labelProvider; private CloudOptionsComposite options; private ILayouter layouter; public TagCloudView() { } @Override public void createPartControl(Composite parent) { SashForm sash = new SashForm(parent, SWT.HORIZONTAL); sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite cloudComp = new Composite(sash, SWT.NONE); cloudComp.setLayout(new GridLayout()); cloudComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); TagCloud cloud = new TagCloud(cloudComp, SWT.HORIZONTAL | SWT.VERTICAL); cloud.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer = new TagCloudViewer(cloud); layouter = new DefaultLayouter(20, 10); // layouter = new CharacterLayouter(20,10); viewer.setLayouter(layouter); labelProvider = new TypeLabelProvider(); // labelProvider = new CharacterLabelProvider(); viewer.setLabelProvider(labelProvider); viewer.setContentProvider(new IStructuredContentProvider() { @Override public void inputChanged(Viewer v, Object oldInput, Object newInput) { List<?> list = (List<?>) newInput; if (list == null || list.size() == 0) return; labelProvider.setMaxOccurrences(((Type) list.get(0)).getOccurrences()); int minIndex = Math.min(list.size() - 1, viewer.getMaxWords()); labelProvider.setMinOccurrences(((Type) list.get(minIndex)).getOccurrences()); } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { return ((List<?>) inputElement).toArray(); } }); createSideTab(sash); cloud.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.getCloud().addControlListener(new ControlListener() { @Override public void controlResized(ControlEvent e) { viewer.getCloud().zoomFit(); } @Override public void controlMoved(ControlEvent e) { } }); ArrayList<Type> types = new ArrayList<>(); types.add(new Type("Cloudio", 220)); types.add(new Type("Cloudio", 150)); types.add(new Type("Cloudio", 100)); types.add(new Type("No data available", 150)); int size = 55; for (int i = 0; i < 50; i++) { types.add(new Type("Tag Cloud", size)); size--; } viewer.getCloud().setMaxFontSize(100); viewer.getCloud().setMinFontSize(15); labelProvider.setColors(options.getColors()); labelProvider.setFonts(options.getFonts()); sash.setWeights(new int[] { 72, 28 }); viewer.setInput(types); } private void createSideTab(SashForm form) { Composite parent = new Composite(form, SWT.NONE); parent.setLayout(new GridLayout()); parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); options = new CloudOptionsComposite(parent, SWT.NONE, viewer) { protected Group addMaskButton(Composite parent) { Group buttons = new Group(parent, SWT.SHADOW_IN); buttons.setLayout(new GridLayout(2, true)); buttons.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); Label l = new Label(buttons, SWT.NONE); l.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); l.setText("Mask"); Button file = new Button(buttons, SWT.FLAT); file.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); file.setText("Open..."); file.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { FileDialog fd = new FileDialog(getShell(), SWT.OPEN); fd.setText("Select a square b&w png image as mask..."); String sourceFile = fd.open(); if (sourceFile == null) return; try { ImageLoader loader = new ImageLoader(); BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(sourceFile))); ImageData[] data = loader.load(in); in.close(); viewer.getCloud().setBackgroundMask(data[0]); } catch (Exception e) { e.printStackTrace(); } } }); return buttons; } protected void addGroups() { addMaskButton(this); super.addGroups(); } protected Group addLayoutButtons(Composite parent) { Group buttons = super.addLayoutButtons(parent); Label l = new Label(buttons, SWT.NONE); l.setText("Scale"); final Combo scale = new Combo(buttons, SWT.DROP_DOWN | SWT.READ_ONLY); scale.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); scale.setItems(new String[] { "linear", "logarithmic" }); scale.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { switch (scale.getSelectionIndex()) { case 0: labelProvider.setScale(TypeLabelProvider.Scaling.LINEAR); break; case 1: labelProvider.setScale(TypeLabelProvider.Scaling.LOGARITHMIC); break; default: break; } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); scale.select(1); l = new Label(buttons, SWT.NONE); l.setText("X Axis Variation"); final Combo xAxis = new Combo(buttons, SWT.DROP_DOWN | SWT.READ_ONLY); xAxis.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); xAxis.setItems(new String[] { "0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" }); xAxis.select(2); xAxis.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { String item = xAxis.getItem(xAxis.getSelectionIndex()); layouter.setOption(DefaultLayouter.X_AXIS_VARIATION, Integer.parseInt(item)); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); l = new Label(buttons, SWT.NONE); l.setText("Y Axis Variation"); final Combo yAxis = new Combo(buttons, SWT.DROP_DOWN | SWT.READ_ONLY); yAxis.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); yAxis.setItems(new String[] { "0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" }); yAxis.select(1); yAxis.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { String item = yAxis.getItem(yAxis.getSelectionIndex()); layouter.setOption(DefaultLayouter.Y_AXIS_VARIATION, Integer.parseInt(item)); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); Button run = new Button(buttons, SWT.NONE); run.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); run.setText("Re-Position"); run.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { final ProgressMonitorDialog dialog = new ProgressMonitorDialog(viewer.getControl().getShell()); dialog.setBlockOnOpen(false); dialog.open(); dialog.getProgressMonitor().beginTask("Layouting tag cloud...", 100); viewer.reset(dialog.getProgressMonitor(), false); dialog.close(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); Button layout = new Button(buttons, SWT.NONE); layout.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); layout.setText("Re-Layout"); layout.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { ProgressMonitorDialog dialog = new ProgressMonitorDialog(viewer.getControl().getShell()); dialog.setBlockOnOpen(false); dialog.open(); dialog.getProgressMonitor().beginTask("Layouting tag cloud...", 200); viewer.setInput(viewer.getInput(), dialog.getProgressMonitor()); // viewer.reset(dialog.getProgressMonitor(),false); dialog.close(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); return buttons; }; }; GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); options.setLayoutData(gd); } @Override public void setFocus() { viewer.getCloud().setFocus(); } @Override public void dispose() { viewer.getCloud().dispose(); labelProvider.dispose(); } public TagCloudViewer getViewer() { return viewer; } }