rbcurse-experimental 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +75 -0
- data/VERSION +1 -0
- data/examples/teststackflow.rb +113 -0
- data/lib/rbcurse/experimental/widgets/directorylist.rb +467 -0
- data/lib/rbcurse/experimental/widgets/directorytree.rb +69 -0
- data/lib/rbcurse/experimental/widgets/masterdetail.rb +166 -0
- data/lib/rbcurse/experimental/widgets/multiform.rb +330 -0
- data/lib/rbcurse/experimental/widgets/resultsetbrowser.rb +281 -0
- data/lib/rbcurse/experimental/widgets/resultsettextview.rb +586 -0
- data/lib/rbcurse/experimental/widgets/rscrollform.rb +418 -0
- data/lib/rbcurse/experimental/widgets/stackflow.rb +478 -0
- data/lib/rbcurse/experimental/widgets/undomanager.rb +188 -0
- metadata +89 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
=begin
|
2
|
+
* Name: UndoManager
|
3
|
+
* Description: Manages undo of text components
|
4
|
+
* Author: rkumar (arunachalesha)
|
5
|
+
|
6
|
+
ISSUES
|
7
|
+
|
8
|
+
This is a very simple, undo facility. This could change in the near future.
|
9
|
+
|
10
|
+
Todo:
|
11
|
+
We need to handle block updates - several undo ops to be done together.
|
12
|
+
|
13
|
+
|
14
|
+
--------
|
15
|
+
* Date: 2010-03-07 19:42
|
16
|
+
* License:
|
17
|
+
Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
18
|
+
|
19
|
+
=end
|
20
|
+
|
21
|
+
#
|
22
|
+
#
|
23
|
+
module RubyCurses
|
24
|
+
#
|
25
|
+
# AbstractUndo has the basic workings of the undo redo facility.
|
26
|
+
# It leaves the actual undo and redo to the implementing source object. However,
|
27
|
+
# it does the work of storing edits, and passing the correct edit to the implementor
|
28
|
+
# when the source object calls for an undo or redo operation. It thus manages the edit (undo) queue.
|
29
|
+
#
|
30
|
+
class AbstractUndo
|
31
|
+
# initialize the source object which will issue undo requests
|
32
|
+
def initialize _source
|
33
|
+
source(_source) #if _source
|
34
|
+
@pointer = 0
|
35
|
+
@actions = []
|
36
|
+
$log.debug " INSIDE UNDO CONSTR "
|
37
|
+
end
|
38
|
+
def source(_source)
|
39
|
+
$log.debug " calling source= "
|
40
|
+
raise "Cannot pass a nil source" unless _source
|
41
|
+
@source = _source
|
42
|
+
# currently this is very hardcode again. we need to see this in the light of other objects
|
43
|
+
#@source.bind(:CHANGE){|eve| add_edit(eve) }
|
44
|
+
# a little roundabout but done for getting things up fast
|
45
|
+
@source.undo_handler(self)
|
46
|
+
$log.debug " I am listening to change events on #{@source.name} "
|
47
|
+
end
|
48
|
+
# this is called whenever an undoable edit has happened.
|
49
|
+
# Currently, it is linked above in the bind statement. We've attached this
|
50
|
+
# method as a listener to the source.
|
51
|
+
def add_edit event
|
52
|
+
# this debug is very specific. it should be removed later. We do not know about the object
|
53
|
+
$log.debug " UNDO GOT #{event}: #{event.type}, (#{event.text}), rej: #{@reject_update} "
|
54
|
+
return if @reject_update
|
55
|
+
if @pointer < @actions.length
|
56
|
+
$log.debug " removing some actions since #{@pointer} < #{@actions.length} "
|
57
|
+
@actions.slice!(@pointer..-1)
|
58
|
+
$log.debug " removed actions since #{@pointer} , #{@actions.length} "
|
59
|
+
end
|
60
|
+
@actions << event
|
61
|
+
@pointer = @actions.length
|
62
|
+
end
|
63
|
+
# this has to be bound in source component
|
64
|
+
# typically bind C-_ to undo()
|
65
|
+
# this method figures out the correct undo object to be sent
|
66
|
+
# to the implementor
|
67
|
+
def undo
|
68
|
+
$log.debug " got UNDO call #{@pointer}, sz:#{@actions.size} "
|
69
|
+
return if @pointer == 0
|
70
|
+
@reject_update = true
|
71
|
+
@pointer -=1 #if @pointer > 0
|
72
|
+
@source.repaint_required true
|
73
|
+
@reject_update = false
|
74
|
+
edit = @actions[@pointer]
|
75
|
+
perform_undo edit
|
76
|
+
end
|
77
|
+
# this has to be bound in source
|
78
|
+
# typically bind C-r to redo()
|
79
|
+
# this method figures out the correct redo object to be sent
|
80
|
+
# to the implementor
|
81
|
+
def redo
|
82
|
+
$log.debug "UNDO GOT REDO call #{@pointer}, #{@actions.size} "
|
83
|
+
return if @pointer >= @actions.size
|
84
|
+
@reject_update = true
|
85
|
+
edit = @actions[@pointer]
|
86
|
+
perform_redo edit
|
87
|
+
@source.repaint_required true
|
88
|
+
@pointer +=1 #if @pointer > 0
|
89
|
+
@reject_update = false
|
90
|
+
end
|
91
|
+
def perform_redo edit
|
92
|
+
raise "You must implement this for your undoable component "
|
93
|
+
end
|
94
|
+
def perform_undo edit
|
95
|
+
raise "You must implement this for your undoable component "
|
96
|
+
# to be implemented
|
97
|
+
end
|
98
|
+
#def to_s
|
99
|
+
#inspect
|
100
|
+
#end
|
101
|
+
#def inspect
|
102
|
+
### now that textarea.to_s prints content we shouldn pass it here.
|
103
|
+
##"#{@type.to_s}, #{@source}, ind0:#{@index0}, ind1:#{@index1}, row:#{@row}, text:#{@text}"
|
104
|
+
#"#{@type.to_s}, ind0:#{@index0}, ind1:#{@index1}, row:#{@row}, text:#{@text}"
|
105
|
+
#end
|
106
|
+
end
|
107
|
+
## An implementation of AbstractUndo for textarea.
|
108
|
+
# Very basic.
|
109
|
+
class SimpleUndo < AbstractUndo
|
110
|
+
def initialize _source
|
111
|
+
super
|
112
|
+
end
|
113
|
+
def source(_source)
|
114
|
+
super
|
115
|
+
_source.bind(:CHANGE){|eve| add_edit(eve) }
|
116
|
+
end
|
117
|
+
def perform_undo act
|
118
|
+
row = act.row
|
119
|
+
col = act.index0
|
120
|
+
$log.debug " processing #{act} "
|
121
|
+
case act.type
|
122
|
+
when :INSERT
|
123
|
+
howmany = act.index1 - col
|
124
|
+
@source.list[row].slice!(col,howmany)
|
125
|
+
when :DELETE
|
126
|
+
$log.debug " UNDO processing DELETE #{col}, (#{act.text}) "
|
127
|
+
@source.list[row].insert(col, act.text.chomp)
|
128
|
+
when :DELETE_LINE
|
129
|
+
$log.debug " UNDO inside delete-line #{row} "
|
130
|
+
#@source.list.insert(row, act.text) # insert a blank line, since one was deleted
|
131
|
+
case act.text
|
132
|
+
when Array
|
133
|
+
index = row
|
134
|
+
act.text.each_with_index{|r,i| @source.list.insert index+i, r}
|
135
|
+
when String
|
136
|
+
@source.list.insert row, act.text
|
137
|
+
end
|
138
|
+
when :INSERT_LINE
|
139
|
+
$log.debug " UNDO inside insert-line #{row} "
|
140
|
+
case act.text
|
141
|
+
when Array
|
142
|
+
act.text.size.times { @source.list.delete_at row }
|
143
|
+
when String
|
144
|
+
@source.list.delete_at row
|
145
|
+
end
|
146
|
+
else
|
147
|
+
$log.warn "unhandled change type #{act.type} "
|
148
|
+
end
|
149
|
+
@source.repaint_required true
|
150
|
+
@reject_update = false
|
151
|
+
end
|
152
|
+
# this has to be bound in source
|
153
|
+
def perform_redo act
|
154
|
+
row = act.row
|
155
|
+
col = act.index0
|
156
|
+
$log.debug " REDO processing #{act} "
|
157
|
+
case act.type
|
158
|
+
when :INSERT
|
159
|
+
@source.list[row].insert(col, act.text)
|
160
|
+
when :DELETE
|
161
|
+
row = act.row
|
162
|
+
col = act.index0
|
163
|
+
howmany = act.index1 - col
|
164
|
+
@source.list[row].slice!(col,howmany)
|
165
|
+
when :DELETE_LINE
|
166
|
+
#$log.debug " UNDO redo got deleteline #{row} "
|
167
|
+
#@source.list.delete_at row
|
168
|
+
# changed on 2010-05-23 12:21 since was not handling mult delete
|
169
|
+
case act.text
|
170
|
+
when Array
|
171
|
+
act.text.size.times { @source.list.delete_at row }
|
172
|
+
when String
|
173
|
+
@source.list.delete_at row
|
174
|
+
end
|
175
|
+
when :INSERT_LINE
|
176
|
+
case act.text
|
177
|
+
when Array
|
178
|
+
index = row
|
179
|
+
act.text.each_with_index{|r,i| @source.list.insert index+i, r}
|
180
|
+
when String
|
181
|
+
@source.list.insert row, act.text
|
182
|
+
end
|
183
|
+
else
|
184
|
+
$log.warn "unhandled change type #{act.type} "
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end # module
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rbcurse-experimental
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rahul Kumar
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rbcurse-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.4
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rbcurse-extras
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0.0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.0'
|
46
|
+
description: Ruby curses/ncurses widgets, experimental and minimally tested
|
47
|
+
email: sentinel1879@gmail.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files:
|
51
|
+
- README.markdown
|
52
|
+
files:
|
53
|
+
- README.markdown
|
54
|
+
- VERSION
|
55
|
+
- examples/teststackflow.rb
|
56
|
+
- lib/rbcurse/experimental/widgets/directorylist.rb
|
57
|
+
- lib/rbcurse/experimental/widgets/directorytree.rb
|
58
|
+
- lib/rbcurse/experimental/widgets/masterdetail.rb
|
59
|
+
- lib/rbcurse/experimental/widgets/multiform.rb
|
60
|
+
- lib/rbcurse/experimental/widgets/resultsetbrowser.rb
|
61
|
+
- lib/rbcurse/experimental/widgets/resultsettextview.rb
|
62
|
+
- lib/rbcurse/experimental/widgets/rscrollform.rb
|
63
|
+
- lib/rbcurse/experimental/widgets/stackflow.rb
|
64
|
+
- lib/rbcurse/experimental/widgets/undomanager.rb
|
65
|
+
homepage: http://github.com/rkumar/rbcurse-experimental
|
66
|
+
licenses: []
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
requirements: []
|
84
|
+
rubyforge_project: rbcurse
|
85
|
+
rubygems_version: 1.8.23
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Ruby Ncurses Toolkit experimental widgets
|
89
|
+
test_files: []
|