1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2012 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.browsing.ui.swt;
\r
14 import java.util.Collection;
\r
16 import org.eclipse.jface.layout.GridDataFactory;
\r
17 import org.eclipse.jface.viewers.IPostSelectionProvider;
\r
18 import org.eclipse.jface.viewers.ISelection;
\r
19 import org.eclipse.jface.viewers.ISelectionChangedListener;
\r
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.eclipse.swt.events.SelectionEvent;
\r
23 import org.eclipse.swt.events.SelectionListener;
\r
24 import org.eclipse.swt.graphics.Font;
\r
25 import org.eclipse.swt.graphics.FontData;
\r
26 import org.eclipse.swt.widgets.Combo;
\r
27 import org.eclipse.swt.widgets.Composite;
\r
28 import org.simantics.browsing.ui.BuiltinKeys;
\r
29 import org.simantics.browsing.ui.GraphExplorer;
\r
30 import org.simantics.browsing.ui.NodeContext;
\r
31 import org.simantics.browsing.ui.common.processors.UserSelectedViewpointFactoryQueryProcessor;
\r
32 import org.simantics.browsing.ui.content.ViewpointFactory;
\r
33 import org.simantics.db.layer0.SelectionHints;
\r
34 import org.simantics.utils.datastructures.Pair;
\r
35 import org.simantics.utils.ui.ISelectionUtils;
\r
36 import org.simantics.utils.ui.LayoutUtils;
\r
39 * TODO: support multiselection within the IGraphExplorer
\r
41 public class ViewpointSelector extends Composite {
\r
45 public ViewpointSelector(final GraphExplorer explorer, final UserSelectedViewpointFactoryQueryProcessor queryProcessor, Composite parent, int style) {
\r
47 super(parent, style);
\r
49 setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
\r
51 setLayout(LayoutUtils.createNoBorderGridLayout(1, false));
\r
53 final Combo combo = new Combo(this, SWT.READ_ONLY);
\r
55 Font initialFont = combo.getFont();
\r
56 FontData[] fontData = initialFont.getFontData();
\r
57 for (int i = 0; i < fontData.length; i++) {
\r
58 fontData[i].setHeight(fontData[i].getHeight() - 1);
\r
60 smallFont = new Font(getDisplay(), fontData);
\r
61 combo.setFont(smallFont);
\r
63 combo.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
\r
64 combo.add("-- No viewpoints --");
\r
67 combo.addSelectionListener(new SelectionListener() {
\r
70 public void widgetDefaultSelected(SelectionEvent e) {
\r
74 @SuppressWarnings("unchecked")
\r
76 public void widgetSelected(SelectionEvent e) {
\r
78 int index = combo.getSelectionIndex();
\r
80 Pair<ViewpointFactory, NodeContext> pair =
\r
81 (Pair<ViewpointFactory, NodeContext>)combo.getData(String.valueOf(index));
\r
85 queryProcessor.select(pair.second, pair.first);
\r
91 IPostSelectionProvider selectionProvider = (IPostSelectionProvider)explorer.getAdapter(IPostSelectionProvider.class);
\r
93 selectionProvider.addSelectionChangedListener(new ISelectionChangedListener() {
\r
96 public void selectionChanged(SelectionChangedEvent event) {
\r
98 ISelection selection = event.getSelection();
\r
99 NodeContext context = ISelectionUtils.getSinglePossibleKey(selection, SelectionHints.KEY_MAIN, NodeContext.class);
\r
101 if(context == null) {
\r
102 context = explorer.getRoot();
\r
105 assert(context != null);
\r
107 Collection<ViewpointFactory> factories = explorer.query(context, BuiltinKeys.VIEWPOINT_FACTORIES);
\r
109 ViewpointFactory oldSelection = queryProcessor.getSelection(context);
\r
112 if(factories != null) {
\r
113 for(ViewpointFactory f : factories) {
\r
114 int index = combo.getItemCount();
\r
115 combo.add(f.toString());
\r
116 combo.setData(String.valueOf(index), new Pair<ViewpointFactory, NodeContext>(f, context));
\r
117 if(f == oldSelection) {
\r
118 combo.select(index);
\r
122 if(combo.getItemCount() == 0) {
\r
123 combo.add("-- No viewpoints --");
\r
125 if(combo.getSelectionIndex() == -1) {
\r
136 public void dispose() {
\r
139 smallFont.dispose();
\r