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.widgets.impl;
\r
14 import java.util.List;
\r
15 import java.util.Map;
\r
17 import org.eclipse.jface.viewers.ISelection;
\r
18 import org.eclipse.swt.events.ModifyEvent;
\r
19 import org.eclipse.swt.events.ModifyListener;
\r
20 import org.simantics.browsing.ui.swt.widgets.Combo;
\r
21 import org.simantics.db.WriteGraph;
\r
22 import org.simantics.db.common.request.WriteRequest;
\r
23 import org.simantics.db.exception.DatabaseException;
\r
24 import org.simantics.db.management.ISessionContext;
\r
25 import org.simantics.utils.ReflectionUtils;
\r
26 import org.simantics.utils.datastructures.Pair;
\r
27 import org.simantics.utils.ui.ISelectionUtils;
\r
29 abstract public class ModifyComboListenerImpl<T, S> implements ModifyListener, Widget {
\r
31 private ISessionContext context;
\r
32 private Object lastInput = null;
\r
34 final private Class<?> clazz;
\r
36 public ModifyComboListenerImpl() {
\r
37 clazz = ReflectionUtils.getSingleParameterType(getClass());
\r
40 private Object getInputContents(Object input, Class<?> inputClass) {
\r
42 if(inputClass.isInstance(input)) return input;
\r
44 if(input instanceof ISelection) {
\r
45 return ISelectionUtils.filterSingleSelection((ISelection)input, inputClass);
\r
52 @SuppressWarnings("unchecked")
\r
54 public void modifyText(ModifyEvent e) {
\r
56 Combo combo = (Combo)e.widget.getData("org.simantics.browsing.ui.widgets.Combo");
\r
58 int selectionIndex = combo.getWidget().getSelectionIndex();
\r
59 if (selectionIndex == -1)
\r
62 String[] items = combo.getWidget().getItems();
\r
64 String key = items[selectionIndex];
\r
65 final Object input = lastInput;
\r
67 if(e.widget.getData() instanceof List) {
\r
69 List<Pair<String, Object>> data = (List<Pair<String, Object>>) e.widget.getData();
\r
70 Pair<String, Object> pair = data.get(selectionIndex);
\r
71 final Object o = pair.second;
\r
74 context.getSession().syncRequest(new WriteRequest() {
\r
77 public void perform(WriteGraph graph) throws DatabaseException {
\r
79 T single = (T)getInputContents(input, clazz);
\r
80 applySelection(graph, single, (S)o);
\r
85 } catch (DatabaseException e1) {
\r
86 e1.printStackTrace();
\r
89 } else if (e.widget.getData() instanceof Map) {
\r
91 Map<String, Object> data = (Map<String, Object>) e.widget.getData();
\r
92 final Object o = data.get(key);
\r
95 context.getSession().syncRequest(new WriteRequest() {
\r
98 public void perform(WriteGraph graph) throws DatabaseException {
\r
100 T single = (T)getInputContents(input, clazz);
\r
101 applySelection(graph, single, (S)o);
\r
106 } catch (DatabaseException e1) {
\r
107 e1.printStackTrace();
\r
115 public void setInput(ISessionContext context, Object parameter) {
\r
116 this.context = context;
\r
117 lastInput = parameter;
\r
120 abstract public void applySelection(WriteGraph graph, T input, S selection) throws DatabaseException;
\r