1765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/*******************************************************************************
2765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Copyright (c) 2011 Google, Inc.
3765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * All rights reserved. This program and the accompanying materials
4765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * are made available under the terms of the Eclipse Public License v1.0
5765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * which accompanies this distribution, and is available at
6765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * http://www.eclipse.org/legal/epl-v10.html
7765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
8765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Contributors:
9765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *    Google, Inc. - initial API and implementation
10765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *******************************************************************************/
11765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepackage org.eclipse.wb.internal.core.model.property.editor;
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.core.controls.CCombo3;
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.Property;
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.utils.check.Assert;
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport java.util.List;
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport java.util.Map;
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/**
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * The {@link PropertyEditor} for selecting single expression from given set.
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author sablin_aa
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @coverage core.model.property.editor
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic abstract class AbstractListPropertyEditor extends AbstractComboPropertyEditor
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    implements
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      IValueSourcePropertyEditor {
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // TextDisplayPropertyEditor
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @Override
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public String getText(Property property) throws Exception {
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // return title for value
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Object value = property.getValue();
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (value != Property.UNKNOWN_VALUE) {
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      int index = getValueIndex(value);
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      if (index >= 0) {
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        return getTitle(index);
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      } else {
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        if (value instanceof String) {
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          return (String) value;
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // unknown value
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return null;
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // IValueSourcePropertyEditor
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @Override
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic String getValueSource(Object value) throws Exception {
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // return expression for value
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (value != Property.UNKNOWN_VALUE) {
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      int index = getValueIndex(value);
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      if (index >= 0) {
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        return getExpression(index);
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    // unknown value
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return null;
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  ////////////////////////////////////////////////////////////////////////////
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  //
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  // IClipboardSourceProvider
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  //
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  ////////////////////////////////////////////////////////////////////////////
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  @Override
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//public String getClipboardSource(GenericProperty property) throws Exception {
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    Object value = property.getValue();
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    return getValueSource(value);
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  }
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Combo
84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
86765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @Override
87765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected void addItems(Property property, CCombo3 combo) throws Exception {
88765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    for (int i = 0; i < getCount(); i++) {
89765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      combo.add(getTitle(i));
90765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
91765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
92765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
93765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @Override
94765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected void selectItem(Property property, CCombo3 combo) throws Exception {
95765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    combo.setText(getText(property));
96765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
97765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
98765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @Override
99765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected void toPropertyEx(Property property, CCombo3 combo, int index) throws Exception {
100765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    if (property instanceof GenericProperty) {
101765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      GenericProperty genericProperty = (GenericProperty) property;
102765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      String expression = getExpression(index);
103765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      Object evaluatedExpression = evaluateExpression(genericProperty, expression);
104765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      // apply expression
105765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      genericProperty.setExpression(expression, evaluatedExpression);
106765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    } else {
107765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      toPropertyEx_simpleProperty(property, combo, index);
108765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    }
109765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
110765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
111765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  private static Object evaluateExpression(final GenericProperty genericProperty,
112765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      final String expression) {
113765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    return ExecutionUtils.runObjectIgnore(new RunnableObjectEx<Object>() {
114765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      public Object runObject() throws Exception {
115765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//        JavaInfo javaInfo = genericProperty.getJavaInfo();
116765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//        ClassLoader classLoader = JavaInfoUtils.getClassLoader(javaInfo);
117765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//        return ScriptUtils.evaluate(classLoader, expression);
118765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      }
119765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//    }, Property.UNKNOWN_VALUE);
120765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      System.out.println("HACK 1234");
121765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//      return Property.UNKNOWN_VALUE;
122765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//  }
123765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
124765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
125765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Sets value of simple {@link Property}, not {@link GenericProperty}.
126765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
127765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected void toPropertyEx_simpleProperty(Property property, CCombo3 combo, int index)
128765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      throws Exception {
129765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
130765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
131765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
132765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
133765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Access to list items
134765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
135765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
136765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  abstract protected int getCount();
137765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
138765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  abstract protected int getValueIndex(Object value);
139765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
140765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  abstract protected String getTitle(int index);
141765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
142765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  abstract protected String getExpression(int index) throws Exception;
143765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
144765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
145765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
146765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Utils
147765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
148765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
149765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
150765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Extract string array from parameters.
151765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
152765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected static String[] getParameterAsArray(Map<String, Object> parameters, String name) {
153765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return getParameterAsArray(parameters, name, false);
154765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
155765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
156765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  @SuppressWarnings("unchecked")
157765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  protected static String[] getParameterAsArray(Map<String, Object> parameters,
158765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      String name,
159765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      boolean noAssert) {
160765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    String[] values = null;
161765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    if (parameters.containsKey(name)) {
162765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      List<String> list = (List<String>) parameters.get(name);
163765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      values = list.toArray(new String[list.size()]);
164765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    } else {
165765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      if (noAssert) {
166765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        values = null;
167765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      } else {
168765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Assert.fail(String.format("No parameter %s in %s.", name, parameters));
169765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
170765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
171765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return values;
172765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
173765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}