Skip to content

Commit 108bc83

Browse files
committed
Merge pull request #19 from cryogenian/readonly
Readonly
2 parents 2ef3092 + 062bc2a commit 108bc83

16 files changed

+279
-10
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"purescript-prelude": "^0.1.3"
2828
},
2929
"devDependencies": {
30-
"ace-builds": "~1.2.0"
30+
"ace-builds": "~1.2.0",
31+
"purescript-refs": "~0.2.0"
3132
}
3233
}

example/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
bottom: 0;
1111
left: 0;
1212
}
13+
.readonly-highlight {
14+
background-color: red;
15+
opacity: 0.2;
16+
position: absolute;
17+
}
1318
</style>
1419
<script src="../bower_components/ace-builds/src-min/ace.js"
1520
type="text/javascript"

example/src/Main.purs

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import Prelude
44

55
import Data.Maybe
66
import Data.Array.ST (pushSTArray)
7+
import DOM (DOM())
78

89
import Control.Monad.Eff
910
import Control.Monad.Eff.Console (print, log, CONSOLE())
11+
import Control.Monad.Eff.Ref (newRef, readRef, writeRef, REF())
1012

1113
import Ace
12-
import Ace.Types
1314

1415
import Ace.Config as Config
1516
import Ace.Editor as Editor
@@ -21,23 +22,83 @@ import Ace.Range as Range
2122
import Ace.ScrollBar as ScrollBar
2223
import Ace.Search as Search
2324
import Ace.Selection as Selection
24-
import Ace.Tokenizer as Tokenizer
2525
import Ace.TokenIterator as TokenIterator
2626
import Ace.UndoManager as UndoManager
27-
import Ace.VirtualRenderer as VirtualRenderer
2827
import Ace.Ext.LanguageTools as LanguageTools
2928
import Ace.Ext.LanguageTools.Completer as Completer
29+
import Ace.KeyBinding as KeyBinding
3030

3131
foreign import rules :: Rules
3232
foreign import onLoad :: forall e. Eff e Unit -> Eff e Unit
3333

34-
main :: Eff (ace :: ACE, console :: CONSOLE) Unit
34+
main :: forall e. Eff (ref ::REF, console :: CONSOLE, ace :: ACE, dom :: DOM|e) Unit
3535
main = onLoad $ do
36-
3736
Config.set Config.basePath "foo"
3837

3938
-- Create an editor
4039
editor <- Ace.edit "editor" ace
40+
session <- Editor.getSession editor
41+
document <- Session.getDocument session
42+
Editor.setValue "blablabla \n tr test boo boo" Nothing editor
43+
44+
startAnchor <- Document.createAnchor 1 5 document
45+
endAnchor <- Document.createAnchor 1 9 document
46+
Anchor.setInsertRight true endAnchor
47+
48+
range <- Range.create 1 4 1 10
49+
markerRef <-
50+
Session.addMarker
51+
range
52+
"readonly-highlight"
53+
"string"
54+
false
55+
session
56+
>>= newRef
57+
58+
let rerenderMarker _ = do
59+
readRef markerRef >>= flip Session.removeMarker session
60+
Position {row: startRow, column: startColumn}
61+
<- Anchor.getPosition startAnchor
62+
Position {row: endRow, column: endColumn}
63+
<- Anchor.getPosition endAnchor
64+
markRange <- Range.create
65+
startRow
66+
(startColumn - one)
67+
endRow
68+
(endColumn + one)
69+
newMId <- Session.addMarker
70+
markRange
71+
"readonly-highlight"
72+
"string"
73+
false
74+
session
75+
76+
writeRef markerRef newMId
77+
pure unit
78+
79+
Anchor.onChange startAnchor rerenderMarker
80+
Anchor.onChange endAnchor rerenderMarker
81+
82+
Editor.getKeyBinding editor
83+
>>= KeyBinding.addKeyboardHandler \{editor} hs kstring kcode evt -> do
84+
if hs == -1 || (kcode <= 40 && kcode >= 37)
85+
then pure Nothing
86+
else do
87+
Position {row: startRow, column: startColumn}
88+
<- Anchor.getPosition startAnchor
89+
Position {row: endRow, column: endColumn}
90+
<- Anchor.getPosition endAnchor
91+
selectedRange <- Editor.getSelectionRange editor
92+
newRange <-
93+
if kstring == "backspace"
94+
then Range.create startRow startColumn endRow (endColumn + 1)
95+
else if kstring == "delete" || (kstring == "d" && hs == 1)
96+
then Range.create startRow (startColumn - 1) endRow endColumn
97+
else Range.create startRow startColumn endRow endColumn
98+
intersected <- Range.intersects newRange selectedRange
99+
pure if intersected
100+
then Just {command: Null, passEvent: false}
101+
else Nothing
41102

42103
-- Set the theme
43104
Editor.setTheme "ace/theme/chrome" editor
@@ -49,7 +110,7 @@ main = onLoad $ do
49110
editor `Editor.onFocus` log "Editor gained focus."
50111

51112
-- Get the editor session
52-
session <- Editor.getSession editor
113+
53114

54115
-- Set the mode
55116
Session.setMode "ace/mode/javascript" session
@@ -149,10 +210,11 @@ main = onLoad $ do
149210

150211
-- Misc. Tests
151212
miscTests
213+
152214
pure unit
153215

