~lubuntu-software-center-team/lubuntu-software-center/vala-port

« back to all changes in this revision

Viewing changes to db-build/libmenu.vala

  • Committer: Stephen Smally
  • Date: 2012-07-04 11:46:04 UTC
  • Revision ID: eco.stefi@fastwebnet.it-20120704114604-3esw3fj1oo1j7eed
Implemented Database categories within GUI

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
namespace Menu {
 
3
    class MenuDir : Object {
 
4
                public string id { get; set; }
 
5
        public string name { get; set; }
 
6
        public string summary { get; set; }
 
7
        public string icon { get; set; }
 
8
        public string directory { get; set; }
 
9
        public string[] included;
 
10
        public string[] excluded;
 
11
        public int level;
 
12
        
 
13
        public void complete (KeyFile file) {
 
14
                        summary = "";
 
15
                        icon = "applications-other";
 
16
                        try {
 
17
                                file.load_from_file ("/usr/share/desktop-directories/%s".printf (directory), 0);
 
18
                                name = file.get_string ("Desktop Entry", "Name");
 
19
                                summary = file.get_string ("Desktop Entry", "Comment");
 
20
                                icon = file.get_string ("Desktop Entry", "Icon");
 
21
                                if (summary == null) {
 
22
                                        summary = "";
 
23
                                }
 
24
                                if (icon == null) {
 
25
                                        icon = "";
 
26
                                }
 
27
                        } catch (Error e) {
 
28
                                GLib.debug ("Error retrieving datas for %s: %s\n", directory, e.message);
 
29
                        }
 
30
                }
 
31
        
 
32
        public MenuDir () {
 
33
            included = {};
 
34
            excluded = {};
 
35
        }
 
36
    }
 
37
    
 
38
    class MenuParser {
 
39
        private const MarkupParser parser = {
 
40
            opening_item,// when an element opens
 
41
            closing_item,  // when an element closes
 
42
            get_text, // when text is found
 
43
            null, // when comments are found
 
44
            null  // when errors occur
 
45
        };
 
46
        
 
47
        private string menu_file;
 
48
        private MarkupParseContext context;
 
49
        private MenuDir[] dirlist;
 
50
        private MenuDir[] dirs_level;
 
51
        private MenuDir dir;
 
52
        private int level = 0;
 
53
        private string last_item;
 
54
        private bool include = true;
 
55
        private KeyFile file;
 
56
        
 
57
        public MenuDir[] parse () {
 
58
            string file;
 
59
            FileUtils.get_contents (menu_file, out file, null);
 
60
            context.parse (file, file.length);
 
61
            
 
62
            return dirlist;
 
63
        }
 
64
        
 
65
        public MenuParser (string menu_file) {
 
66
            context = new MarkupParseContext(
 
67
                parser, // the structure with the callbacks
 
68
                0,      // MarkupParseFlags
 
69
                this,   // extra argument for the callbacks, methods in this case
 
70
                null // when the parsing ends
 
71
            );
 
72
            
 
73
            dirlist = {};
 
74
            dirs_level = {};
 
75
            this.menu_file = menu_file;
 
76
            file = new KeyFile();
 
77
        }
 
78
        
 
79
        void opening_item (MarkupParseContext context, string name, string[] attr, string[] vals) throws MarkupError {
 
80
            last_item = name;
 
81
            switch (name) {
 
82
                case "Menu":
 
83
                    MenuDir tmp = new MenuDir();
 
84
                    dirs_level[level] = tmp;
 
85
                    dirlist += tmp;
 
86
                    dirs_level[level].level = level;
 
87
                    level ++;
 
88
                    break;
 
89
                case "Not":
 
90
                    include = false;
 
91
                    break;
 
92
            }
 
93
        }
 
94
        
 
95
        void closing_item (MarkupParseContext context, string name) throws MarkupError {
 
96
            switch (name) {
 
97
                case "Menu":
 
98
                    level --;
 
99
                    dirs_level[level].complete (file);
 
100
                    break;
 
101
                case "Not":
 
102
                    include = true;
 
103
                    break;
 
104
            }
 
105
        }
 
106
        
 
107
        private bool check_whitespaces (string str) {
 
108
            return (str.strip() == "" ? true : false);
 
109
        }
 
110
        
 
111
        void get_text (MarkupParseContext context, string text, size_t text_len) throws MarkupError {
 
112
            if (check_whitespaces (text)) { return; }
 
113
            switch (last_item) {
 
114
                case "Name":
 
115
                    dirs_level[level-1].name = text;
 
116
                    dirs_level[level-1].id = text;
 
117
                    break;
 
118
                case "Directory":
 
119
                    dirs_level[level-1].directory = text;
 
120
                    break;
 
121
                case "Category":
 
122
                    if (include) {
 
123
                        dirs_level[level-1].included += text;
 
124
                    } else {
 
125
                        dirs_level[level-1].excluded += text;
 
126
                    }
 
127
                    break;
 
128
            }
 
129
        }
 
130
    }
 
131
}