| 43 |
@cursor = Cursor.new(0, 0) # logical cursor |
@cursor = Cursor.new(0, 0) # logical cursor |
| 44 |
@modeline = Edmaru::SYSTEM_MODELINE.new(self) |
@modeline = Edmaru::SYSTEM_MODELINE.new(self) |
| 45 |
@start_line = 0 |
@start_line = 0 |
| 46 |
|
@focused = false |
| 47 |
|
|
| 48 |
init_ui |
init_ui |
| 49 |
end |
end |
| 107 |
#_move_cursor_ :: _true_ to cause the cursor move to the end of the |
#_move_cursor_ :: _true_ to cause the cursor move to the end of the |
| 108 |
#inserted string. |
#inserted string. |
| 109 |
def insert_at_cursor(str, move_cursor = true) |
def insert_at_cursor(str, move_cursor = true) |
| 110 |
|
@view.hide_alert |
| 111 |
|
|
| 112 |
#Insert to the buffer. |
#Insert to the buffer. |
| 113 |
begin |
begin |
| 114 |
@buffer.insert(@cursor.row, @cursor.column, str) |
@buffer.insert(@cursor.row, @cursor.column, str) |
| 116 |
#Move the cursor to the end of inserted string. |
#Move the cursor to the end of inserted string. |
| 117 |
cursor_forward(str.size) if move_cursor |
cursor_forward(str.size) if move_cursor |
| 118 |
rescue ReadOnlyException => e |
rescue ReadOnlyException => e |
| 119 |
@view.mini_window.show_alert(e.to_s) |
@view.show_alert(e.to_s) |
|
@view.beep |
|
| 120 |
end |
end |
| 121 |
end |
end |
| 122 |
|
|
| 128 |
#=== Warning |
#=== Warning |
| 129 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 130 |
def cursor_forward(n = 1) |
def cursor_forward(n = 1) |
| 131 |
|
@view.hide_alert |
| 132 |
|
|
| 133 |
n.times{ |
n.times{ |
| 134 |
if @cursor.column >= @buffer.lines[@cursor.row].size && |
if @cursor.column >= @buffer.lines[@cursor.row].size && |
| 135 |
@cursor.row == (@buffer.lines.size - 1) |
@cursor.row == (@buffer.lines.size - 1) |
| 136 |
refresh_cursor |
refresh_cursor |
| 137 |
@view.mini_window.show_alert("End of buffer") |
@view.show_alert("End of buffer") |
|
@view.beep |
|
| 138 |
return |
return |
| 139 |
elsif @cursor.column >= @buffer.lines[@cursor.row].size |
elsif @cursor.column >= @buffer.lines[@cursor.row].size |
| 140 |
#Go to the begin of the next line |
#Go to the begin of the next line |
| 156 |
#=== Warning |
#=== Warning |
| 157 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 158 |
def cursor_backward(n = 1) |
def cursor_backward(n = 1) |
| 159 |
|
@view.hide_alert |
| 160 |
|
|
| 161 |
n.times{ |
n.times{ |
| 162 |
if @cursor.column == 0 && @cursor.row == 0 |
if @cursor.column == 0 && @cursor.row == 0 |
| 163 |
refresh_cursor |
refresh_cursor |
| 164 |
@view.mini_window.show_alert("Beginning of buffer") |
@view.show_alert("Beginning of buffer") |
|
@view.beep |
|
| 165 |
return |
return |
| 166 |
elsif @cursor.column == 0 |
elsif @cursor.column == 0 |
| 167 |
@cursor.row -= 1 |
@cursor.row -= 1 |
| 179 |
#=== Warning |
#=== Warning |
| 180 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 181 |
def cursor_goto_line_head |
def cursor_goto_line_head |
| 182 |
|
@view.hide_alert |
| 183 |
|
|
| 184 |
@cursor.column = 0 |
@cursor.column = 0 |
| 185 |
refresh_cursor |
refresh_cursor |
| 186 |
end |
end |
| 190 |
#=== Warning |
#=== Warning |
| 191 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 192 |
def cursor_goto_line_tail |
def cursor_goto_line_tail |
| 193 |
|
@view.hide_alert |
| 194 |
|
|
| 195 |
@cursor.column = buffer.lines[@cursor.row].size |
@cursor.column = buffer.lines[@cursor.row].size |
| 196 |
refresh_cursor |
refresh_cursor |
| 197 |
end |
end |
| 201 |
#=== Warning |
#=== Warning |
| 202 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 203 |
def cursor_goto_next_line |
def cursor_goto_next_line |
| 204 |
|
@view.hide_alert |
| 205 |
|
|
| 206 |
if @cursor.row == (@buffer.lines.size - 1) |
if @cursor.row == (@buffer.lines.size - 1) |
| 207 |
@view.mini_window.show_alert("The last line") |
@view.show_alert("The last line") |
|
@view.beep |
|
| 208 |
else |
else |
| 209 |
@cursor.row += 1 |
@cursor.row += 1 |
| 210 |
if @buffer.lines[@cursor.row].size < @cursor.column |
if @buffer.lines[@cursor.row].size < @cursor.column |
| 220 |
#=== Warning |
#=== Warning |
| 221 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 222 |
def cursor_goto_previous_line |
def cursor_goto_previous_line |
| 223 |
|
@view.hide_alert |
| 224 |
|
|
| 225 |
if @cursor.row == 0 |
if @cursor.row == 0 |
| 226 |
@view.mini_window.show_alert("The first line") |
@view.show_alert("The first line") |
|
@view.beep |
|
| 227 |
else |
else |
| 228 |
@cursor.row -= 1 |
@cursor.row -= 1 |
| 229 |
if @buffer.lines[@cursor.row].size < @cursor.column |
if @buffer.lines[@cursor.row].size < @cursor.column |
| 240 |
#=== Warning |
#=== Warning |
| 241 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 242 |
def backspace |
def backspace |
| 243 |
|
@view.hide_alert |
| 244 |
|
|
| 245 |
pre_cursor = @cursor.clone |
pre_cursor = @cursor.clone |
| 246 |
|
|
| 247 |
begin |
begin |
| 248 |
if @cursor.column == 0 && @cursor.row == 0 |
if @cursor.column == 0 && @cursor.row == 0 |
| 249 |
#ToDo: Alert that the cursor is at the begin of the current buffer. |
#ToDo: Alert that the cursor is at the begin of the current buffer. |
| 250 |
@view.mini_window.show_alert("Beginning of buffer") |
@view.show_alert("Beginning of buffer") |
|
@view.beep |
|
| 251 |
elsif @cursor.column == 0 # && @cursor.row != 0 |
elsif @cursor.column == 0 # && @cursor.row != 0 |
| 252 |
#Concatenate the current lien into the previous line. |
#Concatenate the current lien into the previous line. |
| 253 |
@buffer.delete_at(@cursor.row -= 1, |
@buffer.delete_at(@cursor.row -= 1, |
| 259 |
end |
end |
| 260 |
rescue ReadOnlyException => e |
rescue ReadOnlyException => e |
| 261 |
@cursor = pre_cursor |
@cursor = pre_cursor |
| 262 |
@view.mini_window.show_alert(e.to_s) |
@view.show_alert(e.to_s) |
|
@view.beep |
|
| 263 |
end |
end |
| 264 |
end |
end |
| 265 |
|
|
| 268 |
#=== Warning |
#=== Warning |
| 269 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 270 |
def delete_at_cursor |
def delete_at_cursor |
| 271 |
|
@view.hide_alert |
| 272 |
|
|
| 273 |
begin |
begin |
| 274 |
@buffer.delete_at(@cursor.row, @cursor.column) |
@buffer.delete_at(@cursor.row, @cursor.column) |
| 275 |
rescue EndOfBufferException => e |
rescue EndOfBufferException => e |
| 276 |
@view.mini_window.show_alert(e.to_s) |
@view.show_alert(e.to_s) |
|
@view.beep |
|
| 277 |
rescue ReadOnlyException => e |
rescue ReadOnlyException => e |
| 278 |
@view.mini_window.show_alert(e.to_s) |
@view.show_alert(e.to_s) |
|
@view.beep |
|
| 279 |
end |
end |
| 280 |
end |
end |
| 281 |
|
|
| 285 |
#=== Warning |
#=== Warning |
| 286 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 287 |
def kill_line |
def kill_line |
| 288 |
|
@view.hide_alert |
| 289 |
|
|
| 290 |
begin |
begin |
| 291 |
@view.push_to_kill_ring(@buffer.delete_line(@cursor.row, @cursor.column)) |
@view.push_to_kill_ring(@buffer.delete_line(@cursor.row, @cursor.column)) |
| 292 |
rescue EdmaruException => e |
rescue EdmaruException => e |
| 293 |
@view.mini_window.show_alert(e.to_s) |
@view.show_alert(e.to_s) |
|
@view.beep |
|
| 294 |
end |
end |
| 295 |
end |
end |
| 296 |
|
|
| 299 |
#=== Warning |
#=== Warning |
| 300 |
#This method *MUST* *NOT* be overrided in derived classes. |
#This method *MUST* *NOT* be overrided in derived classes. |
| 301 |
def yank |
def yank |
| 302 |
|
@view.hide_alert |
| 303 |
insert_at_cursor(@view.yank_from_kill_ring) |
insert_at_cursor(@view.yank_from_kill_ring) |
| 304 |
end |
end |
| 305 |
|
|
| 324 |
def refresh |
def refresh |
| 325 |
end |
end |
| 326 |
|
|
| 327 |
|
#Focus on this window. |
| 328 |
|
# |
| 329 |
|
#=== Warning |
| 330 |
|
#This method *SHOULD* *NOT* be overrided in derived classes. |
| 331 |
|
def focus_in |
| 332 |
|
@focused = true |
| 333 |
|
|
| 334 |
|
refresh_cursor |
| 335 |
|
end |
| 336 |
|
|
| 337 |
|
#Focus out from this window. |
| 338 |
|
# |
| 339 |
|
#=== Warning |
| 340 |
|
#This method *SHOULD* *NOT* be overrided in derived classes. |
| 341 |
|
def focus_out |
| 342 |
|
@focused = false |
| 343 |
|
|
| 344 |
|
refresh_cursor |
| 345 |
|
end |
| 346 |
|
|
| 347 |
#Terminate this view instance. |
#Terminate this view instance. |
| 348 |
# |
# |
| 349 |
#=== Warning |
#=== Warning |