[PATCH] Choose syntax



Hi,

Another approach to overriding the automatic syntax type detection.
Using a WList instead of a dialog with a quick_input. Patch is against
MC_4_6_1_PRE.

A few comments on the code:
- The syntax list is refilled on every invokation of the dialog. Another
approach would be to save the list of syntaxes to a file and only update
it when either the Syntax file is updated (either by testing the date or
by explicit user command).

- The syntax list is currently of static length (I hope 1024 entries
will suffice ;) ). Creating and growing it dynamically as the list gets
build would be nicer but I couldn't get that to work yet.

Leonard.

-- 
mount -t life -o ro /dev/dna /genetic/research

diff -pruN MC_4_6_1_PRE/mc/edit/choosesyntax.c MC_4_6_1_PRE.syntax.input/mc/edit/choosesyntax.c
--- MC_4_6_1_PRE/mc/edit/choosesyntax.c	1970-01-01 01:00:00.000000000 +0100
+++ MC_4_6_1_PRE.syntax.input/mc/edit/choosesyntax.c	2005-07-10 12:11:11.000000000 +0200
@@ -0,0 +1,86 @@
+/* User interface for syntax selection.
+
+   Copyright (C) 2005 Leonard den Ottolander <leonard den ottolander nl>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include "edit.h"
+#include "syntax.h"
+#include "../src/wtools.h"
+
+#define MAX_ENTRY_LEN 40
+#define LIST_LINES 14
+#define N_DFLT_ENTRIES 1
+
+int
+exec_syntax_dialog (const char **names) {
+    int i;
+
+    Listbox *syntaxlist = create_listbox_window (MAX_ENTRY_LEN, LIST_LINES,
+	N_(" Choose syntax highlighting "), NULL);
+    LISTBOX_APPEND_TEXT (syntaxlist, 'A', N_("< Auto >"), NULL);
+
+    for (i = 0; names[i]; i++) {
+	LISTBOX_APPEND_TEXT (syntaxlist, 0, names[i], NULL);
+	if (! option_auto_syntax && option_syntax_type &&
+	    ! strcmp (names[i], option_syntax_type))
+    	    listbox_select_by_number (syntaxlist->list, i + N_DFLT_ENTRIES);
+    }
+
+    return run_listbox (syntaxlist);
+}
+
+void
+syntax_dialog () {
+    char *old_syntax_type;
+    int old_auto_syntax, syntax;
+    char *names[MAX_SYNTAX_FILES + 1];
+
+    /* We fill the list of syntax files every time the editor is invoked.
+       Instead we could save the list to a file and update it once the syntax
+       file gets updated (either by testing or by explicit user command). */
+    edit_load_syntax (NULL, names, 0);
+
+    if ((syntax = exec_syntax_dialog ((const char**) names)) < 0)
+	return;
+
+    old_auto_syntax = option_auto_syntax;
+    old_syntax_type = g_strdup (option_syntax_type);
+
+    /* Using a switch as we might want to define more specific commands, f.e.
+       "Refill syntax list" (compare N_DFLT_ENTRIES). */
+    switch (syntax) {
+	case 0: /* auto syntax */
+	    option_auto_syntax = 1;
+	    break;
+	default:
+	    option_auto_syntax = 0;
+	    g_free (option_syntax_type);
+	    option_syntax_type = g_strdup (names[syntax - N_DFLT_ENTRIES]);
+    }
+
+    /* Load or unload syntax rules if the option has changed */
+    if (option_auto_syntax) {
+	if (!old_auto_syntax) 
+	    edit_load_syntax (wedit, 0, 0);
+    } else
+	if (old_auto_syntax || old_syntax_type && option_syntax_type &&
+	    strcmp (old_syntax_type, option_syntax_type))
+	    edit_load_syntax (wedit, 0, option_syntax_type);
+
+    g_free (old_syntax_type);
+}
diff -pruN MC_4_6_1_PRE/mc/edit/edit.c MC_4_6_1_PRE.syntax.input/mc/edit/edit.c
--- MC_4_6_1_PRE/mc/edit/edit.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/edit.c	2005-07-10 11:42:55.000000000 +0200
@@ -499,6 +499,7 @@ edit_init (WEdit *edit, int lines, int c
 	   long line)
 {
     int to_free = 0;
+    option_auto_syntax = 1; /* Resetting to auto on every invokation */
 
     if (!edit) {
 #ifdef ENABLE_NLS
diff -pruN MC_4_6_1_PRE/mc/edit/editcmd.c MC_4_6_1_PRE.syntax.input/mc/edit/editcmd.c
--- MC_4_6_1_PRE/mc/edit/editcmd.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/editcmd.c	2005-07-10 11:07:02.000000000 +0200
@@ -512,7 +512,10 @@ edit_save_as_cmd (WEdit *edit)
 		edit->modified = 0;
 		edit->delete_file = 0;
 		if (different_filename)
-		    edit_load_syntax (edit, 0, 0);
+		    if (option_auto_syntax)
+			edit_load_syntax (edit, 0, 0);
+		    else
+			edit_load_syntax (edit, 0, option_syntax_type);
 		edit->force |= REDRAW_COMPLETELY;
 		return 1;
 	    } else {
diff -pruN MC_4_6_1_PRE/mc/edit/edit.h MC_4_6_1_PRE.syntax.input/mc/edit/edit.h
--- MC_4_6_1_PRE/mc/edit/edit.h	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/edit.h	2005-07-10 11:07:02.000000000 +0200
@@ -252,6 +252,7 @@ int line_is_blank (WEdit *edit, long lin
 int edit_indent_width (WEdit *edit, long p);
 void edit_insert_indent (WEdit *edit, int indent);
 void edit_options_dialog (void);
+void syntax_dialog (void);
 void edit_mail_dialog (WEdit *edit);
 void format_paragraph (WEdit *edit, int force);
 
@@ -311,6 +312,8 @@ extern int option_save_position;
 extern int option_backup_ext_int;
 extern int option_max_undo;
 extern int option_syntax_highlighting;
+extern int option_auto_syntax;
+extern char *option_syntax_type;
 extern int editor_option_check_nl_at_eof;
 
 extern int option_edit_right_extreme;
diff -pruN MC_4_6_1_PRE/mc/edit/editmenu.c MC_4_6_1_PRE.syntax.input/mc/edit/editmenu.c
--- MC_4_6_1_PRE/mc/edit/editmenu.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/editmenu.c	2005-07-10 11:07:02.000000000 +0200
@@ -272,6 +272,13 @@ menu_options (void)
 {
     edit_options_dialog ();
 }
+
+static void
+menu_syntax (void)
+{
+    syntax_dialog ();
+}
+
 static void
 menu_user_menu_cmd (void)
 {
@@ -394,7 +401,8 @@ static menu_entry OptMenu[] =
 {
     {' ', N_("&General...  "), 'G', menu_options},
     {' ', N_("&Save mode..."), 'S', menu_save_mode_cmd},
-    {' ', N_("learn &Keys..."), 'K', learn_keys}
+    {' ', N_("Learn &Keys..."), 'K', learn_keys},
+    {' ', N_("Syntax &Highlighting..."), 'H', menu_syntax}
 };
 
 #define OptMenuEmacs OptMenu
diff -pruN MC_4_6_1_PRE/mc/edit/editoptions.c MC_4_6_1_PRE.syntax.input/mc/edit/editoptions.c
--- MC_4_6_1_PRE/mc/edit/editoptions.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/editoptions.c	2005-07-10 11:07:02.000000000 +0200
@@ -199,6 +199,10 @@ edit_options_dialog (void)
     edit_key_emulation = tedit_key_emulation;
 
     /* Load or unload syntax rules if the option has changed */
-    if (option_syntax_highlighting != old_syntax_hl)
-	edit_load_syntax (wedit, 0, 0);
+    if (option_syntax_highlighting != old_syntax_hl) {
+	if (option_auto_syntax)
+	    edit_load_syntax (wedit, 0, 0);
+	else
+	    edit_load_syntax (wedit, 0, option_syntax_type);
+    }
 }
diff -pruN MC_4_6_1_PRE/mc/edit/Makefile.am MC_4_6_1_PRE.syntax.input/mc/edit/Makefile.am
--- MC_4_6_1_PRE/mc/edit/Makefile.am	2003-04-02 21:36:10.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/Makefile.am	2005-07-10 11:07:02.000000000 +0200
@@ -9,6 +9,6 @@ endif
 libedit_a_SOURCES = \
 	bookmark.c edit.c editcmd.c editwidget.c editdraw.c editkeys.c \
 	editmenu.c editoptions.c editcmddef.h edit.h edit-widget.h \
-	editlock.c editlock.h syntax.c wordproc.c
+	editlock.c editlock.h syntax.c wordproc.c choosesyntax.c
 
 EXTRA_DIST = ChangeLog
diff -pruN MC_4_6_1_PRE/mc/edit/syntax.c MC_4_6_1_PRE.syntax.input/mc/edit/syntax.c
--- MC_4_6_1_PRE/mc/edit/syntax.c	2005-05-29 12:04:00.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/edit/syntax.c	2005-07-10 11:27:20.000000000 +0200
@@ -23,6 +23,7 @@
 #include <config.h>
 #include "edit.h"
 #include "edit-widget.h"
+#include "syntax.h"
 #include "../src/color.h"	/* use_colors */
 #include "../src/main.h"	/* mc_home */
 #include "../src/wtools.h"	/* message() */
@@ -85,6 +86,8 @@ struct _syntax_marker {
 };
 
 int option_syntax_highlighting = 1;
+int option_auto_syntax = 1;
+char *option_syntax_type = NULL;
 
 #define syntax_g_free(x) do {g_free(x); (x)=0;} while (0)
 
@@ -1007,6 +1010,11 @@ edit_read_syntax_file (WEdit * edit, cha
 	}
 	if (names) {
 /* 1: just collecting a list of names of rule sets */
+/* This list could be allocated here dynamically as we don't know it's size yet */
+	    if (count == MAX_SYNTAX_FILES) {
+		names[count] = 0;
+		break;
+	    }
 	    names[count++] = g_strdup (args[2]);
 	    names[count] = 0;
 	} else if (type) {
diff -pruN MC_4_6_1_PRE/mc/edit/syntax.h MC_4_6_1_PRE.syntax.input/mc/edit/syntax.h
--- MC_4_6_1_PRE/mc/edit/syntax.h	1970-01-01 01:00:00.000000000 +0100
+++ MC_4_6_1_PRE.syntax.input/mc/edit/syntax.h	2005-07-10 11:11:56.000000000 +0200
@@ -0,0 +1,6 @@
+#ifndef __SYNTAX_H
+#define __SYNTAX_H
+
+#define MAX_SYNTAX_FILES 1024
+
+#endif				/* !__SYNTAX_H */
diff -pruN MC_4_6_1_PRE/mc/src/wtools.h MC_4_6_1_PRE.syntax.input/mc/src/wtools.h
--- MC_4_6_1_PRE/mc/src/wtools.h	2004-09-17 05:19:21.000000000 +0200
+++ MC_4_6_1_PRE.syntax.input/mc/src/wtools.h	2005-07-10 11:07:02.000000000 +0200
@@ -1,8 +1,7 @@
 #ifndef __WTOOLS_H
 #define __WTOOLS_H
 
-struct Dlg_head;
-struct WListbox;
+#include "widget.h"
 
 /* Listbox utility functions */
 typedef struct {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]