1 /* 2 * ************************************************************************************************************************************************************* 3 * 4 * TheseFoolishThings: Miscellaneous utilities 5 * http://tidalwave.it/projects/thesefoolishthings 6 * 7 * Copyright (C) 2009 - 2025 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.util.ui; 27 28 import javax.annotation.Nonnull; 29 import javax.annotation.concurrent.Immutable; 30 import it.tidalwave.util.Callback; 31 import lombok.AccessLevel; 32 import lombok.AllArgsConstructor; 33 import lombok.Getter; 34 import lombok.SneakyThrows; 35 import lombok.ToString; 36 import lombok.With; 37 import static it.tidalwave.util.BundleUtilities.getMessage; 38 39 /*************************************************************************************************************************************************************** 40 * 41 * This class models a user notification where a feedback is expected (confirmation or cancellation). 42 * 43 * @author Fabrizio Giudici 44 * 45 **************************************************************************************************************************************************************/ 46 @Getter @Immutable 47 @ToString(callSuper = true) 48 public class UserNotificationWithFeedback extends UserNotification 49 { 50 /*********************************************************************************************************************************************************** 51 * This class provides a few callback methods to notify a choice from the user. 52 **********************************************************************************************************************************************************/ 53 @AllArgsConstructor(access = AccessLevel.PRIVATE) 54 public static class Feedback 55 { 56 @With 57 private final Callback onConfirm; 58 59 @With 60 private final Callback onCancel; 61 62 /*************************************************************************************************************** 63 * 64 * Checks whether the current instance has a callback for confirmation. 65 * 66 * @return {@code true} if the instance has the callback 67 * @since 3.2-ALPHA-1 68 * 69 **************************************************************************************************************/ 70 public boolean canConfirm() 71 { 72 return onConfirm != Callback.EMPTY; 73 } 74 75 /*************************************************************************************************************** 76 * 77 * Checks whether the current instance has a callback for cancellation. 78 * 79 * @return {@code true} if the instance has the callback 80 * @since 3.2-ALPHA-1 81 * 82 **************************************************************************************************************/ 83 public boolean canCancel() 84 { 85 return onCancel != Callback.EMPTY; 86 } 87 88 /*************************************************************************************************************** 89 * 90 * Callback method invoked when the user confirms an operation. 91 * 92 * @throws Exception in cases of error 93 * 94 **************************************************************************************************************/ 95 @SuppressWarnings("RedundantThrows") 96 @SneakyThrows(Throwable.class) 97 private void onConfirm() 98 throws Exception 99 { 100 onConfirm.call(); 101 } 102 103 /*************************************************************************************************************** 104 * 105 * Callback method invoked when the user cancels an operation. 106 * 107 * @throws Exception in cases of error 108 * 109 **************************************************************************************************************/ 110 @SuppressWarnings("RedundantThrows") 111 @SneakyThrows(Throwable.class) 112 private void onCancel() 113 throws Exception 114 { 115 onCancel.call(); 116 } 117 } 118 119 protected final Feedback feedback; 120 121 /*********************************************************************************************************************************************************** 122 * @param text the notification text 123 * @param caption the notification caption 124 * @param feedback the feedback 125 **********************************************************************************************************************************************************/ 126 protected UserNotificationWithFeedback (@Nonnull final String text, 127 @Nonnull final String caption, 128 @Nonnull final Feedback feedback) 129 { 130 super(text, caption); 131 this.feedback = feedback; 132 } 133 134 /*********************************************************************************************************************************************************** 135 * Creates a notification with empty caption and text. 136 * 137 * @return the notification 138 **********************************************************************************************************************************************************/ 139 @Nonnull 140 public static UserNotificationWithFeedback notificationWithFeedback() 141 { 142 return new UserNotificationWithFeedback("", "", feedback()); 143 } 144 145 /*********************************************************************************************************************************************************** 146 * Associates a caption to the notification. 147 * 148 * @param caption the caption 149 * @return the notification 150 **********************************************************************************************************************************************************/ 151 @Override @Nonnull 152 public UserNotificationWithFeedback withCaption (@Nonnull final String caption) 153 { 154 return new UserNotificationWithFeedback(text, caption, feedback); 155 } 156 157 /*********************************************************************************************************************************************************** 158 * Associates a caption to the notification, retrieved from a resource bundle. 159 * 160 * @param bundleClass the class where to search the resource bundle from 161 * @param resourceName the resource name of the caption in the bundle 162 * @param params some (optional) parameters to the resource 163 * @return the notification 164 **********************************************************************************************************************************************************/ 165 @Override @Nonnull 166 public UserNotificationWithFeedback withCaption (@Nonnull final Class<?> bundleClass, 167 @Nonnull final String resourceName, 168 @Nonnull final Object ... params) 169 { 170 return new UserNotificationWithFeedback(text, getMessage(bundleClass, resourceName, params), feedback); 171 } 172 173 /*********************************************************************************************************************************************************** 174 * Associates a text to the notification. 175 * 176 * @param text the text 177 * @return the notification 178 **********************************************************************************************************************************************************/ 179 @Override @Nonnull 180 public UserNotificationWithFeedback withText (@Nonnull final String text) 181 { 182 return new UserNotificationWithFeedback(text, caption, feedback); 183 } 184 185 /*********************************************************************************************************************************************************** 186 * Associates a text to the notification, retrieved from a resource bundle. 187 * 188 * @param bundleClass the class where to search the resource bundle from 189 * @param resourceName the resource name of the text in the bundle 190 * @param params some (optional) parameters to the resource 191 * @return the notification 192 **********************************************************************************************************************************************************/ 193 @Override @Nonnull 194 public UserNotificationWithFeedback withText (@Nonnull final Class<?> bundleClass, 195 @Nonnull final String resourceName, 196 @Nonnull final Object ... params) 197 { 198 return new UserNotificationWithFeedback(getMessage(bundleClass, resourceName, params), caption, feedback); 199 } 200 201 /*********************************************************************************************************************************************************** 202 * Associates a {@link Feedback} to the notification. 203 * 204 * @param feedback the {@code Feedback} to associate 205 * @return the notification 206 **********************************************************************************************************************************************************/ 207 @Nonnull 208 public UserNotificationWithFeedback withFeedback (@Nonnull final Feedback feedback) 209 { 210 return new UserNotificationWithFeedback(text, caption, feedback); 211 } 212 213 /*********************************************************************************************************************************************************** 214 * Notifies a confirmation to the user notification. 215 * 216 * @throws Exception in cases of error 217 **********************************************************************************************************************************************************/ 218 public void confirm() 219 throws Exception 220 { 221 feedback.onConfirm(); 222 } 223 224 /*********************************************************************************************************************************************************** 225 * Notifies a cancellation to the user notification. 226 * 227 * @throws Exception in cases of error 228 **********************************************************************************************************************************************************/ 229 public void cancel() 230 throws Exception 231 { 232 feedback.onCancel(); 233 } 234 235 /*********************************************************************************************************************************************************** 236 * Creates a new {@code Feedback} that does nothing. This method should be chained with {@code withOnConfirm()} 237 * and/or {@code withOnCancel(Callback)} to specify the relative callbacks. 238 * 239 * <pre> 240 * feedback().withOnConfirm(this::doSomething).withOnCancel(this::doSomethingElse); 241 * </pre> 242 * 243 * @return a feedback that does nothing in any case 244 * @since 3.2-ALPHA-1 (was previously on {@code Feedback8} 245 **********************************************************************************************************************************************************/ 246 @Nonnull 247 public static Feedback feedback() 248 { 249 return new Feedback(Callback.EMPTY, Callback.EMPTY); 250 } 251 }