Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / icontheme / BaseIconTheme.java @ 1845

History | View | Annotate | Download (16.5 KB)

1 802 cordinyana
/**
2
 * gvSIG. Desktop Geographic Information System.
3 699 jjdelcerro
 *
4 802 cordinyana
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6 699 jjdelcerro
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18 802 cordinyana
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20 699 jjdelcerro
 *
21 802 cordinyana
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23 699 jjdelcerro
 */
24
package org.gvsig.tools.swing.impl.icontheme;
25
26
import java.awt.Image;
27
import java.io.File;
28
import java.io.IOException;
29 711 jldominguez
import java.io.InputStream;
30 699 jjdelcerro
import java.net.URL;
31
import java.util.ArrayList;
32
import java.util.Collections;
33
import java.util.HashMap;
34
import java.util.HashSet;
35
import java.util.Iterator;
36
import java.util.List;
37
import java.util.Map;
38
import java.util.Set;
39
40
import javax.swing.ImageIcon;
41
42
import org.apache.commons.io.FileUtils;
43 1580 jjdelcerro
import org.apache.commons.lang3.StringUtils;
44 699 jjdelcerro
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
46
47 711 jldominguez
import org.gvsig.tools.swing.icontheme.IconTheme;
48 699 jjdelcerro
49
/**
50 1845 jjdelcerro
 * <p>
51
 * This class represents an icon theme, which is basically a mapping of symbolic
52
 * icon names, and real icons (or icon paths). This is useful to change an
53
 * application's icons in an easy way. An icon theme is usually read from disk
54
 * on start up, but can also be created or modified on a later time.</p>
55 699 jjdelcerro
 *
56
 */
