KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > jemacs > buffer > ProcessMode


1 // Copyright (c) 2002 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.jemacs.buffer;
5 import gnu.mapping.*;
6 import java.io.*;
7
8 public class ProcessMode extends Mode
9 {
10   protected Writer toInferior;
11
12   protected Marker processMark;
13
14   protected boolean lineMode = false;
15
16   static Procedure enterAction = new gnu.expr.PrimProcedure(gnu.bytecode.ClassType.make("gnu.jemacs.buffer.ProcessMode").getDeclaredMethod("enterAction", 0));
17
18   public static EKeymap modeMap = new EKeymap("process");
19   static
20   {
21     modeMap.defineKey("\n", enterAction);
22     modeMap.defineKey("\r", enterAction);
23     modeMap.defineKey("enter", enterAction);
24     modeMap.defineKey("return", enterAction);
25     Object JavaDoc insert = new ProcessInsertCommand();
26     // modeMap.setDefaultBinding(insert);
27
modeMap.set(' ', 126, insert);
28     modeMap.set(128, 255, insert);
29   }
30
31   public Marker getProcessMark ()
32   {
33     return processMark;
34   }
35
36   public static void enterAction()
37   {
38     Buffer buffer = Buffer.getCurrent();
39     ProcessMode pmode = getProcessMode(buffer);
40     pmode.enter();
41   }
42
43   public void enter()
44   {
45     try
46       {
47     if (lineMode)
48       {
49         buffer.insert('\n', 1, null);
50         int pos = buffer.getDot();
51         int markPos = processMark.getOffset();
52
53         buffer.writeTo(markPos, pos - markPos, toInferior);
54         processMark.setDot(pos);
55       }
56     else
57       toInferior.write('\r');
58     toInferior.flush();
59       }
60     catch (Exception JavaDoc ex)
61       {
62         throw new WrappedException(ex);
63       }
64   }
65
66   public static ProcessMode getProcessMode(Buffer buffer)
67   {
68     for (Mode mode = buffer.modes; ; mode = mode.next)
69       {
70     if (mode == null)
71       Signal.error("not in process mode");
72     if (mode instanceof ProcessMode)
73       return (ProcessMode) mode;
74       }
75   }
76
77   public void writeToInferior(gnu.lists.CharSeq str)
78     throws java.io.IOException JavaDoc
79   {
80     str.writeTo(toInferior);
81     toInferior.flush();
82   }
83
84   public void selfInsert()
85   {
86     EWindow window = EWindow.getSelected();
87     insert((char) window.pendingKeys[window.pendingLength], 1);
88   }
89
90   public void insert(char ch, int count)
91   {
92     if (! lineMode)
93       {
94     try
95       {
96         while (--count >= 0)
97           toInferior.write(ch);
98         toInferior.flush();
99       }
100     catch (Exception JavaDoc ex)
101       {
102         throw new WrappedException(ex);
103       }
104       }
105     else
106       buffer.insert(ch, count);
107   }
108
109   /**
110    *
111    * @param doRun
112    */

113   public void invoke(Runnable JavaDoc doRun)
114   {
115     buffer.invoke(doRun);
116   }
117 }
118
119 class ProcessInsertCommand extends Procedure0
120 {
121   public Object JavaDoc getProperty (Object JavaDoc key, Object JavaDoc defaultValue)
122   {
123     if (key == "emacs-interactive")
124       return "*";
125     return super.getProperty(key, defaultValue);
126   }
127
128   public Object JavaDoc apply0 ()
129   {
130     EWindow window = EWindow.getSelected();
131     Buffer buffer = window.buffer;
132     ProcessMode pmode = ProcessMode.getProcessMode(buffer);
133     pmode.insert((char) window.pendingKeys[window.pendingLength], 1);
134     return Values.empty;
135   }
136 }
137
Popular Tags