메뉴 건너뛰기

창조도시 기록보관소

언어 주석제거 프로그램 (수정)

2006.09.13 01:25

청연 조회 수:128 추천:1

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

class NotePad extends Frame implements WindowListener, ActionListener
{
Menu file, edit, sub, comment;
MenuBar mb;
MenuItem it[] = new MenuItem[17];
TextArea txtP;
FunctionMemo memo;

public NotePad()
{
super("메모장");
mb = new MenuBar();
file = new Menu("파일(F)");
edit = new Menu("편집(E)");
comment = new Menu("주석제거");
txtP = new TextArea();
memo = new FunctionMemo(txtP,this);

/////////////////////////////////////////////////////file

file.add(it[0] = new MenuItem("새로만들기(N)", new MenuShortcut(KeyEvent.VK_N)));
file.add(it[1] = new MenuItem("열기(O)...",new MenuShortcut(KeyEvent.VK_O)));
file.add(it[2] = new MenuItem("저장(S)",new MenuShortcut(KeyEvent.VK_S)));
file.add(it[3] = new MenuItem("다른이름으로저정(A)..."));
file.addSeparator();
file.add(it[4] = new MenuItem("끝내기(X)"));

/////////////////////////////////////////////////////edit

edit.add(it[5] = new MenuItem("실행취소(U)",new MenuShortcut(KeyEvent.VK_U)));
edit.addSeparator();
edit.add(it[6] = new MenuItem("잘라내기(X)",new MenuShortcut(KeyEvent.VK_X)));
edit.add(it[7] = new MenuItem("복사(C)",new MenuShortcut(KeyEvent.VK_C)));
edit.add(it[8] = new MenuItem("붙여넣기(V)",new MenuShortcut(KeyEvent.VK_V)));
edit.add(it[9] = new MenuItem("삭제(D)",new MenuShortcut(KeyEvent.VK_D)));
edit.addSeparator();
edit.add(it[10] = new MenuItem("찾기(F)...",new MenuShortcut(KeyEvent.VK_F)));
edit.add(it[11] = new MenuItem("다음찾기(N)",new MenuShortcut(KeyEvent.VK_N)));

CheckboxMenuItem c1 = new CheckboxMenuItem("바꾸기(R)...",true);
CheckboxMenuItem c2 = new CheckboxMenuItem("이동(G)...",true);
edit.add(c1);
edit.add(c2);
edit.addSeparator();
edit.add(it[12] = new MenuItem("모두선택",new MenuShortcut(KeyEvent.VK_A)));
edit.add(it[13] = new MenuItem("시간/날짜"));

/////////////////////////////////////////////////

sub = new Menu("제작노트");
sub.add(it[14] = new MenuItem("소스보기"));
sub.add(it[15] = new MenuItem("제 작 자"));
comment.add(it[16] = new MenuItem("주석 제거"));

for(int i=0; iaddWindowListener(this);

edit.add(sub);
mb.add(file);
mb.add(edit);
mb.add(comment);

setMenuBar(mb);
add("Center",txtP);

setSize(600,600);
setVisible(true);
}


public void actionPerformed(ActionEvent e){

java.lang.Object Mname = e.getSource();

if (Mname == it[0]) memo.Newf();
else if(Mname == it[1]) memo.Open();
else if(Mname == it[2]) memo.Save();
else if(Mname == it[3]) memo.OSave();
else if(Mname == it[4]) memo.End();
else if(Mname == it[5]) ;
else if(Mname == it[6]) ;
else if(Mname == it[7]) ;
else if(Mname == it[8]) ;
else if(Mname == it[9]) ;
else if(Mname == it[10]) ;
else if(Mname == it[11]) ;
else if(Mname == it[12]) ;
else if(Mname == it[13]) memo.TimeDate();
else if(Mname == it[14]) memo.Source();
else if(Mname == it[15]) memo.JungGu();
else if(Mname == it[16]) {
commDel skip = new commDel();
txtP.setText(skip.commprt(txtP.getText()));
}
}

public void windowClosing(WindowEvent e){
if(memo.ONs == true) memo.AlterPr(2);
System.exit(0);
}
public void windowClosed (WindowEvent e){}
public void windowDeactivated (WindowEvent e){}
public void windowDeiconified (WindowEvent e){}
public void windowIconified (WindowEvent e){}
public void windowOpened (WindowEvent e){}
public void windowActivated (WindowEvent e){}

public static void main(String[] args){
new NotePad();
}
}

/**************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////

메모장 메뉴 실행 클래스

///////////////////////////////////////////////////////////////////////////////////////
**************************************************************************************/
class FunctionMemo implements MouseListener, TextListener{


TextArea TA;
FileDialog file_o, file_s;
Frame FR;
Dialog junggu, junggu2;
Button d, d2, d3, d4;
boolean ONs = false;
int indexs =0, openNew=2;

static String name = ""; // 처음 프로그램 시작 부터 저장명령을 사용할때를 대비해서..


public FunctionMemo(TextArea TA,Frame FR){

this.TA = TA;
this.FR = FR;
this.TA.addTextListener(this);
}

/********************************************
/////////////////////////////////////////////

새파일 만들기 명령 함수

/////////////////////////////////////////////
********************************************/
void Newf(){

if(ONs == true){ // 문서에 변경여부를 판단한다.
AlterPr(1); // 변경 되었다면 true 이다.
ONs = false;
}else{
TA.setText("");

FunctionMemo.name = "";
FR.setTitle("noname.txt");
openNew = 1; // 처음 파일이 열릴때도 문서가 변경된걸로
// 알기 때문에 처음 열리는 파일에서는 막아줘야한다.
}
}

/********************************************
/////////////////////////////////////////////

파일열기 명령 함수

/////////////////////////////////////////////
********************************************/
void Open(){

if(ONs == true){
AlterPr(2);
ONs = false;
}else{
file_o = new FileDialog(FR,"파일 열기",FileDialog.LOAD);
file_o.setVisible(true);

String na = file_o.getDirectory();
String me = file_o.getFile();

if (na != null && me != null){ // 파일 다이얼로그를 연다음 취소 버튼을 눌를 경우
// 경로와 이름이 널값이 된다.
FunctionMemo.name = na+me;

FunctionFile op = new FunctionFile(na+me,1); // FunctionFile(파일경로/파일명, mode);
FR.setTitle(me); // 파일 전체경로명과 파일명을 붙여서 써준다. 1은 읽기,2는 쓰기 모드
TA.setText(op.FileRead()+""); // FileRead() 파일을 읽어옴.. 한방에 몽땅
openNew = 1;

}
}
}

/********************************************
/////////////////////////////////////////////

파일저장 명령 함수

/////////////////////////////////////////////
********************************************/
void Save(){

FunctionFile op;

if(FunctionMemo.name.equals("") || FunctionMemo.name == null){ // 기존에 열어논 파일을 그냥 저장 시킬경우와
// 그렇지 않고 새로 저장 하는 경우
file_s = new FileDialog(FR,"파일 저장",FileDialog.SAVE);
file_s.setVisible(true);

String na = file_s.getDirectory();
String me = file_s.getFile();

if (na != null && me != null){

FunctionMemo.name = na + me;

op = new FunctionFile(na+me,2);
FR.setTitle(me);
op.FileWrite(TA.getText());
}

}else{

op = new FunctionFile(FunctionMemo.name,2); // FunctionFile(파일경로/파일명, mode);
op.FileWrite(TA.getText()); // FileWrite(TextArea t); 파일을 한방에 만들어줌..
}

ONs = false;

}

/********************************************
/////////////////////////////////////////////

다른 이름으로 파일저장 명령 함수

/////////////////////////////////////////////
********************************************/
void OSave(){

String imsi_name = FunctionMemo.name;
FunctionMemo.name = "";

file_s = new FileDialog(FR,"다른 이름으로 파일 저장",FileDialog.SAVE);
file_s.setVisible(true);

String na = file_s.getDirectory();
String me = file_s.getFile();

if (na != null && me != null){

FunctionMemo.name = na+me;

FunctionFile op = new FunctionFile(FunctionMemo.name,2);

FR.setTitle(me);
op.FileWrite(TA.getText());
}else{

FunctionMemo.name = imsi_name;
}

ONs = false;

}

/********************************************
/////////////////////////////////////////////

소스보기 명령 함수

/////////////////////////////////////////////
********************************************/
void Source(){

FunctionFile op = new FunctionFile("NotePad.java",1);
TA.setText(op.FileRead()+"");
FR.setTitle("소스보기");
}


/********************************************
/////////////////////////////////////////////

제작자 보기 명령 함수

/////////////////////////////////////////////
********************************************/
void JungGu(){

junggu = new Dialog(FR,"제작자",false);

Label a,b,c,e;

a = new Label("제작한놈 : 문정구");
b = new Label("제작날짜 : 2002년 6월 19일 인가?");
e = new Label("Version : M0.5v");
c = new Label("제작장소 : 집 한쪽 귀탱이");
d = new Button(" 확 인 ");

junggu.setLayout(new GridLayout(5,1));

d.addMouseListener(this);

junggu.add(a);
junggu.add(b);
junggu.add(c);
junggu.add(e);
junggu.add(d);

junggu.setSize(225,160);
junggu.show();
}

void End(){ if(ONs == true)AlterPr(2); System.out.println(ONs); System.exit(0); }

void TimeDate(){

times start = new times();
start.timedate();
}

/********************************************
/////////////////////////////////////////////

파일관리 명령 함수

/////////////////////////////////////////////
********************************************/
void AlterPr(int indexs_sub){

junggu2 = new Dialog(FR,"경고창",false);
indexs = indexs_sub;

Label a2;

a2 = new Label("저장 하시겠습니까?");
d2 = new Button(" 예 ");
d3 = new Button("아니요");
d4 = new Button("취 소");

junggu2.setLayout(new FlowLayout());

d2.addMouseListener(this);
d3.addMouseListener(this);
d4.addMouseListener(this);

junggu2.add(a2);
junggu2.add(d2);
junggu2.add(d3);
junggu2.add(d4);

junggu2.setSize(170,100);
junggu2.show();
}

public void mouseClicked (MouseEvent e){

java.lang.Object sara = e.getSource();

if(sara == d ){

junggu.dispose();

}else if(sara == d2){

junggu2.dispose();
Save();

}else if(sara == d3){

junggu2.dispose();

if (indexs == 2){ Open(); }
else if (indexs == 1){ Newf(); }

}else if(sara == d4){

junggu2.dispose();
ONs = true;

}
}

public void mouseEntered (MouseEvent e){}
public void mouseExited (MouseEvent e){}
public void mousePressed (MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void textValueChanged (TextEvent e){

if(openNew != 1) ONs = true;
else openNew = 2;

}

}

/**************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////

파일 다루는 클래스

///////////////////////////////////////////////////////////////////////////////////////
**************************************************************************************/
class FunctionFile{

String addimsi;
String imsi;
FileReader out;
BufferedReader bis;
FileWriter ins;

public FunctionFile(String filename,int rw){

addimsi = "";
imsi = "";

try {
if(rw == 1){

out = new FileReader(filename);
bis = new BufferedReader(out);

}else if(rw == 2){

ins = new FileWriter(filename);

}

}catch(IOException err){ ;}
}

/********************************
파일읽기 함수
********************************/
String FileRead(){

try{
int i=1;

while((imsi = bis.readLine()) != null) {

addimsi += imsi+"\n";
// i++;
}

}catch(IOException err){ ;}

return addimsi;

}

/********************************
파일저장 함수
********************************/
void FileWrite(String s){

try{

ins.write(s);
ins.close();

}catch(IOException err){ ;}
}

}

/**************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////

시간,날짜 다루는 클래스

///////////////////////////////////////////////////////////////////////////////////////
**************************************************************************************/

class times extends Frame{

String s;
GregorianCalendar time_;
Label ti = new Label("잠시 기다려 주세요");
Dialog junggu;

public times(){

junggu = new Dialog(this,"시간",false);

junggu.add(ti);
junggu.setSize(130,60);
junggu.show();

junggu.addWindowListener(new close());
}

public void timedate(){

time_ = new GregorianCalendar();

s=time_.get(GregorianCalendar.MONTH)+"월 "+time_.get(GregorianCalendar.DAY_OF_MONTH)+"일 "+time_.get(10)+ " : " +time_.get(12)+ " : "+time_.get(13);

try{
Thread.sleep(1000);
}catch(Exception e){ System.out.println("에러메세지: "+e);}

ti.setText(s+"");

this.timedate();
}

}

class close extends WindowAdapter{

public void windowClosing(WindowEvent e){

// this.dispose();

}
}


/**************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////

주석을 제거하기 위한 클래스

///////////////////////////////////////////////////////////////////////////////////////
**************************************************************************************/
class commDel{

/********************************************
/////////////////////////////////////////////

들어온 문자열에서 파일명만 가져오는 함수

/////////////////////////////////////////////
********************************************/

protected String filesearch(String St){

int num = St.length();

char realfile[] = new char[num];
int i=0, j =0 ;
String s="";
System.out.println(num);

for(i = num-1; i >= 0; i--){

if(St.charAt(i) == '\\' || St.charAt(i) == '/') break;
realfile[i] = St.charAt(i);
j++;
}

s = String.valueOf(realfile,(i+1),j);
return s+".txt";
}

/********************************************
/////////////////////////////////////////////

문자열을 나눠서 첫번째 문자만 리턴하는 함수

/////////////////////////////////////////////
********************************************/

protected String commit(String bon, String ti){

StringTokenizer su = new StringTokenizer(bon, ti);
su.hasMoreElements();

try{
String ko = su.nextToken().trim();
return (ko.equals("")) ? ko : ko+"\n";
}catch(NoSuchElementException err){
return "";
}
}

/********************************************
/////////////////////////////////////////////

주석 제거 함수

/////////////////////////////////////////////
********************************************/

public String commprt(String comm){

String addimsi="";

try {
StringTokenizer su = new StringTokenizer(comm,"\n");
char ch;
boolean lock = false ;
String imsi="";
String front="";
int start = 1;

/****************첫째 와일문 시작***************/
while(su.hasMoreElements()){

imsi = su.nextToken();
int num = imsi.length();
int var=0;
int i =0;

// System.out.println(imsi); // 버그 찾기위해서.. 넣어둠

/****************첫번째 이프문 시작***************/
if(num > 1){ // 아무것도 없는 빈줄 가리기
// 밑에 while문에서 빈줄은 값이 없기때문에
// 스트링 인덱스 ,길이 0 이란 에러가 난다.

/****************두번째 와일문 시작***************/
while((ch = imsi.charAt(i)) != '\0'){

// for(i=0; num>i; i++){

// ch = imsi.charAt(i);

// lock값을 같이 꼭 비교해줘야 스트링 인덱스 에러가 안나다.
// 이유는 / 문자가 마지막에 발견되면 뒤에 +1은 에러가 나고
// /문자가 처음에 발견될 경우는 -1이 에러가 생긴다.

/****************두번째 이프문 시작***************/
if(lock == false && ch == '/' && imsi.charAt(i+1) == '*'){

// 밑에 같은 주석이 나올경우 앞에 문자열 더하기
// data = new int[3] /* 주석
front = commit(imsi,"/*");
if(!(front.equals(""))){ addimsi += front; front = ""; }

// 밑에 같은 주석이 나올경우 한라인 끝내기
// /* 주석 */

imsi.trim();
if(imsi.charAt(num-2) == '*' && imsi.charAt(num-1) == '/'){ var = 1; break; }

lock = true;
break;

}else if(lock == true && imsi.charAt(num-1) == '*'){

var = 1;
break;

}else if(lock == true && ch == '*' && imsi.charAt(i+1) == '/'){

lock = false;
var = 1;
break;

// 주석문 앞에 소스가 있을경우와 밑에 같이 //주석처리를 문자로 할경우
// 한문장이 다 지워지지 않게 하기 위해서..

}else if(lock == false && ch == '/' && imsi.charAt(i+1) == '/'){
if(imsi.charAt(i+2) == '\'' || imsi.charAt(i+2) == '\"'){ }
else{
var = 1;
front = commit(imsi,"//");
addimsi += front;
front = "";
break;
}
}
/*******************두번째 이프문 끝********************/


if(num-1 == i) break; i++; // while문 쓸때..

}
/*******************첫번째 와일문 끝********************/

}else{ ; } /*******************첫번째 이프문 끝********************/

if(lock != true && var != 1) { addimsi += start+"\t"+imsi+"\n"; start++;}
var = 0;


} /*******************두번째 와일문 끝********************/


}catch(Exception err){ addimsi = "파일이 없습니다."; }

return addimsi;
}
}
번호 제목 글쓴이 날짜 조회 수
31 MSN 주소를 알려주세요. [3] MrGeek 2006.09.16 85
30 [소스첨부] 인자값 변경. 청연 2006.09.14 59
» 주석제거 프로그램 (수정) 청연 2006.09.13 128
28 ★C언어 처음 하시는분들 보세요.. [3] 청연 2006.09.13 202
27 2. Direct로 그림그리기! [1] file 케이코냥이 2006.09.03 166
26 한국 위키백과를 추천합니다. MrGeek 2006.09.01 84
25 1. DirectX 8.0 sdk 해보기. file 케이코냥이 2006.08.28 154
24 C#.NET 유용한 포인터 사용법(1) - 스택기반의 배열 괴짜인간 2006.08.14 124
23 VB/VC 키코드 리스트 [1] 알닭 2006.04.23 202
22 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -4- [2] 울스M 2006.02.08 215
21 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -3- [2] 울스M 2006.02.08 160
20 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -2- [5] 울스M 2006.02.08 173
19 [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -1- [2] 울스M 2006.02.08 558
18 [비법은 아니지만] 비주얼 베이직에 이스터 에그 발견! [1] StartCraft 2006.02.06 287
17 질문이요. [2] 블랙호크 2006.01.06 125
16 비트맵&브레인스토밍&프로그래밍의 도(道) [1] 성령의분노 2006.01.04 307
15 자료구조 (3) - 링크리스트 [3] 성령의분노 2006.01.01 209
14 자료구조 (2) - Queue[민프레스 강의정리] [1] 성령의분노 2005.12.31 150
13 자료구조 (1) - Stack [민프레스 강의정리] 성령의분노 2005.12.30 321
12 [VB] [CD-ROM] CD-ROM 열고 닫기 StartCraft 2005.08.21 351