aboutsummaryrefslogtreecommitdiff
path: root/editor/editor.go
diff options
context:
space:
mode:
Diffstat (limited to 'editor/editor.go')
-rw-r--r--editor/editor.go107
1 files changed, 107 insertions, 0 deletions
diff --git a/editor/editor.go b/editor/editor.go
new file mode 100644
index 0000000..67f0ab3
--- /dev/null
+++ b/editor/editor.go
@@ -0,0 +1,107 @@
+package editor
+
+import (
+ "path/filepath"
+ "time"
+
+ "github.com/prodhe/poe/gapbuffer"
+)
+
+// Editor is the edit component that holds text buffers. A UI of some sort operates on the editor to manipulate buffers.
+type Editor interface {
+ NewBuffer() (id int64, buf *Buffer)
+ Buffer(id int64) *Buffer
+ Buffers() ([]int64, []*Buffer)
+ Current() *Buffer
+ LoadBuffers(filenames []string)
+ CloseBuffer(id int64)
+ WorkDir() string
+ Len() int
+ Run(cmd string)
+}
+
+// New returns an empty editor with no buffers loaded.
+func New() Editor {
+ e := &editor{}
+ e.buffers = map[int64]*Buffer{}
+ e.workdir, _ = filepath.Abs(".")
+ e.initCommands()
+ return e
+}
+
+// editor implements Editor.
+type editor struct {
+ buffers map[int64]*Buffer
+ current int64 // id ref to current buffer
+ workdir string
+}
+
+// NewBuffer creates an empty buffer and appends it to the editor. Returns the new id and the new buffer.
+func (e *editor) NewBuffer() (id int64, buf *Buffer) {
+ buf = &Buffer{buf: &gapbuffer.Buffer{}}
+ id = e.genBufferID()
+ e.buffers[id] = buf
+ e.current = id
+ return id, buf
+}
+
+// Buffer returns the buffer with given index. Nil if id not found.
+func (e *editor) Buffer(id int64) *Buffer {
+ if _, ok := e.buffers[id]; ok {
+ e.current = id
+ }
+ return e.buffers[id]
+}
+
+// Buffers returns a slice of IDs and a slice of buffers.
+func (e *editor) Buffers() ([]int64, []*Buffer) {
+ ids := make([]int64, 0, len(e.buffers))
+ bs := make([]*Buffer, 0, len(e.buffers))
+ for i, b := range e.buffers {
+ ids = append(ids, i)
+ bs = append(bs, b)
+ }
+ return ids, bs
+}
+
+// Current returns the current buffer.
+func (e *editor) Current() *Buffer {
+ return e.buffers[e.current]
+}
+
+// CloseBuffer deletes the given buffer from memory. No warnings. Here be dragons.
+func (e *editor) CloseBuffer(id int64) {
+ delete(e.buffers, id)
+}
+
+// Len returns number of buffers currently in the editor.
+func (e *editor) Len() int {
+ return len(e.buffers)
+}
+
+// WorkDir returns the base working directory of the editor.
+func (e *editor) WorkDir() string {
+ if e.workdir == "" {
+ d, _ := filepath.Abs(".")
+ return d
+ }
+ return e.workdir
+}
+
+// LoadBuffers reads files from disk and loads them into windows. Screen need to be initialized.
+func (e *editor) LoadBuffers(fns []string) {
+ // load given filenames and append to buffer list
+ for _, fn := range fns {
+ _, buf := e.NewBuffer()
+ buf.NewFile(fn)
+ buf.ReadFile()
+ }
+
+ if len(fns) == 0 {
+ e.NewBuffer()
+ }
+}
+
+func (e *editor) genBufferID() int64 {
+ return time.Now().UnixNano()
+}