View Javadoc
1   /*
2    * *************************************************************************************************************************************************************
3    *
4    * TheseFoolishThings: Miscellaneous utilities
5    * http://tidalwave.it/projects/thesefoolishthings
6    *
7    * Copyright (C) 2009 - 2024 by Tidalwave s.a.s. (http://tidalwave.it)
8    *
9    * *************************************************************************************************************************************************************
10   *
11   * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
12   * You may obtain a copy of the License at
13   *
14   *     http://www.apache.org/licenses/LICENSE-2.0
15   *
16   * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
17   * CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and limitations under the License.
18   *
19   * *************************************************************************************************************************************************************
20   *
21   * git clone https://bitbucket.org/tidalwave/thesefoolishthings-src
22   * git clone https://github.com/tidalwave-it/thesefoolishthings-src
23   *
24   * *************************************************************************************************************************************************************
25   */
26  package it.tidalwave.role.ui;
27  
28  import javax.annotation.Nonnull;
29  import java.util.Comparator;
30  import java.util.function.Consumer;
31  import java.util.function.Function;
32  import java.util.function.Supplier;
33  import it.tidalwave.util.As;
34  import it.tidalwave.role.ui.impl.AsDisplayableComparator;
35  import it.tidalwave.role.ui.impl.DefaultDisplayable;
36  import it.tidalwave.role.ui.impl.DisplayableComparator;
37  import static it.tidalwave.util.BundleUtilities.getMessage;
38  
39  /***************************************************************************************************************************************************************
40   *
41   * The role of an object which can provide its own display name.
42   *
43   * @stereotype Role
44   *
45   * @author  Fabrizio Giudici
46   * @it.tidalwave.javadoc.stable
47   *
48   **************************************************************************************************************************************************************/
49  @FunctionalInterface
50  public interface Displayable
51    {
52      public static final Class<Displayable> _Displayable_ = Displayable.class;
53  
54      /***********************************************************************************************************************************************************
55       * A default {@code Displayable} with an empty display name.
56       **********************************************************************************************************************************************************/
57      public static final Displayable DEFAULT = new DefaultDisplayable("", "DEFAULT");
58  
59      /***********************************************************************************************************************************************************
60       * Returns the display name in the current {@link java.util.Locale}.
61       *
62       * @return  the display name
63       **********************************************************************************************************************************************************/
64      @Nonnull
65      public String getDisplayName();
66  
67      /***********************************************************************************************************************************************************
68       * Sends the display name in the current {@link java.util.Locale} to a given customer.
69       *
70       * @param     consumer    the {@code Consumer}
71       * @since     3.2-ALPHA-15
72       **********************************************************************************************************************************************************/
73      @SuppressWarnings("BoundedWildcard")
74      public default void display (@Nonnull final Consumer<String> consumer)
75        {
76          consumer.accept(getDisplayName());
77        }
78  
79      /***********************************************************************************************************************************************************
80       * Creates an instance with a given display name.
81       *
82       * @param  displayName    the display name
83       * @return                the new instance
84       * @since                 3.2-ALPHA-1 (was {@code DefaultDisplayable}
85       **********************************************************************************************************************************************************/
86      @Nonnull
87      public static Displayable of (@Nonnull final String displayName)
88        {
89          return of(displayName, "???");
90        }
91  
92      /***********************************************************************************************************************************************************
93       * Creates an instance with a given display name iand an explicit label for  {@code toString()}.
94       *
95       * @param  displayName    the display name
96       * @param  toStringName   the name to be rendered when {@code toString()} is called
97       * @return                the new instance
98       * @since                 3.2-ALPHA-1 (was {@code DefaultDisplayable}
99       **********************************************************************************************************************************************************/
100     @Nonnull
101     public static Displayable of (@Nonnull final String displayName, @Nonnull final String toStringName)
102       {
103         return new DefaultDisplayable(displayName, toStringName);
104       }
105 
106     /***********************************************************************************************************************************************************
107      * Creates an instance from a {@link Supplier}{@code <String>}. The supplier is invoked each time
108      * {@link #getDisplayName()} is called.
109      *
110      * @param   supplier      the {@code Supplier}
111      * @return                the new instance
112      * @since                 3.2-ALPHA-3
113      * @it.tidalwave.javadoc.experimental
114      **********************************************************************************************************************************************************/
115     @Nonnull
116     public static Displayable of (@Nonnull final Supplier<String> supplier)
117       {
118         return supplier::get;
119       }
120 
121     /***********************************************************************************************************************************************************
122      * Creates an instance from a {@link Function}{@code <T, String>} and a generic object that the function is applied
123      * to. The function is invoked each time {@link #getDisplayName()} is called.
124      *
125      * @param   <T>           the type of the object
126      * @param   function      the {@code Function}
127      * @param   object        the object
128      * @return                the new instance
129      * @since                 3.2-ALPHA-3
130      * @it.tidalwave.javadoc.experimental
131      **********************************************************************************************************************************************************/
132     @Nonnull
133     public static <T> Displayable of (@Nonnull final Function<T, String> function, @Nonnull final T object)
134       {
135         return () -> function.apply(object);
136       }
137 
138     /***********************************************************************************************************************************************************
139      * Creates a {@link LocalizedDisplayable} from a resource bundle. The bundle resource file is named
140      * {@code Bundle.properties} and it should be placed in the same package as the owner class.
141      *
142      * @param   ownerClass    the class that owns the bundle
143      * @param   key           the resource key
144      * @return                the new instance
145      * @since                 3.2-ALPHA-1 (was previously in {@code Displayable8}
146      **********************************************************************************************************************************************************/
147     @Nonnull
148     public static LocalizedDisplayable fromBundle (@Nonnull final Class<?> ownerClass, @Nonnull final String key)
149       {
150         return new DefaultDisplayable(getMessage(ownerClass, key));
151       }
152 
153     /***********************************************************************************************************************************************************
154      * Returns a {@link Comparator} for comparing two instances of {@code Displayable}.
155      *
156      * @return  the {@code Comparator}
157      * @since   3.2-ALPHA-6
158      **********************************************************************************************************************************************************/
159     @Nonnull
160     public static Comparator<Displayable> comparing()
161       {
162         return DisplayableComparator.getInstance();
163       }
164 
165     /***********************************************************************************************************************************************************
166      * Returns a {@link Comparator} for comparing two instances of objects implementing {@code As} that contain the
167      * {@code Displayable} role.
168      *
169      * @return  the {@code Comparator}
170      * @since   3.2-ALPHA-6
171      **********************************************************************************************************************************************************/
172     @Nonnull
173     public static Comparator<As> asComparing()
174       {
175         return AsDisplayableComparator.getInstance();
176       }
177   }