Skip to content

Commit

Permalink
variable pagesize,disp filename, disp mode
Browse files Browse the repository at this point in the history
  • Loading branch information
r-mutax committed Oct 31, 2020
1 parent 09570a7 commit 40d2b36
Show file tree
Hide file tree
Showing 13 changed files with 284 additions and 85 deletions.
29 changes: 29 additions & 0 deletions .vscode/launch.json
@@ -0,0 +1,29 @@
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - アクティブ ファイルのビルドとデバッグ",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/mtxtprot",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "gdb の再フォーマットを有効にする",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build",
"miDebuggerPath":"/usr/bin/gdb"
}
]
}
47 changes: 46 additions & 1 deletion .vscode/settings.json
Expand Up @@ -2,6 +2,51 @@
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe",
"files.associations": {
"string": "cpp",
"iostream": "cpp"
"iostream": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"typeinfo": "cpp",
"ctime": "cpp",
"iomanip": "cpp"
}
}
19 changes: 19 additions & 0 deletions .vscode/tasks.json
@@ -0,0 +1,19 @@
{
"tasks": [
{
"type": "shell",
"label": "build",
"command": "make",
"options": {
"shell":{
"executable": "C:\\Windows\\System32\\wsl.exe"
},
},
"group": {
"kind": "build",
"isDefault": true
}
}
],
"version": "2.0.0"
}
2 changes: 1 addition & 1 deletion README.md
@@ -1 +1 @@
# MTextProt
# MTextProt
Binary file modified bin/mtxtprot
Binary file not shown.
20 changes: 18 additions & 2 deletions inc/CEditControl.h
@@ -1,4 +1,6 @@
#include "CEditEngine.h"
#include <sstream>
#include <iomanip>

