TangoIcon.java
001 /*
002  * Copyright 2014-2017 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.swing.support.tangoicons;
017 
018 import griffon.plugins.tangoicons.Tango;
019 
020 import javax.annotation.Nonnull;
021 import javax.swing.ImageIcon;
022 import java.awt.Toolkit;
023 import java.net.URL;
024 
025 import static griffon.plugins.tangoicons.Tango.invalidDescription;
026 import static griffon.plugins.tangoicons.Tango.requireValidSize;
027 import static griffon.util.GriffonNameUtils.requireNonBlank;
028 import static java.util.Objects.requireNonNull;
029 
030 /**
031  @author Andres Almiray
032  */
033 public class TangoIcon extends ImageIcon {
034     private static final String ERROR_TANGO_NULL = "Argument 'tango' must not be null";
035     private Tango tango;
036     private int size;
037 
038     public TangoIcon() {
039         this(Tango.findByDescription("apps:help-browser:16"));
040     }
041 
042     public TangoIcon(@Nonnull Tango tango) {
043         this(tango, 16);
044     }
045 
046     public TangoIcon(@Nonnull Tango tango, int size) {
047         super(toURL(tango, size));
048         this.tango = requireNonNull(tango, ERROR_TANGO_NULL);
049         this.size = size;
050     }
051 
052     public TangoIcon(@Nonnull String description) {
053         this(Tango.findByDescription(description));
054         setTango(description);
055     }
056 
057     @Nonnull
058     private static URL toURL(@Nonnull Tango tango, int size) {
059         requireNonNull(tango, ERROR_TANGO_NULL);
060         String resource = tango.asResource(size);
061         URL url = Thread.currentThread().getContextClassLoader().getResource(resource);
062         if (url == null) {
063             throw new IllegalArgumentException("Icon " + tango + " does not exist");
064         }
065         return url;
066     }
067 
068     @Nonnull
069     public Tango getTango() {
070         return tango;
071     }
072 
073     public void setTango(@Nonnull Tango tango) {
074         this.tango = requireNonNull(tango, ERROR_TANGO_NULL);
075         setImage(Toolkit.getDefaultToolkit().getImage(toURL(tango, size)));
076     }
077 
078     public void setTango(@Nonnull String description) {
079         requireNonBlank(description, "Argument 'description' must not be blank");
080 
081         String[] parts = description.split(":");
082         if (parts.length == 3) {
083             try {
084                 int s = Integer.parseInt(parts[2]);
085                 this.size = requireValidSize(s);
086             catch (NumberFormatException e) {
087                 throw invalidDescription(description, e);
088             }
089         else if (size == 0) {
090             size = 16;
091         }
092 
093         tango = Tango.findByDescription(description);
094         setImage(Toolkit.getDefaultToolkit().getImage(toURL(tango, size)));
095     }
096 
097     public int getSize() {
098         return size;
099     }
100 
101     public void setSize(int size) {
102         this.size = requireValidSize(size);
103         setImage(Toolkit.getDefaultToolkit().getImage(toURL(tango, size)));
104     }
105 }