57
public class BaseIconTheme implements IconTheme {
58
59 1845 jjdelcerro
    protected static Logger logger = LoggerFactory.getLogger(BaseIconTheme.class);
60 699 jjdelcerro
61 1845 jjdelcerro
    protected String id = null;
62
    protected String name = null;
63
    protected String description = null;
64
    protected Map<String, Icon> iconList = null;
65
    protected IconTheme defaultTheme = null;
66
    protected String defaultIconName = null;
67
68
    class DefaultIcon implements Icon {
69
70
        private ImageIcon image;
71
        private final URL resource;
72
        private final String name;
73
        private final String group;
74
        private final String provider;
75
76
        DefaultIcon(String provider, String group, String name, ImageIcon image, URL resource) {
77
            this.image = image;
78
            this.resource = resource;
79
            this.group = group;
80
            this.name = name;
81
            this.provider = provider;
82
        }
83
84
        public boolean existsIcon() {
85
            if (image != null) {
86
                return true;
87
            }
88
89
            InputStream ist = null;
90
            boolean resp;
91
92 711 jldominguez
            try {
93 1845 jjdelcerro
                ist = resource.openStream();
94
                resp = true;
95
            } catch (Exception ex) {
96
                resp = false;
97
            }
98
            try {
99
                if (ist != null) {
100 1580 jjdelcerro
                    ist.close();
101
                }
102 711 jldominguez
            } catch (Exception ex) {
103
            }
104 1845 jjdelcerro
            return resp;
105
        }
106
107 1580 jjdelcerro
        @Override
108 1845 jjdelcerro
        public ImageIcon getImageIcon() {
109
            if (this.image != null) {
110
                return this.image;
111
            }
112
            try {
113
                this.image = new ImageIcon((URL) this.resource);
114
            } catch (Exception ex) {
115
                return null;
116
            }
117
            return this.image;
118
        }
119
120 1580 jjdelcerro
        @Override
121 1845 jjdelcerro
        public Image getImage() {
122
            ImageIcon icon = this.getImageIcon();
123
            if (icon == null) {
124
                return null;
125
            }
126
            return icon.getImage();
127
        }
128
129 1580 jjdelcerro
        @Override
130 1845 jjdelcerro
        public String getName() {
131
            return name;
132
        }
133
134 1580 jjdelcerro
        @Override
135 1845 jjdelcerro
        public String getGroup() {
136
            return group;
137
        }
138
139 1580 jjdelcerro
        @Override
140 1845 jjdelcerro
        public Object getResource() {
141
            return resource;
142
        }
143 699 jjdelcerro
144 1580 jjdelcerro
        @Override
145 1845 jjdelcerro
        public URL getURL() {
146
            if (resource instanceof URL) {
147
                return (URL) this.resource;
148
            }
149
            return null;
150
        }
151 699 jjdelcerro
152 1580 jjdelcerro
        @Override
153 1845 jjdelcerro
        public String getLabel() {
154
            if (resource != null) {
155
                return resource.toString();
156
            }
157
            if (image != null) {
158
                return image.toString();
159
            }
160
            return "";
161
        }
162
163 1580 jjdelcerro
        @Override
164 1845 jjdelcerro
        public int compareTo(Icon other) {
165
            String this_id = this.getProviderName() + "/" + this.getGroup() + "/" + this.getName();
166
            String other_id = other.getProviderName() + "/" + other.getGroup() + "/" + other.getName();
167
            return this_id.compareTo(other_id);
168
        }
169 699 jjdelcerro
170 1580 jjdelcerro
        @Override
171 1845 jjdelcerro
        public String getProviderName() {
172
            return provider;
173
        }
174 699 jjdelcerro
175 1845 jjdelcerro
    }
176
177
    public BaseIconTheme() {
178
        this(null);
179
    }
180
181
    public BaseIconTheme(IconTheme defaultIconTheme) {
182
        this.setDefault(defaultIconTheme);
183
        this.id = "default"; // El id no traducirlo
184
        this.name = "default";
185
        this.description = "Default icon theme";
186
        this.iconList = new HashMap<>();
187
    }
188
189
    /**
190
     * Load the icons of the theme
191
     *
192 1580 jjdelcerro
     * @param resource
193 1845 jjdelcerro
     */
194 1580 jjdelcerro
    @Override
195 1845 jjdelcerro
    public void load(Object resource) {
196
        // Do nothing.
197
    }
198 699 jjdelcerro
199 1845 jjdelcerro
    /**
200
     * Override this to load icons on demand instead of load on the creation of
201
     * the theme.
202
     */
203
    protected void deferredLoad() {
204
        // Do nothing
205
    }
206 699 jjdelcerro
207 1845 jjdelcerro
    private void logstack(String msg) {
208
        try {
209
            throw new IllegalArgumentException();
210
        } catch (IllegalArgumentException e) {
211
            logger.debug(msg, e);
212
        }
213
    }
214
215 1580 jjdelcerro
    @Override
216 1845 jjdelcerro
    public void setDefault(IconTheme def) {
217
        if (def == this) {
218
            defaultTheme = null;
219
        } else {
220
            defaultTheme = def;
221
        }
222 699 jjdelcerro
    }
223
224 1580 jjdelcerro
    @Override
225 1845 jjdelcerro
    public IconTheme getDefault() {
226
        return defaultTheme;
227 699 jjdelcerro
    }
228
229 1580 jjdelcerro
    @Override
230 1845 jjdelcerro
    public boolean exists(String iconName) {
231
        if (StringUtils.isEmpty(iconName)) {
232
            return false;
233
        }
234
        deferredLoad();
235 699 jjdelcerro
236 1845 jjdelcerro
        if (iconList.containsKey(iconName)) {
237
            return true;
238
        }
239
        return defaultTheme != null && defaultTheme.exists(iconName);
240
    }
241
242 1580 jjdelcerro
    @Override
243 1845 jjdelcerro
    public Iterator<String> iterator() {
244
        Set<String> names = new HashSet<>();
245 699 jjdelcerro
246 1845 jjdelcerro
        deferredLoad();
247
248
        if (defaultTheme != null) {
249
            Iterator<String> it = defaultTheme.iterator();
250
            while (it.hasNext()) {
251
                names.add(it.next());
252
            }
253
        }
254
        Iterator<String> it = iconList.keySet().iterator();
255
        while (it.hasNext()) {
256
            names.add(it.next());
257
        }
258
        List<String> names2 = new ArrayList<>(names);
259
        Collections.sort(names2);
260
        return names2.iterator();
261
    }
262
263 1580 jjdelcerro
    @Override
264 1845 jjdelcerro
    public Iterator<Icon> getThemeIcons() {
265
        Map<String, Icon> themeIcons = new HashMap<>();
266
267
        deferredLoad();
268
        if (defaultTheme != null) {
269
            Iterator<Icon> it = defaultTheme.getThemeIcons();
270
            while (it.hasNext()) {
271 1580 jjdelcerro
                Icon icon = it.next();
272
                themeIcons.put(icon.getName(), icon);
273 1845 jjdelcerro
            }
274
        }
275
        Iterator<Icon> it = iconList.values().iterator();
276
        while (it.hasNext()) {
277 1580 jjdelcerro
            Icon icon = it.next();
278
            themeIcons.put(icon.getName(), icon);
279 1845 jjdelcerro
        }
280
        List<Icon> themeIcons2 = new ArrayList<>(themeIcons.values());
281
        Collections.sort(themeIcons2);
282
        return themeIcons2.iterator();
283
    }
284
285 1580 jjdelcerro
    @Override
286 1845 jjdelcerro
    public Icon getThemeIcon(String name) {
287
        if (StringUtils.isEmpty(name)) {
288
            return null;
289
        }
290
        deferredLoad();
291
        Icon themeIcon = (Icon) iconList.get(name);
292
        if (themeIcon != null) {
293
            return themeIcon;
294
        }
295
        if (defaultTheme != null && defaultTheme.exists(name)) {
296
            return defaultTheme.getThemeIcon(name);
297
        }
298
        return null;
299
    }
300 699 jjdelcerro
301 1580 jjdelcerro
    @Override
302 1845 jjdelcerro
    public ImageIcon get(String name) {
303
        ImageIcon icon;
304 699 jjdelcerro
305 1845 jjdelcerro
        if (!StringUtils.isEmpty(name)) {
306
            deferredLoad();
307
            Icon themeIcon = (Icon) iconList.get(name);
308
            if (themeIcon != null) {
309
                icon = themeIcon.getImageIcon();
310
                if (icon != null) {
311
                    return icon;
312
                }
313
            }
314
            if (defaultTheme != null && defaultTheme.exists(name)) {
315
                return defaultTheme.get(name);
316
            }
317
        }
318
        logger.info("get('" + name + "') icon not found");
319
        logstack("get('" + name + "') icon not found");
320
        return getNoIcon();
321
    }
322 699 jjdelcerro
323 1580 jjdelcerro
    @Override
324 1845 jjdelcerro
    public String getName() {
325
        return name;
326
    }
327 699 jjdelcerro
328 1580 jjdelcerro
    @Override
329 1845 jjdelcerro
    public void setName(String themeName) {
330
        name = themeName;
331
    }
332 699 jjdelcerro
333 1580 jjdelcerro
    @Override
334 1845 jjdelcerro
    public String getID() {
335
        return this.id;
336
    }
337
338 1580 jjdelcerro
    @Override
339 1845 jjdelcerro
    public void setID(String id) {
340
        this.id = id;
341
    }
342
343 1580 jjdelcerro
    @Override
344 1845 jjdelcerro
    public String getDescription() {
345
        return description;
346
    }
347 699 jjdelcerro
348 1580 jjdelcerro
    @Override
349 1845 jjdelcerro
    public void setDescription(String description) {
350
        this.description = description;
351
    }
352 699 jjdelcerro
353 1845 jjdelcerro
    /**
354
     * Returns the name of the icon theme
355
     */
356 1580 jjdelcerro
    @Override
357 1845 jjdelcerro
    public String toString() {
358
        String s = this.getName();
359
        if (StringUtils.isEmpty(s)) {
360
            s = this.getID();
361
        }
362
        return s;
363 1679 jjdelcerro
//                if( StringUtils.isEmpty(this.getDescription()) ) {
364
//                        return s;
365
//                }
366
//                return s + " - " + this.getDescription();
367 1845 jjdelcerro
    }
368 699 jjdelcerro
369 1580 jjdelcerro
    @Override
370 1845 jjdelcerro
    public ImageIcon getDefaultIcon() {
371
        ImageIcon imageIcon;
372
        Icon icon;
373 699 jjdelcerro
374 1845 jjdelcerro
        icon = this.getThemeIcon(defaultIconName);
375
        if (icon != null) {
376
            imageIcon = icon.getImageIcon();
377
            if (imageIcon != null) {
378
                return imageIcon;
379
            }
380
        }
381
        icon = this.getThemeIcon(NO_ICON_NAME);
382
        if (icon != null) {
383
            imageIcon = icon.getImageIcon();
384
            if (imageIcon != null) {
385
                return imageIcon;
386
            }
387
        }
388
        return new ImageIcon();
389
    }
390
391 1580 jjdelcerro
    @Override
392 1845 jjdelcerro
    public void setDefaultIcon(ImageIcon icon) {
393
        this.defaultIconName = null;
394
        this.register(null, null, NO_ICON_NAME, icon, null);
395
    }
396 699 jjdelcerro
397 1580 jjdelcerro
    @Override
398 1845 jjdelcerro
    public void setDefaultIcon(URL resource) {
399
        this.defaultIconName = null;
400
        this.register(null, null, NO_ICON_NAME, null, resource);
401
    }
402
403 1580 jjdelcerro
    @Override
404 1845 jjdelcerro
    public void setDefaultIcon(String name) {
405
        this.defaultIconName = name;
406
    }
407 699 jjdelcerro
408 1580 jjdelcerro
    @Override
409 1845 jjdelcerro
    public void register(String provider, String group, String name,
410
            ImageIcon icon, URL resource) {
411
        if (StringUtils.isEmpty(name)) {
412
            throw new IllegalArgumentException("name is empty");
413
        }
414
        deferredLoad();
415
        if (icon == null && resource == null) {
416
            Icon themeIcon = new DefaultIcon(provider, group, name, null, null);
417
            iconList.put(name, themeIcon);
418
            throw new IllegalArgumentException("icon and resource for '" + getIconIdentifier(provider, group, name) + "' are null");
419
        }
420
        DefaultIcon themeIcon = new DefaultIcon(provider, group, name, icon, resource);
421 699 jjdelcerro
422 1845 jjdelcerro
        iconList.put(name, themeIcon);
423
        if (!themeIcon.existsIcon()) {
424
            throw new IllegalArgumentException("Resource not found for icon '" + getIconIdentifier(provider, group, name) + "'");
425
        }
426
    }
427 699 jjdelcerro
428 1845 jjdelcerro
    private String getIconIdentifier(String provider, String group, String name) {
429
        deferredLoad();
430
        String identifier = null;
431
        if (!StringUtils.isEmpty(provider)) {
432
            identifier = provider;
433
        }
434
        if (group != null) {
435
            identifier = identifier + "/" + group;
436
        }
437
        if (name == null) {
438
            identifier = identifier + "/unknow";
439
        } else {
440
            identifier = identifier + "/" + name;
441
        }
442
        return identifier;
443
    }
444
445 1580 jjdelcerro
    @Override
446 1845 jjdelcerro
    public void registerDefault(String provider, String group,
447
            String name, ImageIcon icon, URL resource) {
448
        deferredLoad();
449
        if (defaultTheme != null) {
450
            if (!defaultTheme.exists(name)) {
451
                defaultTheme.register(provider, group, name, icon, resource);
452
            }
453
        } else {
454
            this.register(provider, group, name, icon, resource);
455
        }
456
    }
457 699 jjdelcerro
458 1845 jjdelcerro
    @Override
459
    public void export(File folder) {
460
        if (!folder.exists()) {
461
            folder.mkdir();
462
        }
463
        folder = new File(folder, this.getID());
464
        if (!folder.exists()) {
465
            folder.mkdir();
466
        }
467
        URL url_no_icon = this.getThemeIcon(NO_ICON_NAME).getURL();
468 699 jjdelcerro
469 1845 jjdelcerro
        Iterator<Icon> themeIcons = this.getThemeIcons();
470
        while (themeIcons.hasNext()) {
471
            Icon themeIcon = themeIcons.next();
472
            URL url_src = themeIcon.getURL();
473
            if (url_src == null) {
474
                url_src = url_no_icon;
475
            }
476
            File target;
477
            if (themeIcon.getGroup() != null) {
478
                target = new File(folder, themeIcon.getGroup());
479
                target.mkdir();
480
            } else {
481
                target = new File(folder.getAbsolutePath());
482
            }
483
            target = new File(target, themeIcon.getName() + ".png");
484
            try {
485
                FileUtils.copyURLToFile(url_src, target);
486
            } catch (IOException e) {
487
                // TODO
488
            }
489
        }
490
    }
491
492
    // ===================================================================
493
    /**
494
     * @deprecated use getDefaultIcon
495
     */
496 1580 jjdelcerro
    @Override
497 1845 jjdelcerro
    public ImageIcon getNoIcon() {
498
        return this.getDefaultIcon();
499
    }
500 699 jjdelcerro
501 1845 jjdelcerro
    /**
502 1580 jjdelcerro
     * @param name
503
     * @param image
504 1845 jjdelcerro
     * @deprecated use
505
     * {@link #registerDefault(PluginServices, String, String, ImageIcon, Object)}
506
     */
507 1580 jjdelcerro
    @Override
508 1845 jjdelcerro
    public void registerDefault(String name, ImageIcon image) {
509
        logstack("registerDefault('" + name + "'), deprecated method.");
510
        try {
511
            registerDefault(null, null, name, image, null);
512
        } catch (IllegalArgumentException e) {
513
            logger.info(e.getLocalizedMessage(), e);
514
        }
515
    }
516 699 jjdelcerro
517 1845 jjdelcerro
    /**
518 1580 jjdelcerro
     * @param name
519
     * @param resource
520 1845 jjdelcerro
     * @deprecated use
521
     * {@link #registerDefault(PluginServices, String, String, ImageIcon, Object)}
522
     */
523 1580 jjdelcerro
    @Override
524 1845 jjdelcerro
    public void registerDefault(String name, Object resource) {
525
        logstack("registerDefault('" + name + "'), deprecated method.");
526
        try {
527
            registerDefault(null, null, name, null, (URL) resource);
528
        } catch (IllegalArgumentException e) {
529
            logger.info(e.getLocalizedMessage(), e);
530
        }
531
    }
532 699 jjdelcerro
533 1845 jjdelcerro
    /**
534 1580 jjdelcerro
     * @param name
535
     * @param image
536 1845 jjdelcerro
     * @deprecated use
537
     * {@link #registerDefault(PluginServices, String, String, ImageIcon, Object)}
538
     */
539 1580 jjdelcerro
    @Override
540 1845 jjdelcerro
    public void register(String name, ImageIcon image) {
541
        logstack("register('" + name + "'), deprecated method.");
542
        try {
543
            register(null, null, name, image, null);
544
        } catch (IllegalArgumentException e) {
545
            logger.info(e.getLocalizedMessage(), e);
546
        }
547
    }
548
549
    /**
550 1580 jjdelcerro
     * @param name
551
     * @param resource
552 1845 jjdelcerro
     * @deprecated use
553
     * {@link #registerDefault(PluginServices, String, String, ImageIcon, Object)}
554
     */
555 1580 jjdelcerro
    @Override
556 1845 jjdelcerro
    public void register(String name, Object resource) {
557
        logstack("register('" + name + "'), deprecated method.");
558
        try {
559
            register(null, null, name, null, (URL) resource);
560
        } catch (IllegalArgumentException e) {
561
            logger.info(e.getLocalizedMessage(), e);
562
        }
563
    }
564
565
    /**
566 1580 jjdelcerro
     * @param iconName
567
     * @param loader
568 1845 jjdelcerro
     * @return
569
     * @deprecated use get(String iconName) instead.
570
     */
571 1580 jjdelcerro
    @Override
572 1845 jjdelcerro
    public ImageIcon get(String iconName, ClassLoader loader) {
573
        logstack("get('" + iconName + "', loader), deprecated method.");
574
        return this.get(iconName);
575
    }
576 699 jjdelcerro
577
}