1 /*
2 Copyright (C) 2015 Johan Mattsson
3
4 This library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 3 of the
7 License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13 */
14
15 namespace BirdFont {
16
17 public class AlternateSets : GLib.Object {
18
19 public Gee.ArrayList<Alternate> alternates;
20
21 public AlternateSets () {
22 alternates = new Gee.ArrayList<Alternate> ();
23 }
24
25 public Gee.ArrayList<string> get_all_tags () {
26 Gee.ArrayList<string> tags;
27 tags = new Gee.ArrayList<string> ();
28
29 foreach (Alternate a in alternates) {
30 if (tags.index_of (a.tag) == -1) {
31 tags.add (a.tag);
32 }
33 }
34
35 tags.sort ((a, b) => {
36 return strcmp ((string) a, (string) b);
37 });
38
39 return tags;
40 }
41
42 public Gee.ArrayList<Alternate> get_alt (string tag) {
43 Gee.ArrayList<Alternate> alt;
44 alt = new Gee.ArrayList<Alternate> ();
45
46 foreach (Alternate a in alternates) {
47 if (a.tag == tag && a.alternates.size > 0) {
48 alt.add (a);
49 }
50 }
51
52 return alt;
53 }
54
55 public Gee.ArrayList<Alternate> get_alt_with_glyph (string tag, Font font) {
56 Gee.ArrayList<Alternate> alt;
57 alt = new Gee.ArrayList<Alternate> ();
58
59 foreach (Alternate a in alternates) {
60 Alternate available = new Alternate (a.glyph_name, a.tag);
61
62 foreach (string substitution in a.alternates) {
63 if (font.has_glyph (substitution)) {
64 available.alternates.add (substitution);
65 }
66 }
67
68 if (available.tag == tag && available.alternates.size > 0) {
69 if (font.has_glyph (available.glyph_name)) {
70 alt.add (available);
71 }
72 }
73 }
74
75 return alt;
76 }
77
78 public void remove_empty_sets () {
79 int i = 0;
80 foreach (Alternate a in alternates) {
81 if (a.is_empty ()) {
82 alternates.remove_at (i);
83 remove_empty_sets ();
84 return;
85 }
86 i++;
87 }
88 }
89
90 public void add (Alternate alternate) {
91 alternates.add (alternate);
92 }
93
94 public AlternateSets copy () {
95 AlternateSets n = new AlternateSets ();
96 foreach (Alternate a in alternates) {
97 n.alternates.add (a.copy ());
98 }
99 return n;
100 }
101 }
102
103 public class AlternateItem : GLib.Object {
104 public Alternate alternate_list;
105 public string alternate;
106
107 public AlternateItem (Alternate alternate_list, string alternate) {
108 this.alternate_list = alternate_list;
109 this.alternate = alternate;
110 }
111
112 public void delete_item_from_list () {
113 alternate_list.remove_alternate (alternate);
114 }
115 }
116
117 }
118