1 /* cssed (c) Iago Rubio 2003, 2005 - A tiny CSS editor. 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation; either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Library General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 */ 17 18 #ifdef WITH_TERMINAL 19 # include <vte/vte.h> 20 #endif 21 22 /** @file cssedwindow.h 23 * @brief Header file for the cssed main window object. 24 * Those functions are the interface for cssed's ::_CssedWindow object. 25 */ 26 27 /** a macro to cast a pointer to ::CssedWindow */ 28 #define CSSED_WINDOW(n) (CssedWindow*) n 29 30 /** colors used in the output window */ 31 #define ERROR_COLOR_STRING "red" 32 #define WARNING_COLOR_STRING "navy" 33 34 /** registry name for Windows */ 35 #ifdef WIN32 36 # define CSSED_REGISTRY_NAME "cssed-0.4.0" 37 #endif 38 39 /** error domain to be used on GError */ 40 #define CSSED_ERROR_DOMAIN g_quark_from_string ("CSSED_ERROR") 41 42 typedef enum { 43 // those match with GFileError 44 CSSED_FILE_ERROR_EXIST, 45 CSSED_FILE_ERROR_ISDIR, 46 CSSED_FILE_ERROR_ACCES, 47 CSSED_FILE_ERROR_NAMETOOLONG, 48 CSSED_FILE_ERROR_NOENT, 49 CSSED_FILE_ERROR_NOTDIR, 50 CSSED_FILE_ERROR_NXIO, 51 CSSED_FILE_ERROR_NODEV, 52 CSSED_FILE_ERROR_ROFS, 53 CSSED_FILE_ERROR_TXTBSY, 54 CSSED_FILE_ERROR_FAULT, 55 CSSED_FILE_ERROR_LOOP, 56 CSSED_FILE_ERROR_NOSPC, 57 CSSED_FILE_ERROR_NOMEM, 58 CSSED_FILE_ERROR_MFILE, 59 CSSED_FILE_ERROR_NFILE, 60 CSSED_FILE_ERROR_BADF, 61 CSSED_FILE_ERROR_INVAL, 62 CSSED_FILE_ERROR_PIPE, 63 CSSED_FILE_ERROR_AGAIN, 64 CSSED_FILE_ERROR_INTR, 65 CSSED_FILE_ERROR_IO, 66 CSSED_FILE_ERROR_PERM, 67 CSSED_FILE_ERROR_FAILED, 68 // this is not an error code it's just 69 // to know were the GFIleError matching ends 70 CSSED_FILE_ERROR_LAST, 71 // specific cssed error codes 72 CSSED_ERROR_FILE_IS_OPENED, // the file is already opened 73 CSSED_ERROR_FILE_NOT_REGULAR, // the file is not a regular file, may be a device or whatever 74 CSSED_ERROR_DOC_IS_NULL // a NULL document have been passed or returned 75 } CssedError; 76 77 /** @enum CssedEolMode cssed's end of line modes */ 78 typedef enum { 79 /** Windows end of line - Carriage return / Line feed */ 80 EOL_MODE_CRLF, 81 /** Mac end of line - Carriage return */ 82 EOL_MODE_CR, 83 /** Unix end of line - Line feed */ 84 EOL_MODE_LF 85 } CssedEolMode; 86 87 /** @enum CssedCodePage cssed's code pages */ 88 typedef enum { 89 /** Default code page */ 90 CSSED_CODEPAGE_DEFAULT, 91 /** UTF8 code page */ 92 CSSED_CODEPAGE_UTF8, 93 /** DBCS code page (Thai, Hangul) */ 94 CSSED_CODEPAGE_DBCS 95 } CssedCodePage; 96 97 typedef struct _CssedDoc CssedDoc; 98 typedef struct _CssedWindow CssedWindow; 99 100 // configuration will be private in a near future 101 typedef struct _CssedConfig { 102 // window 103 gint window_x; 104 gint window_y; 105 gint window_width; 106 gint window_height; 107 gint footer_pos; 108 gint sidebar_pos; 109 gint css_treeview_pos; 110 gboolean initiall_state_maximized; 111 // browser command 112 gchar* browser_command; 113 // document 114 gboolean linenumbers; 115 gboolean autocompletion; 116 gboolean lineendings; 117 gboolean whitespaces; 118 gboolean folding; 119 gboolean lineswraped; 120 gchar* font; 121 gint font_size; 122 // opened docs 123 GList* opened_docs; 124 // highlighting 125 gint DEFAULT_fore_color; 126 gint DEFAULT_back_color; 127 gboolean DEFAULT_bold; 128 gint TAG_fore_color; 129 gint TAG_back_color; 130 gboolean TAG_bold; 131 gint PSEUDOCLASS_fore_color; 132 gint PSEUDOCLASS_back_color; 133 gboolean PSEUDOCLASS_bold; 134 gint UNKNOWN_PSEUDOCLASS_fore_color; 135 gint UNKNOWN_PSEUDOCLASS_back_color; 136 gboolean UNKNOWN_PSEUDOCLASS_bold; 137 gint OPERATOR_fore_color; 138 gint OPERATOR_back_color; 139 gboolean OPERATOR_bold; 140 gint IDENTIFIER_fore_color; 141 gint IDENTIFIER_back_color; 142 gboolean IDENTIFIER_bold; 143 gint UNKNOWN_IDENTIFIER_fore_color; 144 gint UNKNOWN_IDENTIFIER_back_color; 145 gboolean UNKNOWN_IDENTIFIER_bold; 146 gint VALUE_fore_color; 147 gint VALUE_back_color; 148 gboolean VALUE_bold; 149 gint COMMENT_fore_color; 150 gint COMMENT_back_color; 151 gboolean COMMENT_bold; 152 gint IMPORTANT_fore_color; 153 gint IMPORTANT_back_color; 154 gboolean IMPORTANT_bold; 155 gint DIRECTIVE_fore_color; 156 gint DIRECTIVE_back_color; 157 gboolean DIRECTIVE_bold; 158 gint DOUBLESTRING_fore_color; 159 gint DOUBLESTRING_back_color; 160 gboolean DOUBLESTRING_bold; 161 gint SINGLESTRING_fore_color; 162 gint SINGLESTRING_back_color; 163 gboolean SINGLESTRING_bold; 164 gint CLASS_fore_color; 165 gint CLASS_back_color; 166 gboolean CLASS_bold; 167 gint ID_fore_color; 168 gint ID_back_color; 169 gboolean ID_bold; 170 gint VALID_VALUE_fore_color; 171 gint VALID_VALUE_back_color; 172 gboolean VALID_VALUE_bold; 173 gint FUNCTION_fore_color; 174 gint FUNCTION_back_color; 175 gboolean FUNCTION_bold; 176 gint NUMBER_fore_color; 177 gint NUMBER_back_color; 178 gboolean NUMBER_bold; 179 gint UNIT_fore_color; 180 gint UNIT_back_color; 181 gboolean UNIT_bold; 182 gint COLOR_fore_color; 183 gint COLOR_back_color; 184 gboolean COLOR_bold; 185 gint HEXACOLOR_fore_color; 186 gint HEXACOLOR_back_color; 187 gboolean HEXACOLOR_bold; 188 gint ATTR_MATCH_fore_color; 189 gint ATTR_MATCH_back_color; 190 gboolean ATTR_MATCH_bold; 191 gint LANGUAGE_fore_color; 192 gint LANGUAGE_back_color; 193 gboolean LANGUAGE_bold; 194 } CssedConfig; 195 196 typedef struct _CssedConfigParserData { 197 CssedWindow* window; 198 gint depth; 199 gint state; 200 GList* plugins_list; // store plugins to be loaded from the config file 201 } CssedConfigParserData; 202 203 204 /* ****************************************************************************************** * 205 File typer related structures - testing here 206 * ****************************************************************************************** */ 207 208 #define CSSED_FILETYPE_DEFAULT CSSED_FILETYPE_TEXT 209 210 typedef enum { 211 CSSED_FILETYPE_UNKNOW, // internall use. Never use it. 212 CSSED_FILETYPE_TEXT, // The default file type, plain text 213 CSSED_FILETYPE_BYNARY, // not used ,but will be link insertion 214 CSSED_FILETYPE_CSS, // core language 215 CSSED_FILETYPE_HTML, // this is not just HTML but ASP and PHP 216 CSSED_FILETYPE_PHP, // This is standalon PHP not client side PHP (for sh-like scripts) 217 CSSED_FILETYPE_XML, // XML and SVG 218 CSSED_FILETYPE_SH, // shell and bash scripts 219 CSSED_FILETYPE_C, // not just C but CPP 220 CSSED_FILETYPE_APACHE_CONF, // apache conf files 221 CSSED_FILETYPE_LISP, // mostly for emacs.el files (not ready) 222 CSSED_FILETYPE_PERL, // perl scripts 223 CSSED_FILETYPE_PYTHON, // python 224 CSSED_FILETYPE_SQL, // SQL (Ansi) (not ready) 225 CSSED_FILETYPE_DIFF, // diff and patch files 226 CSSED_FILETYPE_JAVA, // java 227 CSSED_FILETYPE_JS, // javascript 228 CSSED_FILETYPE_MAKE, // Makefiles - I use make for almost everything :) 229 // Those are file types supported by scintilla, so they have it's place here 230 CSSED_FILETYPE_APDL, 231 CSSED_FILETYPE_AU3, 232 CSSED_FILETYPE_AVE, 233 CSSED_FILETYPE_ADA, 234 CSSED_FILETYPE_ASM, 235 CSSED_FILETYPE_ASN1, 236 CSSED_FILETYPE_BAAN, 237 CSSED_FILETYPE_BASIC, 238 CSSED_FILETYPE_BULLANT, 239 CSSED_FILETYPE_CLW, 240 CSSED_FILETYPE_CAML, 241 CSSED_FILETYPE_CRONTAB, 242 CSSED_FILETYPE_ESCRIPT, 243 CSSED_FILETYPE_EIFFEL, 244 CSSED_FILETYPE_ERLANG, 245 CSSED_FILETYPE_FORTH, 246 CSSED_FILETYPE_FORTRAN, 247 CSSED_FILETYPE_GUI4CLI, 248 CSSED_FILETYPE_KIX, 249 CSSED_FILETYPE_LOUT, 250 CSSED_FILETYPE_LUA, 251 CSSED_FILETYPE_MMIXAL, 252 CSSED_FILETYPE_MPT, 253 CSSED_FILETYPE_MSSQL, 254 CSSED_FILETYPE_MATLAB, 255 CSSED_FILETYPE_METAPOST, 256 CSSED_FILETYPE_NSIS, 257 CSSED_FILETYPE_PB, 258 CSSED_FILETYPE_POV, 259 CSSED_FILETYPE_PS, 260 CSSED_FILETYPE_PASCAL, 261 CSSED_FILETYPE_RUBY, 262 CSSED_FILETYPE_SCRIPTOL, 263 CSSED_FILETYPE_SPECMAN, 264 CSSED_FILETYPE_TEX, 265 CSSED_FILETYPE_VB, 266 CSSED_FILETYPE_VHDL, 267 CSSED_FILETYPE_VERILOG, 268 CSSED_FILETYPE_YAML, 269 // if you miss something here, just request for inclusion 270 CSSED_FILETYPE_USR, // user defined file types 271 CSSED_FILETYPE_USR1, 272 CSSED_FILETYPE_USR2, 273 CSSED_FILETYPE_USR3, 274 CSSED_FILETYPE_USR4, 275 CSSED_FILETYPE_USR5, 276 CSSED_FILETYPE_USR6, 277 CSSED_FILETYPE_USR7, 278 CSSED_FILETYPE_USR8, 279 CSSED_FILETYPE_USR9 280 } CssedFileTypeId; 281 282 #define CSSED_NUMFILETYPES (CSSED_FILETYPE_USR9+1) 283 284 typedef struct _CssedFileType { 285 // notifications 286 void (*char_added) (CssedDoc* doc, gchar ch); 287 void (*modify_attemp_read_only) (CssedDoc* doc); 288 void (*double_click) (CssedDoc* doc); 289 void (*user_list_selection) (CssedDoc* doc, gint type, gchar* text); 290 void (*dwell_start) (CssedDoc* doc, gint pos, gint x, gint y); 291 void (*dwell_end) (CssedDoc* doc, gint pos, gint x, gint y); 292 void (*hot_spot_click) (CssedDoc* doc, gint pos, gint modifiers); 293 void (*hot_spot_doubleclick) (CssedDoc* doc, gint pos, gint modifiers); 294 void (*call_tip_click) (CssedDoc* doc, gint position) ;//position =1 if up arrow, 2 if down arrow, and 0 if elsewhere. 295 // those are managed by cssed so things can break if you do something wrong here 296 void (*save_point_reached) (CssedDoc* doc);// - managed by cssed (CssedDoc*) 297 void (*save_point_left) (CssedDoc* doc); //- managed by cssed (CssedDoc*) 298 void (*uri_dropped) (CssedDoc* doc, gchar* uri); //- managed by cssed (CssedDoc*) 299 void (*margin_click) (CssedDoc* doc, gint pos, gint margin); //- managed by cssed (CssedDoc*) 300 void (*modified) (CssedDoc* doc, gint modificationType); //- managed by cssed (CssedDoc*) 301 void (*key_pressed) (CssedDoc* doc, gchar key, gint modifiers);// - managed by cssed 302 // configuraton and styling THOSE ARE NOT IMPLEMENTED YET (FIXME) 303 void (*apply_style) (CssedDoc* doc); //[style, etc ...] 304 GtkWidget* (*get_config_page_widget) (gpointer user_data); 305 void (*save_configuration_from_widget) (GtkWidget* widget, gpointer user_data); 306 void (*clean_popmenu) (CssedWindow* win);// attach should be not NULL to call this 307 void (*clean_menu) (CssedWindow* win); 308 void (*load_ui) (CssedWindow* win); 309 GtkWidget* menu_item; // (top level to the menu bar) 310 GtkWidget* pop_menu; 311 // file related issues, those are mostly to avoid to open or save files 312 gboolean (*open_file) (gchar *filename) ;// If not NULL, cssed will call it and call document_open only if it returns TRUE 313 gboolean (*save_doc) (CssedDoc* doc); // If not NULL, cssed will call it and call document_save only if it returns TRUE 314 // properties 315 guint id; // one of the CssedFileTypeId enum values 316 gint style_min ;//(document_set_font_size) (document_set_font_by_name) (Read/Write const only) 317 gint style_max; //(document_set_font_size) (document_set_font_by_name)(Read/Write const only) 318 gboolean can_fold ;//(Read/Write const only) 319 gchar* label_language; // a name for the menu as CSS or XML 320 gchar* lable_file; // a name for the file type as CSS-2 CSS-SVG or Dockbook 321 GSList* patterns; // patterns as "*.css" "Make*" as so on 322 } CssedFileType; 323 324 typedef struct _CssedFileTypeManager { 325 CssedFileType* filetype[CSSED_NUMFILETYPES]; 326 GHashTable *patterns_hash_table; 327 }CssedFileTypeManager ; 328 329 330 /* ****************************************************************************************** */ 331 /* window functions*/ 332 CssedWindow* cssed_window_new(void); 333 void cssed_window_quit (CssedWindow* window); 334 void cssed_window_destroy (CssedWindow* window); 335 gint cssed_window_get_width (CssedWindow* window); 336 gint cssed_window_get_height (CssedWindow* window); 337 GtkWidget* cssed_window_get_window_widget (CssedWindow* window); 338 void cssed_window_set_window_widget (CssedWindow* window, GtkWidget* widget); 339 GtkWidget* cssed_window_get_document_notebook (CssedWindow* window); 340 void cssed_window_set_document_notebook (CssedWindow* window, GtkWidget* widget); 341 GtkWidget* cssed_window_get_footer_notebook (CssedWindow* window); 342 void cssed_window_set_footer_notebook (CssedWindow* window, GtkWidget* widget); 343 GtkWidget* cssed_window_get_sidebar_notebook (CssedWindow* window); 344 void cssed_window_set_sidebar_notebook (CssedWindow* window, GtkWidget* widget); 345 GtkWidget* cssed_window_get_css_definition_treeview (CssedWindow* window); 346 void cssed_window_set_css_definition_treeview (CssedWindow* window, GtkWidget* widget); 347 GtkWidget* cssed_window_get_selector_scanner_treeview (CssedWindow* window); 348 void cssed_window_set_selector_scanner_treeview (CssedWindow* window, GtkWidget* widget); 349 GtkWidget* cssed_window_get_output_treeview (CssedWindow* window); 350 void cssed_window_set_output_treeview (CssedWindow* window, GtkWidget* widget); 351 GtkWidget* cssed_window_get_digest_treeview (CssedWindow* window); 352 void cssed_window_set_digest_treeview (CssedWindow* window, GtkWidget* widget); 353 GtkWidget* cssed_window_get_pop_menu (CssedWindow* window); 354 void cssed_window_set_pop_menu (CssedWindow* window, GtkWidget* widget); 355 GtkTextBuffer* cssed_window_get_scratch_buffer (CssedWindow* window); 356 void cssed_window_set_scratch_buffer (CssedWindow* window, GtkTextBuffer* widget); 357 // filetypes_menu 358 GtkWidget* cssed_window_get_filetypes_menu (CssedWindow* window); 359 void cssed_window_set_filetypes_menu (CssedWindow* window, GtkWidget* widget); 360 // 361 void cssed_window_dynamic_menus_set_full (CssedWindow* window, 362 GtkWidget *menu_item_line_numbers, 363 GtkWidget *menu_item_endings, 364 GtkWidget *menu_item_white_spaces, 365 GtkWidget *menu_item_lines_wrapped, 366 GtkWidget *menu_item_eol_mode_cr, 367 GtkWidget *menu_item_eol_mode_lf, 368 GtkWidget *menu_item_eol_mode_crlf, 369 GtkWidget *menu_item_autocompletion, 370 GtkWidget *menu_item_folding); 371 372 void cssed_window_dynamic_menus_set_state(CssedWindow* window, 373 gboolean line_numbers_enabled, 374 gboolean line_endings_enabled, 375 gboolean white_spaces_enabled, 376 gboolean lines_wrapped_enabled, 377 gboolean autocompletion_enabled, 378 gboolean folding_enabled); 379 380 void cssed_window_dynamic_menus_set_eols_state (CssedWindow* window, 381 CssedEolMode eols); 382 // 383 void cssed_window_dynamic_widgets_set( CssedWindow* window, 384 GtkWidget* save_button, 385 GtkWidget* save_main_menu, 386 GtkWidget* undo_button, 387 GtkWidget* undo_main_menu, 388 GtkWidget* undo_pop_menu, 389 GtkWidget* redo_button, 390 GtkWidget* redo_main_menu, 391 GtkWidget* redo_pop_menu); 392 // 393 void 394 cssed_window_panes_set( CssedWindow* window, 395 GtkWidget* vpaned_main, 396 GtkWidget* hpaned_up, 397 GtkWidget* vpaned_sidebar); 398 399 void 400 cssed_window_ensure_output_visible (CssedWindow* window); 401 402 void 403 cssed_window_ensure_selector_scanner_visible (CssedWindow* window); 404 405 void cssed_window_set_last_open_dir (CssedWindow* window, gchar* dirname); 406 gchar* cssed_window_get_last_open_dir (CssedWindow* window); 407 void cssed_window_set_last_save_dir (CssedWindow* window, gchar* dirname); 408 gchar* cssed_window_get_last_save_dir (CssedWindow* window); 409 410 //void cssed_window_set_last_scan_file (CssedWindow* window, gchar* filename); 411 //gchar* cssed_window_get_last_scan_file (CssedWindow* window); 412 void cssed_window_output_write (CssedWindow* window, gchar* format, ...); 413 void cssed_window_output_clear (CssedWindow* window); 414 415 void cssed_window_digest_write (CssedWindow* window, gchar* first_col, gchar* second_col); 416 void cssed_window_digest_clear (CssedWindow* window); 417 418 void cssed_window_selector_scanner_write (CssedWindow* window, gchar* first_col, gchar* second_col); 419 void cssed_window_selector_scanner_clear (CssedWindow* window); 420 void cssed_window_selector_scanner_edited (CssedWindow* window, 421 gchar *path_string, 422 gchar *new_text ); 423 424 // config 425 CssedConfig* cssed_window_get_config (CssedWindow* window); 426 CssedConfig* cssed_window_config_new (); 427 428 // widgets 429 void cssed_window_enable_save (CssedWindow* window); 430 void cssed_window_disable_save (CssedWindow* window); 431 void cssed_window_enable_undo (CssedWindow* window); 432 void cssed_window_disable_undo (CssedWindow* window); 433 void cssed_window_enable_redo (CssedWindow* window); 434 void cssed_window_disable_redo (CssedWindow* window); 435 436 // config 437 void cssed_window_show_preferences_dialog (CssedWindow* window); 438 439 // document list 440 void cssed_window_add_document_to_list (CssedWindow* window, CssedDoc* doc); 441 void cssed_window_delete_document_from_list (CssedWindow* window, CssedDoc* doc); 442 gint cssed_window_get_document_list_length (CssedWindow* window); 443 GList* cssed_window_get_document_list_first (CssedWindow* window); 444 gint cssed_window_get_document_list_index (CssedWindow* window, CssedDoc* doc); 445 gboolean cssed_window_set_document_list_index (CssedWindow* window, CssedDoc* doc, gint index); 446 447 // plugins list 448 void cssed_window_add_plugin_to_list (CssedWindow* window, gpointer plugin); 449 void cssed_window_delete_plugin_from_list (CssedWindow* window, gpointer plugin); 450 gint cssed_window_get_plugin_list_length (CssedWindow* window); 451 GList* cssed_window_get_plugin_list_first (CssedWindow* window); 452 453 // keyword list 454 gchar* cssed_window_get_keyword_list (CssedWindow* window); 455 void cssed_window_set_keyword_list (CssedWindow* window, gchar* keywords); 456 void cssed_window_free_keyword_list (CssedWindow* window); 457 458 void cssed_window_css_dialog_insert (CssedWindow* window, gchar* key, gpointer class); 459 void cssed_window_css_dialog_remove_by_keyword (CssedWindow* window, gchar* key); 460 gpointer cssed_window_css_dialog_lookup_by_keyword (CssedWindow* window, gchar* key); 461 gboolean cssed_window_css_dialog_keyword_in_use (CssedWindow* window, gchar* key); 462 gboolean cssed_window_is_file_opened (CssedWindow* window, gchar* file); 463 gint cssed_window_get_num_docs (CssedWindow* window); 464 void cssed_window_set_ndoc_active (CssedWindow* window, gint doc_number); 465 466 // file type manager 467 void cssed_window_set_filetype_manager (CssedWindow* window, CssedFileTypeManager* manager); 468 CssedFileTypeManager* cssed_window_get_filetype_manager (CssedWindow* window); 469 void cssed_window_add_filetype (CssedWindow* window, CssedFileType* filetype, gboolean free_previous); 470 471 // window size and paned gutter position values are now being messed by plugins 472 // loaded that vary the configuration stored positions are the former are set 473 // before to load plugins, so plugin sizes changes the configuration positions 474 // This functions are just to re-set the stored values. 475 void cssed_window_apply_stored_size_and_position( CssedWindow* window ); 476 void cssed_window_apply_stored_paned_positions( CssedWindow* window ); 477 478 479 // to show help and such in a browser window 480 void cssed_window_show_in_default_browser ( CssedWindow* window, gchar* uri); 481