TangoIcon.java
01 /*
02  * Copyright 2014-2017 the original author or authors.
03  *
04  * Licensed under the Apache License, Version 2.0 (the "License");
05  * you may not use this file except in compliance with the License.
06  * You may obtain a copy of the License at
07  *
08  *     http://www.apache.org/licenses/LICENSE-2.0
09  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package griffon.javafx.support.tangoicons;
17 
18 import griffon.plugins.tangoicons.Tango;
19 import javafx.scene.image.Image;
20 
21 import javax.annotation.Nonnull;
22 import java.net.URL;
23 
24 import static griffon.plugins.tangoicons.Tango.invalidDescription;
25 import static griffon.util.GriffonNameUtils.requireNonBlank;
26 import static java.util.Objects.requireNonNull;
27 
28 /**
29  @author Andres Almiray
30  */
31 public class TangoIcon extends Image {
32     private static final String ERROR_TANGO_NULL = "Argument 'tango' must not be null.";
33     private Tango tango;
34     private int size;
35 
36     public TangoIcon(@Nonnull Tango tango) {
37         this(tango, 16);
38     }
39 
40     public TangoIcon(@Nonnull Tango tango, int size) {
41         super(toURL(tango, size)true);
42         this.tango = requireNonNull(tango, ERROR_TANGO_NULL);
43         this.size = size;
44     }
45 
46     public TangoIcon(@Nonnull String description) {
47         super(toURL(description));
48         tango = Tango.findByDescription(description);
49 
50         String[] parts = description.split(":");
51         if (parts.length == 3) {
52             try {
53                 size = Integer.parseInt(parts[2]);
54             catch (NumberFormatException e) {
55                 throw invalidDescription(description, e);
56             }
57         else {
58             size = 16;
59         }
60     }
61 
62     @Nonnull
63     private static String toURL(@Nonnull Tango tango, int size) {
64         requireNonNull(tango, ERROR_TANGO_NULL);
65         String resource = tango.asResource(size);
66         URL url = Thread.currentThread().getContextClassLoader().getResource(resource);
67         if (url == null) {
68             throw new IllegalArgumentException("Icon " + tango + ":" + size + " does not exist");
69         }
70         return url.toExternalForm();
71     }
72 
73     @Nonnull
74     private static String toURL(@Nonnull String description) {
75         requireNonBlank(description, "Argument 'description' must not be blank");
76         String resource = Tango.asResource(description);
77         URL url = Thread.currentThread().getContextClassLoader().getResource(resource);
78         if (url == null) {
79             throw new IllegalArgumentException("Icon " + description + " does not exist");
80         }
81         return url.toExternalForm();
82     }
83 
84     @Nonnull
85     public Tango getTango() {
86         return tango;
87     }
88 
89     public int getSize() {
90         return size;
91     }
92 }