aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.h')
-rw-r--r--src/parser.h106
1 files changed, 65 insertions, 41 deletions
diff --git a/src/parser.h b/src/parser.h
index 9aa13ad..700d25f 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -87,6 +87,41 @@ protected:
throw SyntaxError(chr);
return NULL;
}
+
+public:
+ /**
+ * Process editing command (or key press).
+ *
+ * This is part of command line handling in interactive
+ * mode and allows the definition of state-specific
+ * editing commands (behaviour on key press).
+ *
+ * By implementing this method, sub-states can either
+ * handle a key and return or chain to the
+ * parent's process_edit_cmd() implementation.
+ *
+ * All implementations of this method are defined in
+ * cmdline.cpp.
+ */
+ virtual void process_edit_cmd(gchar key);
+
+ enum fnmacroMask {
+ FNMACRO_MASK_START = (1 << 0),
+ FNMACRO_MASK_STRING = (1 << 1),
+ FNMACRO_MASK_DEFAULT = ~((1 << 2)-1)
+ };
+
+ /**
+ * Get the function key macro mask this
+ * state refers to.
+ *
+ * Could also be modelled as a State member.
+ */
+ virtual fnmacroMask
+ get_fnmacro_mask(void) const
+ {
+ return FNMACRO_MASK_DEFAULT;
+ }
};
template <typename Type>
@@ -166,14 +201,9 @@ class StateExpectString : public State {
bool string_building;
bool last;
-public:
- /*
- * FIXME: Only public as long as cmdline.cpp
- * needs to access it.
- * Can be avoided one process_edit_cmd() is in State.
- */
StringBuildingMachine machine;
+public:
StateExpectString(bool _building = true, bool _last = true)
: insert_len(0), nesting(1),
string_building(_building), last(_last) {}
@@ -182,10 +212,19 @@ private:
State *custom(gchar chr);
void refresh(void);
+ virtual fnmacroMask
+ get_fnmacro_mask(void) const
+ {
+ return FNMACRO_MASK_STRING;
+ }
+
protected:
virtual void initial(void) {}
virtual void process(const gchar *str, gint new_chars) {}
virtual State *done(const gchar *str) = 0;
+
+ /* in cmdline.cpp */
+ void process_edit_cmd(gchar key);
};
class StateExpectFile : public StateExpectString {
@@ -198,12 +237,19 @@ private:
protected:
virtual State *got_file(const gchar *filename) = 0;
+
+ /* in cmdline.cpp */
+ void process_edit_cmd(gchar key);
};
class StateExpectDir : public StateExpectFile {
public:
StateExpectDir(bool _building = true, bool _last = true)
: StateExpectFile(_building, _last) {}
+
+protected:
+ /* in cmdline.cpp */
+ void process_edit_cmd(gchar key);
};
class StateStart : public State {
@@ -222,6 +268,12 @@ private:
State *custom(gchar chr);
void end_of_macro(void) {}
+
+ fnmacroMask
+ get_fnmacro_mask(void) const
+ {
+ return FNMACRO_MASK_START;
+ }
};
class StateControl : public State {
@@ -304,6 +356,10 @@ public:
private:
State *done(const gchar *str);
+
+protected:
+ /* in cmdline.cpp */
+ void process_edit_cmd(gchar key);
};
class StateScintilla_lParam : public StateExpectString {
@@ -323,6 +379,9 @@ protected:
void initial(void);
void process(const gchar *str, gint new_chars);
State *done(const gchar *str);
+
+ /* in cmdline.cpp */
+ void process_edit_cmd(gchar key);
};
class StateInsertIndent : public StateInsert {
@@ -346,41 +405,6 @@ namespace States {
extern StateInsertIndent insert_indent;
extern State *current;
-
- static inline bool
- is_start()
- {
- /*
- * The "escape" state exists only as a hack,
- * to support $$. Otherwise it should behave
- * like the start state.
- */
- return current == &start || current == &escape;
- }
-
- static inline bool
- is_string()
- {
- return dynamic_cast<StateExpectString *>(current);
- }
-
- static inline bool
- is_insertion()
- {
- return dynamic_cast<StateInsert *>(current);
- }
-
- static inline bool
- is_file()
- {
- return dynamic_cast<StateExpectFile *>(current);
- }
-
- static inline bool
- is_dir()
- {
- return dynamic_cast<StateExpectDir *>(current);
- }
}
extern enum Mode {