1 ;;; edje-mode-el -- Major mode for editing Edje files
3 ;; Author: Gustavo Sverzut Barbieri <barbieri@gmail.com>
5 ;; Keywords: Edje major-mode
6 ;; Url: http://barbieri-playground.googlecode.com/svn/dot-files/edje-mode.el
7 ;; (if you find this file have problems, check that Url and request update)
9 ;; Copyright (C) 2007 Gustavo Sverzut Barbieri <barbieri@gmail.com>
11 ;; This program is free software; you can redistribute it and/or
12 ;; modify it under the terms of the GNU General Public License as
13 ;; published by the Free Software Foundation; either version 2 of
14 ;; the License, or (at your option) any later version.
16 ;; This program is distributed in the hope that it will be
17 ;; useful, but WITHOUT ANY WARRANTY; without even the implied
18 ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
19 ;; PURPOSE. See the GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public
22 ;; License along with this program; if not, write to the Free
23 ;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28 ;; This mode is based on tutorial from Scott Andrew Borton:
29 ;; http://two-wugs.net/emacs/mode-tutorial.html
32 (defvar edje-mode-hook nil)
34 (defun number-or-nil-to-string (v &optional default)
35 (cond ((numberp v) (number-to-string v))
36 ((stringp v) (if (string= v "") (number-to-string default) v))
37 (t (number-to-string default))))
39 (defun non-empty-string (s)
40 (and (not (eq 'nil s))
41 (not (string= "" s))))
43 (defun edje-new-program-action-signal-emit (source emission)
44 "Insert new program SIGNAL_EMIT"
45 (interactive "ssource: \nsemission: ")
48 " action: SIGNAL_EMIT \"" source "\" \"" emission "\";\n"
51 (defun edje-new-program-action-state-set (state value target)
52 "Insert new program STATE_SET"
53 (interactive "sstate: \nsvalue (0.0): \nstarget: ")
56 " action: STATE_SET \"" state "\" "
57 (number-or-nil-to-string value 0.0) ";\n"
58 " target: \"" target "\";\n"
61 (defun edje-new-program-action (action)
62 "Insert new program action"
63 (interactive "saction: ")
64 (setq action (upcase action))
65 (cond ((string= action "STATE_SET")
66 (edje-new-program-action-state-set "" 0.0 ""))
67 ((string= action "SIGNAL_EMIT")
68 (edje-new-program-action-signal-emit "" ""))
71 (defun edje-new-program (name signal source action)
72 "Insert new program block"
73 (interactive "sname: \nssignal: \nssource: \nsaction: ")
78 " name: \"" name "\";\n"
80 (if (non-empty-string signal)
81 (concat " signal: \"" signal "\";\n"))
83 (if (non-empty-string source)
84 (concat " source: \"" source "\";\n"))
87 (edje-new-program-action action)
95 (defun edje-new-desc-relative (x y &optional defx defy)
96 "Insert new part description 'relative' line"
97 (interactive "sx: \nsy: ")
101 (number-or-nil-to-string x defx) " "
102 (number-or-nil-to-string y defy) ";\n"
105 (defun edje-new-desc-offset (x y &optional defx defy)
106 "Insert new part description 'offset' line"
107 (interactive "sx: \nsy: ")
111 (number-or-nil-to-string x defx) " "
112 (number-or-nil-to-string y defy) ";\n"
115 (defun edje-new-desc-inherit (name val)
116 "Insert new part description 'inherit' line"
117 (interactive "sname: \nsvalue: ")
120 " inherit: \"" name "\" "
121 (number-or-nil-to-string val 0.0) ";\n"
124 (defun edje-new-desc-text (font size text)
125 "Insert new part description 'text' block"
126 (interactive "sfont: \nssize: \nstext: ")
130 " font: \"" font "\";\n"
131 " size: " (number-or-nil-to-string size) ";\n"
132 " text: \"" text "\";\n"
136 (defun edje-new-desc-image (name)
137 "Insert new part description 'image' block"
138 (interactive "sname: ")
142 " normal: \"" name "\";\n"
146 (defun edje-new-desc-color (r g b a &optional defr defg defb defa)
147 "Insert new part description 'color' line"
148 (interactive "sred: \nsgreen: \nsblue: \nsalpha: ")
152 (number-or-nil-to-string r defr) " "
153 (number-or-nil-to-string g defg) " "
154 (number-or-nil-to-string b defb) " "
155 (number-or-nil-to-string a defa) ";\n"
158 (defun edje-new-desc (name val &optional
164 "Insert new part description block"
165 (interactive "sName: \nsValue: ")
169 " state: \"" name "\" " (number-or-nil-to-string val 0.0) ";\n"))
170 (if (string= part_type "RECT") (edje-new-desc-color 255 255 255 255))
172 (edje-new-desc-relative r1_rx r1_ry 0.0 0.0)
173 (edje-new-desc-offset r1_ox r1_oy 0 0)
179 (edje-new-desc-relative r2_rx r2_ry 1.0 1.0)
180 (edje-new-desc-offset r2_ox r2_oy -1 -1)
182 (cond ((string= part_type "IMAGE") (edje-new-desc-image ""))
183 ((string= part_type "TEXT") (edje-new-desc-text "" 10 "contents"))
188 (defun edje-new-part (name type &optional
194 (interactive "sName: \nsType: ")
195 (setq type (upcase type))
200 " name: \"" name "\";\n"
202 " mouse_events: 0;\n"
204 (edje-new-desc "default" 0.0 r1_rx r1_ry r2_rx r2_ry r1_ox r1_oy r2_ox r2_oy type)
210 (defun edje-setup-compile ()
211 (set (make-local-variable 'compile-command)
212 (concat "edje_cc " (buffer-file-name))
216 "Runs edje_cc with current buffer."
218 (compile (edje-setup-compile)))
220 (defvar edje-mode-map
221 (let ((edje-mode-map (make-sparse-keymap)))
222 (define-key edje-mode-map "\C-j" 'newline-and-indent)
223 (define-key edje-mode-map "\C-cp" 'edje-new-part)
224 (define-key edje-mode-map "\C-cd" 'edje-new-desc)
225 (define-key edje-mode-map "\C-cr" 'edje-new-desc-relative)
226 (define-key edje-mode-map "\C-co" 'edje-new-desc-offset)
227 (define-key edje-mode-map "\C-ch" 'edje-new-desc-inherit)
228 (define-key edje-mode-map "\C-cc" 'edje-new-desc-color)
229 (define-key edje-mode-map "\C-ci" 'edje-new-desc-image)
230 (define-key edje-mode-map "\C-ct" 'edje-new-desc-text)
231 (define-key edje-mode-map "\C-cg" 'edje-new-program)
232 (define-key edje-mode-map "\C-ca" 'edje-new-program-action)
233 (define-key edje-mode-map "\C-cs" 'edje-new-program-action-state-set)
234 (define-key edje-mode-map "\C-ce" 'edje-new-program-action-signal-emit)
236 "Keymap for Edje major mode")
238 (add-hook 'c-mode-hook 'edje-setup-compile)
239 (add-to-list 'auto-mode-alist '("\\.edc$" . edje-mode))
241 (defconst edje-font-lock-keywords-1
244 (list (concat "[ \t]*\\<"
268 ) t) "\\>\\([ \t]*{\\|\\.\\)")
269 '(1 font-lock-function-name-face))
274 (defconst edje-font-lock-keywords-2
276 (append edje-font-lock-keywords-1
279 (concat "^\\([ \t]*\\|[ \t]*[a-z]+\\.\\|\\)\\<"
357 "use_alternate_font_metrics"
361 ) t) "\\>[ \t]*[:,]")
362 '(2 font-lock-keyword-face))
366 (defconst edje-font-lock-keywords-3
368 (append edje-font-lock-keywords-2
373 '(; image options (st_images_image)
378 ; part types (st_collections_group_parts_part_type)
387 ; ignore flags (st_collections_group_parts_part_ignore_flags)
390 ; pointer mode (st_collections_group_parts_part_pointer_mode)
393 ; aspect (st_collections_group_parts_part_description_aspect_preference)
398 ; text effect (st_collections_group_parts_part_effect)
406 "OUTLINE_SOFT_SHADOW"
410 ; image fill (st_collections_group_parts_part_description_fill_type)
413 ; program action (st_collections_group_programs_program_action)
421 ; program transition (st_collections_group_programs_program_transition)
427 '(1 font-lock-builtin-face))
431 (defconst edje-font-lock-keywords-4
433 (append edje-font-lock-keywords-3
445 "undef") t) "[ \t]*")
446 '(1 font-lock-builtin-face))
450 (defconst edje-font-lock-keywords-5
452 (append edje-font-lock-keywords-4
454 (list "[ \t]*#undef[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)"
455 '(1 font-lock-variable-name-face))
456 (list "[ \t]*#define[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)("
457 '(1 font-lock-function-name-face))
458 (list "[ \t]*#define[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)"
459 '(1 font-lock-variable-name-face))
461 "CPP directives that define constants")
464 (defvar edje-font-lock-keywords edje-font-lock-keywords-5)
466 (defvar edje-mode-syntax-table
467 (let ((edje-mode-syntax-table (make-syntax-table)))
468 ; This is added so entity names with underscores can be more easily parsed
469 (modify-syntax-entry ?_ "w" edje-mode-syntax-table)
470 (modify-syntax-entry ?/ ". 124b" edje-mode-syntax-table)
471 (modify-syntax-entry ?* ". 23" edje-mode-syntax-table)
472 (modify-syntax-entry ?\n "> b" edje-mode-syntax-table)
474 edje-mode-syntax-table)
475 "Syntax table for edje-mode")
480 (indent-tabs-mode . nil)
483 (c-backslash-column . 72)
484 (c-hanging-braces-alist .
486 (brace-list-open after)
487 (substatement-open after))
490 ((statement-block-intro . +)
492 (substatement-open . 0)
493 (defun-block-intro . +)
499 (define-derived-mode edje-mode c-mode "Edje"
500 "Major mode for editing Edje files"
502 (use-local-map edje-mode-map)
503 (set-syntax-table edje-mode-syntax-table)
504 (set (make-local-variable 'font-lock-defaults) '(edje-font-lock-keywords))
505 (set (make-local-variable 'require-final-newline) t)
507 (run-hooks 'edje-mode-hook)
512 ;;; edje-mode.el ends here