154216

155-
miscTests :: Eff (console :: CONSOLE, ace :: ACE) Unit
217+
miscTests :: forall e. Eff (console :: CONSOLE, ace :: ACE |e) Unit
156218
miscTests = void do
157219
editor <- Ace.edit "tests" ace
158220
session <- Editor.getSession editor

src/Ace/Anchor.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,18 @@ exports.createImpl = function(doc, row, column) {
4242
};
4343
};
4444

45+
46+
exports.getInsertRight = function(a) {
47+
return function() {
48+
return a.$insertRight;
49+
};
50+
};
51+
52+
exports.setInsertRight = function(val) {
53+
return function(a) {
54+
return function() {
55+
a.$insertRight = val;
56+
return {};
57+
};
58+
};
59+
};

src/Ace/Anchor.purs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ module Ace.Anchor
55
, setPosition
66
, detach
77
, create
8+
, getInsertRight
9+
, setInsertRight
810
) where
911

1012
import Prelude
@@ -43,3 +45,8 @@ foreign import createImpl :: forall eff. Fn3 Document Int Int (Eff (ace :: ACE |
4345

4446
create :: forall eff. Document -> Int -> Int -> Eff (ace :: ACE | eff) Anchor
4547
create doc row column = runFn3 createImpl doc row column
48+
49+
foreign import getInsertRight :: forall eff. Anchor -> Eff (ace :: ACE |eff) Boolean
50+
foreign import setInsertRight
51+
:: forall eff
52+
. Boolean -> Anchor -> Eff (ace :: ACE|eff) Unit

src/Ace/Command.purs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Ace.Command where
2+
3+
import Ace.Types (Command(..))
4+
5+
commandToString :: Command -> String
6+
commandToString Null = "null"
7+
commandToString InsertText = "inserttext"

src/Ace/EditSession.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,3 +551,16 @@ exports.createWithModeImpl = create;
551551
exports.createImpl = create;
552552

553553
exports.createFromLinesImpl = create;
554+
555+
exports.getMarkers = function(session) {
556+
return function() {
557+
var markerObj = session.getMarkers();
558+
var i, ks = Object.getOwnPropertyNames(markerObj),
559+
key, result = [];
560+
for (i = 0; i < ks.length; i++) {
561+
key = ks[i];
562+
result.push(markerObj[key]);
563+
}
564+
return result;
565+
};
566+
};

src/Ace/EditSession.purs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ module Ace.EditSession
104104
, setValue
105105
, setWrapLimitRange
106106
, toggleOverwrite
107+
, getMarkers
107108
) where
108109

109110
import Prelude
@@ -293,9 +294,9 @@ foreign import clearBreakpointImpl :: forall eff. Fn2 Int EditSession (Eff (ace
293294
clearBreakpoint :: forall eff. Int -> EditSession -> Eff (ace :: ACE | eff) Unit
294295
clearBreakpoint row self = runFn2 clearBreakpointImpl row self
295296

296-
foreign import addMarkerImpl :: forall eff. Fn5 Range String String Boolean EditSession (Eff (ace :: ACE | eff) Unit)
297+
foreign import addMarkerImpl :: forall eff. Fn5 Range String String Boolean EditSession (Eff (ace :: ACE | eff) Int)
297298

298-
addMarker :: forall eff. Range -> String -> String -> Boolean -> EditSession -> Eff (ace :: ACE | eff) Unit
299+
addMarker :: forall eff. Range -> String -> String -> Boolean -> EditSession -> Eff (ace :: ACE | eff) Int
299300
addMarker range clazz _type inFront self = runFn5 addMarkerImpl range clazz _type inFront self
300301

301302
type DynamicMarker eff a = forall h. STArray h String -> HTMLElement -> Eff (st :: ST h | eff) a
@@ -534,3 +535,7 @@ foreign import createFromLinesImpl :: forall eff. Fn2 (Array String) (Nullable S
534535

535536
createFromLines :: forall eff. Array String -> Maybe String -> Eff (ace :: ACE | eff) EditSession
536537
createFromLines text mode' = runFn2 createFromLinesImpl text (toNullable mode')
538+
539+
540+
foreign import getMarkers
541+
:: forall eff. EditSession -> Eff (ace :: ACE |eff) (Array Marker)

src/Ace/Editor.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,9 @@ exports.createImpl = function(renderer, session) {
166166
return new Editor(renderer, session);
167167
};
168168
};
169+
170+
exports.getKeyBinding = function(editor) {
171+
return function() {
172+
return editor.keyBinding;
173+
};
174+
};

src/Ace/Editor.purs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ module Ace.Editor
125125
, setEnableLiveAutocompletion
126126
, setEnableBasicAutocompletion
127127
, setEnableSnippets
128+
, getKeyBinding
128129
) where
129130

130131
import Prelude
@@ -681,3 +682,7 @@ setEnableLiveAutocompletion = setOption "enableLiveAutocompletion"
681682
setEnableSnippets
682683
:: forall eff. Boolean -> Editor -> Eff (ace :: ACE | eff) Unit
683684
setEnableSnippets = setOption "enableSnippets"
685+
686+
687+
foreign import getKeyBinding
688+
:: forall eff. Editor -> Eff (ace :: ACE | eff) KeyBinding

0 commit comments

Comments
 (0)