enum EDIT_TYPE{
COMMAND_MODE = 0
Expand All @@ -10,15 +12,29 @@ class CEditControl {
CEditEngine* m_cediteng;
char* m_filename;
EDIT_TYPE m_mode;

long m_iStartLine;
long m_iPageLine;
long m_iConsoleRows;
long m_iConsoleColumns;
void disp_sub(int StartLine, int dispLineNum);
std::string GetFileDispName();
void disp_filename();
void disp_mode();

public:
CEditControl();
~CEditControl(){};
void run();
void disp();
void disp(int StartLine, int dispLineNum);

void command_loop();
void init();
void command_convert();
void keygen_command_mode(char key);
void keygen_insert_mode(char key);
void keygen_commonkey(char key);
bool set_filename(char* filename);
void update_winsize();
void PageUp();
void PageDown();
};
11 changes: 5 additions & 6 deletions inc/CEditEngine.h
Expand Up @@ -2,6 +2,8 @@

#define QUIT_CHAR 0x04 /* CTRL-D を押すと終了する.*/

typedef std::list<std::string> LINES;

enum ED_MESSAGE{
FILE_OPEN = 0
,FILE_CLOSE
Expand All @@ -17,15 +19,12 @@ typedef struct _message{
class CEditEngine{
CLineMgr* m_cmng;
int m_pageline;

void disp_sub(int StartLine, int dispLineNum);
int m_CurrentLine; // 表示中の1行目

public:
CEditEngine(char* filename);
~CEditEngine(){};
void disp(int StartLine, int dispLineNum);
void disp();
void SetPageHeight(int height);
void PageUp();
void PageDown();
void GetLines(LINES &buf, int iStartLine, int iDispLineNum);
long GetLineNum();
};
9 changes: 8 additions & 1 deletion inc/console.h
@@ -1,5 +1,12 @@
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>

typedef struct _MSize{
int iWidth;
int iHeight;
} MSize;

void StartConsoleOperation(void);
void EndConsoleOperation(void);
void EndConsoleOperation(void);
bool GetConsoleSize(MSize* ms);
141 changes: 129 additions & 12 deletions src/CEditControl.cpp
@@ -1,9 +1,13 @@
#include "CEditControl.h"
#include "console.h"

#define clr "\e[2J"

CEditControl::CEditControl() : m_mode(COMMAND_MODE){
m_cediteng = nullptr;
m_filename = nullptr;
m_iStartLine = 0;
update_winsize();
}

bool CEditControl::set_filename(char* filename){
Expand All @@ -15,27 +19,42 @@ bool CEditControl::set_filename(char* filename){
}

void CEditControl::run(){

if(m_cediteng == nullptr){
if(m_filename != ""){
m_cediteng = new CEditEngine(m_filename);
}
}

StartConsoleOperation();

command_loop();

EndConsoleOperation();
}

void CEditControl::update_winsize(){

MSize ms;
if(GetConsoleSize(&ms)){
m_iPageLine = ms.iHeight - 2;
m_iConsoleRows = ms.iHeight;
m_iConsoleColumns = ms.iWidth;
} else {
// 取得に失敗した場合は10固定にしとく。
m_iPageLine = 10;
}
}

void CEditControl::command_loop(){
char input_key;

m_cediteng->disp(0,10);
disp();

while(input_key = getchar()){

update_winsize();

if(m_mode == COMMAND_MODE){
keygen_command_mode(input_key);
} else if(m_mode == INSERT_MODE){
Expand All @@ -50,11 +69,9 @@ void CEditControl::command_loop(){
void CEditControl::keygen_command_mode(char key){

switch(key){
case 0x35: // PAGE_UP
m_cediteng->PageUp();
break;
case 0x36: // PAGE_DOWM
m_cediteng->PageDown();
case 'i':
m_mode = INSERT_MODE;
disp();
break;
default:
keygen_commonkey(key);
Expand All @@ -64,16 +81,116 @@ void CEditControl::keygen_command_mode(char key){

// 挿入モードでのキー処理
void CEditControl::keygen_insert_mode(char key){

switch(key){
default:
keygen_commonkey(key);
break;
}
}

// 共通のキー処理
void CEditControl::keygen_commonkey(char key){
switch (key)
{
case QUIT_CHAR:
m_mode = QUIT_OPERATION;
break;
default:
break;
case 0x1b:
m_mode = COMMAND_MODE;
disp();
break;
case QUIT_CHAR:
m_mode = QUIT_OPERATION;
break;
case 0x35: // PAGE_UP
PageUp();
break;
case 0x36: // PAGE_DOWM
PageDown();
break;
default:
break;
}
}

void CEditControl::PageDown(){

int nextStartLine = m_iStartLine + m_iPageLine;
int maxline = m_cediteng->GetLineNum();
if( maxline < nextStartLine) return;
if(nextStartLine == m_iStartLine) return;

disp(nextStartLine, m_iPageLine);

}
void CEditControl::PageUp(){

int nextStartLine = m_iStartLine - m_iPageLine;
if(nextStartLine < 0) nextStartLine = 0;
if(nextStartLine == m_iStartLine) return;

disp(nextStartLine, m_iPageLine);
}

void CEditControl::disp(int StartLine, int dispLineNum){
disp_sub(StartLine, dispLineNum);
}

void CEditControl::disp(){
disp_sub(m_iStartLine, m_iPageLine);
}

void CEditControl::disp_sub(int StartLine, int dispLineNum){

// 現在の開始行の更新
m_iStartLine = StartLine;
LINES buf;
m_cediteng->GetLines(buf, StartLine, dispLineNum);

printf(clr);

// step1 編集中のファイル名の表示
disp_filename();

printf("\e[2;1H");
for(auto str : buf){
std::cout << str << "\r\n";
}

disp_mode();

}

std::string CEditControl::GetFileDispName(){
std::string DispFileName;
std::stringstream ss;
if(m_filename == ""){
DispFileName = "New File.";
} else {
ss << std::left << std::setw(m_iConsoleColumns) << std::setfill(' ') << m_filename;
DispFileName = ss.str();
}
return DispFileName;
}

void CEditControl::disp_filename(){
std::string dispName = GetFileDispName();
printf("\e[1;1H");
printf("\033[47m");
printf("\033[34m");
std::cout << dispName << "\r\n";
printf("\033[39m");
printf("\033[49m");
}

void CEditControl::disp_mode(){
std::string mode;
if(m_mode == COMMAND_MODE){
mode = "-- command --";
} else {
mode = "-- insert --";
}

int iCursorPos = m_iConsoleColumns - (int)mode.size();
printf("\e[%ld;%dH", m_iConsoleRows, iCursorPos);
std::cout << mode;
printf("\e[%ld;1H", m_iConsoleRows);
}

0 comments on commit 40d2b36

Please sign in to comment.