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.category;
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.Property;
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.model.property.PropertyManager;
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/**
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Factory for {@link PropertyCategoryProvider} instances.
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author scheglov_ke
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @coverage core.model.property
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic final class PropertyCategoryProviders {
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Simple providers
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final PropertyCategoryProvider FROM_PROPERTY = new PropertyCategoryProvider() {
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public PropertyCategory getCategory(Property property) {
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return property.getCategory();
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Returns result of {@link Property#getCategory()}, never <code>null</code>.
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static PropertyCategoryProvider fromProperty() {
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return FROM_PROPERTY;
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final PropertyCategoryProvider FORCED_BY_USER = new PropertyCategoryProvider() {
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    public PropertyCategory getCategory(Property property) {
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      return PropertyManager.getCategoryForced(property);
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    }
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Returns category forced by user, may be <code>null</code>.
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static PropertyCategoryProvider forcedByUser() {
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return FORCED_BY_USER;
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Compound
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Returns first not <code>null</code> category returned by provider.
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static PropertyCategoryProvider combine(final PropertyCategoryProvider... providers) {
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return new PropertyCategoryProvider() {
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public PropertyCategory getCategory(Property property) {
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        for (PropertyCategoryProvider provider : providers) {
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          PropertyCategory category = provider.getCategory(property);
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          if (category != null) {
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            return category;
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          }
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        throw new IllegalStateException("Can not provide category for " + property.getTitle());
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    };
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final PropertyCategoryProvider DEF = combine(forcedByUser(), fromProperty());
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /**
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * Returns the default combination of {@link PropertyCategoryProvider}s - first
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   * {@link #forcedByUser()}, then {@link #fromProperty()}.
81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye   */
82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public static PropertyCategoryProvider def() {
83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return DEF;
84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}
86