文字編輯器原始檔(java語言) (轉)

worldblog發表於2007-12-09
文字編輯器原始檔(java語言) (轉)[@more@]/版權所有helj
import .awt.*;
import java.io.*;
import java.util.*;
//W_color;C_str;C_file;C_back;W_find;W_fond

interface I_Method
{
  public void setQuit();
  public void setfont(Font f);
  public void setcolor(Color c);
  public void Find(String find,int dire);
}



class D_color extends Dialog
{
  private Button OK,Cancel;
  private I_Method mp;
  private Rectangle test;

  private Color current= Color.black;
  private Color []colors;
  private Color []colors1;
  private Color []colors2;
  private int strlen= 250;

  public D_color(Frame fr,I_Method mp,int x,int y)
  {
  super(fr,"調色盤",true);
  this.mp= mp;
  colors= new Color[strlen];
  colors1= new Color[strlen];
  colors2= new Color[strlen];
  for (int i = 0; i < strlen; i++)
  {
  float h = ((float)i)/((float)strlen);
colors[i] = new Color(Color.HSBtoRGB(h,1.0f,1.0f));
  }
  for (int i = 0; i < strlen; i++)
  {
  float h = ((float)i)/((float)strlen);
colors1[i] = new Color(Color.HSBtoRGB(1.0f,h,1.0f));
  }
  for (int i = 0; i < strlen; i++)
  {
  float h = ((float)i)/((float)strlen);
colors2[i] = new Color(Color.HSBtoRGB(1.0f,1.0f,h));
  }
 
  setLayout(null);
  OK= new Button("確定");
  Cancel= new Button("取消");
  OK.reshape(320,100,80,30);
  add(OK);
  Cancel.reshape(320,150,80,30);
  add(Cancel);  
  test= new Rectangle(0,0,300,250);
  reshape(x/2-210,y/2-140,420,280);
  show();
  }

  public void update(Graphics g)
  {
  int y= 0;
  for (int i = 0; i < strlen; i++)
  {
  g.setColor(colors[i]);
  g.fillRect(0,y,100,1);
  y+=1;
  }
  y= 0;
  for (int i = 0; i < strlen; i++)
  {
  g.setColor(colors1[i]);
  g.fillRect(100,y,100,1);
  y+=1;
  }
  y= 0;
  for (int i = 0; i < strlen; i++)
  {
  g.setColor(colors2[i]);
  g.fillRect(200,y,100,1);
  y+=1;
  }
  g.setColor(current);
  g.fillRect(330,30,60,60);
  }
 
  public void paint(Graphics g)
  {
  update(g);
  }

  public boolean mouseMove(Event evt,int x,int y)
  {
  if(test.ins(x,y))
  {
  Graphics g1= getGraphics();
  //g1.drawImage(back,oldx,oldy);
  //g1.clipRect(x-3,y-3,6,6);
  g1.setColor(Color.white);
  g1.drawArc(x-3,y-3,6,6,60,360);
  g1.drawLine(x-3,y,x+3,y);
  g1.drawLine(x,y-3,x,y+3);
  repaint();
  //oldx= x-3;
  //oldy= y-3;
  return true;
  }
  return false;
  }


  public boolean mouseDown(Event evt,int x,int y)
  {
  if((x>=0)&&(x<=100))
  {
  current= colors[y];
  System.out.println(y);
  getGraphics().setColor(current);
  getGraphics().fillRect(330,30,60,60);
  return true;
  }
  if((x>100)&&(x<=200))
  {
  current= colors1[y];
  getGraphics().setColor(current);
  getGraphics().fillRect(330,30,60,60);
  return true;
  }
  if((x>200)&&(x<=300))
  {
  current= colors2[y];
  getGraphics().setColor(current);
  getGraphics().fillRect(330,30,60,60);
  return true;
  }
  return false;
  }

  public boolean action(Event evt, arg)
  {
  if(evt.target instanceof Button)
  {
  if(evt.target== OK)
  {
  mp.setcolor(current);
  dispose();
  return true;
  }
  if(evt.target== Cancel)
  {
  dispose();
  return true;
  }
  }
  return super.action(evt,arg);
  }
}

class W_quick extends Window
{
  MainF fr;
  private Dimension sz;
  private int w,h;
  private int fw,fh;
  private FontMetrics fm;
  private int index=0;

  public W_quick(MainF fr,I_Method qm,int x,int y)
  {
  super(fr);
  this.fr= fr;
  setBackground(Color.lightGray);
 
  }

  public void show(int x,int y)
  {
  repaint();
  reshape(x,y,100,160);
  show();
  }

  private void draw_uplines(Graphics g,int x,int y,int w1,int h1)
{
  g.setColor(Color.white);
  g.drawLine(x,y,x+w1-1,x);
  g.drawLine(x,y,x,y+h1-1);

  g.setColor(Color.black);
  g.drawLine(x+w1-1,y-1,x+w1-1,y+h1-1);
  g.drawLine(x+w1-2,y+1,x+w1-2,y+h1-2);
  g.drawLine(x+1,y+h-2,x+w1-2,y+h1-2);
  //  g.drawLine(x,y+h1-1,x+w1-1,y+h1-1);
  //  g.setColor(Color.black);
  //  g.drawLine(x,y+h1-1,x+w1-1,y+h1-1);
 
}
 
  public void paint(Graphics g)
  {
  sz= size();
  w= sz.width;
  h= sz.height; 
  //  g.setFont(Ffont);
  fm= g.getFontMetrics();
  fh=fm.getHeight();
  fw= fm.charWidth('C');
  g.setColor(Color.gray);
  g.drawRect(10,(index-1)*fh+6,w-20,fh);
  //  g.setColor(Color.lightGray);
  //  g.drawRect(0,0,w,h);
  draw_uplines(g,1,1,w-1,h-1);
  g.setColor(Color.black);
  g.drawString("Cut",13,fh);
  g.drawString("Copy",13,2*fh);
  g.drawString("Paste",13,3*fh);
  g.drawString("Delete",13,4*fh);
  }

  public boolean mouseMove(Event evt,int x,int y)
  {
  for(int i=1;i<=4;i++)
  if((y>(i-1)*fh)&&(y  {
  index= i;
  repaint();
  }
  return super.mouseMove(evt,x,y);
  }

  public boolean mouseDown(Event evt,int x,int y)
  {
  if(y>0&&y  {
  fr.current_t.dels();
  fr.eitem.enable(false);
  fr.eitem1.enable(false);
  fr.eitem3.enable(false);
  fr.eitem2.enable(true);
  hide();
  return true;
  }
  if(y>fh&&(y  {
  fr.eitem.enable(false);
  fr.eitem1.enable(false);
  fr.eitem3.enable(false);
  fr.eitem2.enable(true);
  hide();
  return true;
  }
  if((y>(2*fh))&&(y  {
  fr.current_t.adds();
  fr.eitem2.enable(false);
  fr.eitem.enable(false);
  fr.eitem1.enable(false);
  fr.eitem3.enable(false);
  hide();
  return true;
  }
  if((y>(3*fh))&&(y  {
  fr.current_t.dels();
  fr.eitem3.enable(false);
  fr.eitem.enable(false);
  fr.eitem1.enable(false);
  fr.eitem2.enable(false);
  hide();
  return true;
  }
  return super.mouseDown(evt,x,y);
  }
}

class ptest extends Panel
{
  String test= "ABCDabcd";
  D_font ff;

  public ptest(D_font ff)
  {
  this.ff= ff;
  repaint();
  }

  private void draw_downlines(Graphics g,int x,int y,int w,int h)
{
  g.setColor(Color.white);
  g.drawLine(x+1,y+h-1,x+w-1,y+h-1);
  g.drawLine(x+w-1,y+h-1,x+w-1,y+1);
 
  g.setColor(Color.black);
  g.drawLine(x,y,x,y+h);
  g.drawLine(x+1,y+1,x+1,y+h-1);
  g.drawLine(x,y,x+w,y);
  g.drawLine(x+1,y+1,x+w-1,y+1);
}

  public void rep()
  {
  repaint();
  }
 
  public void paint(Graphics g)
  {
  Dimension sz= size();
  Point pt= location();
g.setColor(Color.darkGray);
g.drawRect(0,0,sz.width-2,sz.height-2);

g.setColor(Color.white);
g.drawLine(1,1,1,sz.height-3);
g.drawLine(1,1,sz.width-3,1);

g.drawLine(0,sz.height-1,sz.width-1,sz.height-1);
g.drawLine(sz.width-1,0,sz.width-1,sz.height-1);

  draw_downlines(g,15,10,sz.width-30,sz.height-20);
  g.clipRect(16,11,sz.width-31,sz.height-21);
  g.setColor(Color.black);
  g.setFont(ff.bf);
  g.drawString(test,20,sz.height-21);
  }
}



class D_font extends Dialog
{
  public Font bf;
  private Button OK,Cancel;
  private Label l1,l2,l3;
  private String items1[]={"Helvetica","Courier","TimesRoman","Dialog"};
  private String items2[]={"PLAIN","BOLD","PLAIN+BOLD","ITALIC","BOLD+ITALIC"};
  private int[] style= new int[5];
  private String items3[]={"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};
  private TextField f1,f2,f3;
  private List ll1,ll2,ll3;
  private ptest test;
  private I_Method im;

  public void init()
  {
  style[0]= Font.PLAIN;
  style[1]= Font.BOLD;
  style[2]= Font.PLAIN+Font.BOLD;
  style[3]= Font.ITALIC;
  style[4]= Font.BOLD+Font.ITALIC;
  }

  public D_font(Frame fr,I_Method qm,int x,int y)
  {
  super(fr,"字型",true);
  init();
  setFont(new Font("TimesRoman",Font.PLAIN,14));
  im= qm;
 
  GriagLayout gridBag= new GridBagLayout();
  GridBagConstraints c= new GridBagConstraints();
  setLayout(gridBag);
  c.insets.left= 4;
  c.insets.right= 4;
  c.insets.bottom= 1;
  c.insets.top= 1;
 
  l1= new Label("字型:",Label.LEFT);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=0;
  c.gridy=0;
  c.gridwidth=2;
  c.gridheight =1;
  gridBag.setConstraints(l1,c);
  add(l1);

  l2= new Label("字型樣式:",Label.LEFT);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=2;
  c.gridy=0;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(l2,c);
  add(l2);

  l3= new Label("大小:",Label.LEFT);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=3;
  c.gridy=0;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(l3,c);
  add(l3);

  OK= new Button("確定");
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=4;
  c.gridy=1;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(OK,c);
  add(OK);

  f1= new TextField();
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=0;
  c.gridy=1;
  c.gridwidth=2;
  c.gridheight =1;
  gridBag.setConstraints(f1,c);
  add(f1);

  f2= new TextField();
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=2;
  c.gridy=1;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(f2,c);
  add(f2);

  f3= new TextField();
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=3;
  c.gridy=1;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(f3,c);
  add(f3);

  Cancel= new Button("取消");
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=4;
  c.gridy=2;
  c.gridwidth=1;
  c.gridheight =1;
  gridBag.setConstraints(Cancel,c);
  add(Cancel);

  ll1= new List();
  for(int i=0;i  ll1.addItem(items1[i]);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 1.0;
  c.weighty= 1.0;
  c.gridx=0;
  c.gridy=2;
  c.gridwidth=2;
  c.gridheight =7;
  gridBag.setConstraints(ll1,c);
  add(ll1);

  ll2= new List();
  for(int i1=0;i1  ll2.addItem(items2[i1]);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=2;
  c.gridy=2;
  c.gridwidth=1;
  c.gridheight =7;
  gridBag.setConstraints(ll2,c);
  add(ll2);

  ll3= new List();
  for(int i2=0;i2  ll3.addItem(items3[i2]);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 0.0;
  c.weighty= 0.0;
  c.gridx=3;
  c.gridy=2;
  c.gridwidth=1;
  c.gridheight =7;
  gridBag.setConstraints(ll3,c);
  add(ll3);

  test= new ptest(this);
  c.gridwidth= GridBagConstraints.REMAINDER;
  c.fill= GridBagConstraints.BOTH;
  c.weightx= 1.0;
  c.weighty= 1.0;
  c.gridx=0;
  c.gridy=9;
  c.gridwidth=5;
  c.gridheight =4;
  gridBag.setConstraints(test,c);
  add(test);

  reshape(x/2-210,y/2-140,420,280);
  show();
  }

  public boolean action(Event evt,Object arg)
  {
  if(evt.target instanceof Button)
  {
  if(evt.target== OK)
  {
  if(ll1.getedIndex()==-1)
  ll1.select(0);
  if(ll3.getSelectedIndex()==-1)
  ll3.select(0);
  if(ll2.getSelectedIndex()==-1)
  ll2.select(0);
  int size= Integer.parseInt(items3[ll3.getSelectedIndex()]);
  bf=new Font(items1[ll1.getSelectedIndex()],style[ll2.getSelectedIndex()],size);
  im.setfont(bf);
  dispose();
  return true;
  }
  if(evt.target== Cancel)
  {
  dispose();
  return true;
  }
  }

  if(evt.target instanceof List)
  {
  if(ll1.getSelectedIndex()==-1)
  ll1.select(0);
  if(ll3.getSelectedIndex()==-1)
  ll3.select(0);
  if(ll2.getSelectedIndex()==-1)
  ll2.select(0);
  f1.setText(ll1.getSelectedItem());
  f2.setText(ll2.getSelectedItem());
  f3.setText(ll3.getSelectedItem());
 
  int size= Integer.parseInt(items3[ll3.getSelectedIndex()]);
  bf=new Font(items1[ll1.getSelectedIndex()],style[ll2.getSelectedIndex()],size);
  test.rep();
  return true;
  }
  return super.action(evt,arg);
  }
}


class W_quit extends Dialog
{
  Button OK,Cancel;
  I_Method im;

  public W_quit(Frame fr,I_Method qm)
  {
  super(fr,"Java文字");
  //setBackground(Color.lightGray);
  setFont(new Font("TimesRoman",Font.BOLD,16));
  im= qm;
  OK= new Button("確定");
  Cancel= new Button("取消");

  Panel pp= new Panel();
  pp.add(OK);
  pp.add(Cancel);
  add("South",pp);
  add("Center",new Label("Ready to Quit",1));
  reshape(100,100,200,100);
  }

  public boolean action(Event evt,Object arg)
  {
  if(evt.target== OK)
  {
  im.setQuit();
  dispose();
  return true;
  }else
  if(evt.target== Cancel)
  {
  dispose();
  return true;
  }else
  return super.action(evt,arg);
  }
}

class screen
{
  public int[] length;
  public int left,right,up,down;
  public int offsetx=0,offsety=0;
  public int w=0,h=0;
  public int maxline;

  public screen()
  {
  length= new int[300];
  for(int i=0;i<300;i++)
  {
  length[i]= 0;
  }
  left= 0;
  up= 0;
  }

  public void setmax(int x,int y)
  {
  down= y;
  right= x;
  }
}

class cusor
{
  public int cusorx,cusory;//當前游標的座標
  public int index;//當前游標對應的偏移
  public int linex,liney;//行列號首地址為1,1linex
  public int oldx,oldy;
  public int w,h;

  public cusor(int y)
  {
  index= 0;
  cusorx= 3;
  cusory= y;
  linex= liney= 0;
  }

  public void paint(Graphics g)
  {
  g.setColor(Color.white);
  g.drawLine(oldx,oldy,oldx,oldy-h+2);  
  g.setColor(Color.black);
  g.drawLine(cusorx,cusory,cusorx,cusory-h+2);
  oldx= cusorx;
  oldy= cusory;
  }
}

class select
{
  public char[] sels;
  public int count;// 選中字元的個數
  public int index;//當前游標對應的偏移
  public int linex,liney;

  public select()
  {
  linex= liney= count= 0;
  sels= new char[1000];
  }
}

//橫座標起始為3
class P_area extends Canvas
{
  public screen sc;
  public cusor cus;
  public select sel;
  private MainF fr;
  public String filename,filedir;
  private Font Ffont= null;
  private Color Bcolor= Color.black;
  private FontMetrics fm;
  private Dimension sz;
 
  private int fh,fw;
  private int paint_x,paint_y;//用於寫字元 
  public int totle= 0;//字元總數
  private int lcount=0;

  public boolean border= true;//游標是否在邊界
//  private boolean scroll= false;
  public boolean select= false;
  public boolean selold= false;//選中後重畫螢幕
  public boolean bfind= false;

  private String findtext= null; 
  private int[] findindex;
  private int findcount=0;
  private char[] text;
 
  public P_area(MainF fr,Font cuf,Color cuc,String fn,String fd)
  {
  this.fr= fr;
  setBackground(Color.white);
  sz= size();  
  Ffont= cuf;
  setFont(cuf);
  cus= new cusor(sz.height);
  sc= new screen();
  sel= new select();
  Bcolor= cuc;
  filename= fn;
  filedir= fd;
  text= new char[5000];
  findindex= new int[100];
  repaint();
  }

  private void draw_downlines(Graphics g,int x,int y,int w,int h)
{
  g.setColor(Color.white);
  g.drawLine(x+1,y+h-1,x+w-1,y+h-1);
  g.drawLine(x+w-1,y+h-1,x+w-1,y+1);
 
  g.setColor(Color.black);
  g.drawLine(x,y,x,y+h);
  g.drawLine(x+1,y+1,x+1,y+h-1);
  g.drawLine(x,y,x+w,y);
  g.drawLine(x+1,y+1,x+w-1,y+1);
}

  //開啟已存在的
  public void setname(String fn,String fd)
  {
  filename= fn;
  filedir= fd;
  }

  public void open(String line)
  {
  //findtext= line;
  line.getChars(0,line.length()-1,text,totle);
  totle+= line.length();
  //  text[totle]= 'n';
  //  totle++;
  //  sc.length[lcount]= line.length()+1;
  //  lcount++;
  repaint();
  }

  public String getText()
  {
  char[] ret= new char[totle];
  for(int i=0;i  ret[i]= text[i];
  return (new String(ret));
  }

  public void movecusor(int x,int y)
  {
  cus.linex= (int)((x-3)/cus.w);
  cus.liney= (int)((y-3*fh)/cus.h)+1;
  int i=0;
  cus.index=0;
  for(;i< cus.liney+sc.offsety-1;i++)
  cus.index+= sc.length[i];
  cus.index+=cus.linex-1+sc.offsetx;
  cus.cusorx= (cus.linex-1)*cus.w+3;
  cus.cusory= cus.liney*cus.h;
  cus.paint(getGraphics());
  }
 
  public void keycusor(int x,int y)
  {
  cus.linex+= x;
  cus.liney+= y;
  cus.cusorx+= x*cus.w;
  cus.cusory+= y*cus.h;
  int i=0;
  cus.index=0;
  for(;i  cus.index+= sc.length[i];
  cus.index+=cus.linex-1+sc.offsetx;
  cus.paint(getGraphics());
  }

  public void add(char ch)
  {
  if(totle==0)
  totle= 1;
  for(int i= totle;i>=cus.index;i--)
  text[i]= text[i-1];
  text[cus.index]= ch;
  totle++;
  sc.length[cus.liney]+= 1;
 
  repaint();
  if(ch=='n')
  {
  cus.linex= 1;
  cus.liney+= 1;
  cus.cusorx= 3;
  cus.cusory= cus.liney*cus.h;
  cus.index++;
  }else
  keycusor(1,0);
  }

  public void adds()
  {
  totle+= sel.count;
  int i;
  for(i= totle-1;i>(cus.index+sel.count);i--)
  text[i]= text[i-sel.count];
  for(int j= sel.count;j>0;j--,i--)
  text[i]= sel.sels[j-1];
  sel.count= 0;
  repaint();
  }
 
  public void del(int de)
  {
  if(de<0)
  {
  for(int i= cus.index-1;i  text[i]= text[i+1];
  keycusor(-1,0);
  }
  if(de>0)
  for(int i= cus.index;i  text[i]= text[i+1];
  totle--;
  repaint();
  }

  public void dels()
  {
  if(sel.count<0)
  {
  int end= -sel.count;
  for(int i= sel.index;i  text[i]= text[i+end+2];
  }
  if(sel.count>0)
  {
  int end= sel.index+1;
  for(int i= end;i  text[i-sel.count]= text[i];
  }
  totle-= sel.count;
  //sel.count= 0;
  repaint();
  }

  public void selrep()
  {
  draw(getGraphics());
  }

  public void drag(int x,int y)
  {
  sel.linex= (int)((x-3)/cus.w);
  sel.liney= (int)((y-3*fh)/cus.h)+1;
  int i=0;
  sel.index=0;
  for(;i< sel.liney+sc.offsety-1;i++)
  sel.index+= sc.length[i];
  sel.index+=sel.linex-1+sc.offsetx;
  sel.count= sel.index- cus.index+1;
  if(sel.index!= cus.index)
  {
  select= true;
  selold= true;
  repaint();
  }
  }

  private void drawselect(Graphics g)
  {
  int ji= 0;
  paint_x= 3-(int)(sc.offsetx*cus.w);
  paint_y= fh-(int)(sc.offsety*fh);
  for(int i=0;i< totle;i++)
  {
  if(text[i]=='n')
  {
  paint_x = 3-(int)(sc.offsetx*cus.w);
  paint_y+=cus.h;
  i++;
  }
  fw= fm.charWidth(text[i]);
  if(sel.index>cus.index)
  {
  if((i< totle)&&(i<=sel.index)&&(i>=cus.index))
  {
  sel.sels[ji]= text[i];
  ji++;
  g.setColor(Color.blue);
  g.fillRect(paint_x,paint_y-fh,fw+1,fh);
  g.setColor(Color.white);
  g.drawChars(text,i,1,paint_x,paint_y);
  }
  }else
  if((i< totle)&&(i>=sel.index)&&(i<=cus.index))
  {
  sel.sels[ji]= text[i];
  ji++;
  g.setColor(Color.blue);
  g.fillRect(paint_x,paint_y-fh,fw+1,fh);
  g.setColor(Color.white);
  g.drawChars(text,i,1,paint_x,paint_y);
  }

  paint_x+= fw;
  }
  }

  public void home()
  {
  cus.linex= 1;
  int i=0;
  cus.index=0;
  for(;i< cus.liney+sc.offsety-1;i++)
  cus.index+= sc.length[i];
  cus.index+=cus.linex-1+sc.offsetx;
  cus.cusorx= 3;
  cus.paint(getGraphics());
  }

  public void end()
  {
  cus.linex= sc.length[cus.liney-1]-1;
  int i=0;
  cus.index=0;
  for(;i< cus.liney+sc.offsety-1;i++)
  cus.index+= sc.length[i];
  cus.index+=cus.linex-1+sc.offsetx;
  cus.cusorx= (cus.linex-1)*cus.w+3;
  cus.paint(getGraphics());
  }

  public void pagedown()
  {
  if(sc.maxline>2*sc.h)
  {
  sc.offsety+= sc.h;
  fr.vert.setValue(sc.offsety);
  draw(getGraphics());
  fr.vert.setValue(sc.offsety);
  }
  }

  public void pageup()
  {
  if((sc.offsety-sc.h)>=0)
  {
  sc.offsety-=sc.h;
  draw(getGraphics());
  fr.vert.setValue(sc.offsety);
  }
  }

  public void scrollpaint(int x1,int x2)
  {
  sc.offsetx= x1;
  sc.offsety= x2;
  //  getGraphics().translate(-x1,-x2);
  draw(getGraphics());
  }
  public void setFont(Font cuf)
  {
  Ffont= cuf;
  //paint= true;
  repaint();
  }

  public void setColor(Color col)
  {
  Bcolor= col;
  //  paint= true;
  repaint();
  }

  public void rep()
  {
  repaint();
  }
 
  private void draw(Graphics g)
  {
  findtext= new String(text,0,totle);
  int findi= findcount;
  int aa= 0;//用於記錄starti
  int c1= 0;//記錄行的數目
  int c2= 0;//記錄每行的位元組數
  int c3= 0; //最大列數
  g.setFont(Ffont);
  g.setColor(Color.white);
  g.fillRect(3,2,sz.width,sz.height);
  g.setColor(Bcolor);
 
  paint_x= 3-(int)(sc.offsetx*cus.w);
  paint_y= fh-(int)(sc.offsety*fh);
  for(int i=0;i< totle;i++)
  {
  if(text[i]=='n')
  {
  paint_x = 3-(int)(sc.offsetx*cus.w);
  paint_y+=cus.h;
  //i++;
  sc.length[c1]= c2+1;
  c1++;
  if(c2>c3)
  c3= c2;
  c2= 0;
  }else  
  if(i< totle)
  {
  fw= fm.charWidth(text[i]);
  g.setColor(Bcolor);
  g.drawChars(text,i,1,paint_x,paint_y);
  if(i== findindex[findi]&&bfind)
  {
  if(findi>0)
  findi--;
  g.setColor(Color.blue);  
  g.fillRect(paint_x,paint_y-fh+2,fw+1,fh);
  g.setColor(Color.white);
  g.drawChars(text,i,1,paint_x,paint_y);
 
  }
 
  paint_x+= fw;
  c2++;
  }
  }
  c1+= 1;
  sc.maxline= c1;
  cus.paint(g);
  if(c3> sc.w)
  fr.horz.setValues(0,sc.w,0,c3-sc.w);
  if(c1> sc.h)
  fr.vert.setValues(0,sc.h,0,c1-sc.h);
  }

  public void update(Graphics g)
  {
  sz= size();
  g.setColor(Bcolor);
  g.setFont(Ffont);
  fm= g.getFontMetrics();
  cus.h= fh= fm.getHeight();
  cus.w= fw= fm.charWidth('A');
  sc.h= (int)((sz.height-3)/fh)+1;
  sc.w= (int)((sz.width-3)/fw)+1;

  draw_downlines(g,0,0,sz.width,sz.height);
  //g.clipRect(3,2,sz.width,sz.height);
  if(select)
  {
  drawselect(g);
  select= false;
  }else
  draw(g);
  }

  public void paint(Graphics g)
  {
  update(g);
  }

  public boolean mouseEnter(Event evt,int x,int y)
  {
  fr.setCursor(2);
  return true;
  }

  public boolean mouseExit(Event evt,int x,int y)
  {
  fr.setCursor(0);
  return true;
  }

  public void find(String find,int dire)
  {
  bfind= true;
  findcount =0;
  String sss= findtext;
  for(int i=0;i<100;i++)
  findindex[i]= 0;
  int j=0;
  while(true)
  {
  if(sss.indexOf(find)==-1)
  break;
  findindex[j]= sss.lastIndexOf(find);
  sss= sss.substring(0,findindex[j]);
  j++;
  findcount++;
  }
  repaint();
  selold= true;
  }

}


public class MainF extends Frame implements I_Method
{
private W_quick Lshow;
 
  private FileDialog openDialog;
private FileDialog saveDialog;

  public Scrollbar horz,vert;
  private MenuBar menuBar;
  private Panel File_panel,Back_p;
  private Panel Back_panels[];
 
  private int screenw,screenh;
  private Color Fcolor= Color.black;
  private Font Ffont= new Font("TimesRoman",Font.PLAIN,14);
  private int Fwidth,Fheight;
  private int[] bookmarks= new int[20];
  //**************
  public P_area current_t;
  private int i1;
  private int iii=0;
  private boolean insert= false;
  boolean begin= false;//用於標誌是否開始選中
  boolean end= false;
  private int sel1= 0;
  private int sel2= 0;

  MenuItem eitem;
  MenuItem eitem1;
  MenuItem eitem2;
  public MenuItem eitem3;

MainF(String title)
{
super(title);

Font font= new Font("TimesRoman",Font.BOLD,20);
setFont(font);
  setBackground(Color.lightGray);
  horz= new Scrollbar(Scrollbar.HORIZONTAL,0,0,0,0);
  vert= new Scrollbar(Scrollbar.VERTICAL,0,0,0,0);

  //  show();
  addMenu();
  init();
  Lshow= new W_quick(this,this,0,0);
 
  openDialog= new FileDialog(this,"Open File...",FileDialog.LOAD);
saveDialog= new FileDialog(this,"Save File...",FileDialog.SAVE);
  }

  private void init()
  {
  setLayout(new BorderLayout());
  File_panel= new Panel();
  File_panel.setBackground(Color.lightGray);
  Panel pp= new Panel();
  pp.setLayout(new BorderLayout(2,2));
  current_t= new P_area(this,Ffont,Fcolor,"aa","aa");
  pp.add("Center",current_t);
  pp.add("South",horz);
  pp.add("East",vert);

  add("South",File_panel);
  add("Center",pp);

  Dimension screen_size= Toolkit.getDefaultToolkit().getScreenSize();
  screenw=screen_size.width;
  screenh= screen_size.height-16;
  reshape(16,16,screen_size.width-32,screen_size.height-32);
  show();
  }

  private void addMenu()
  {
  menuBar= new MenuBar();
setMenuBar(menuBar);

Menu menu= new Menu("File");
Menu menu1= new Menu("Edit");
  Menu menu2= new Menu("Option");
menuBar.add(menu);
menuBar.add(menu1);
  menuBar.add(menu2);

MenuItem fitem= new MenuItem("New");
menu.add(fitem);
MenuItem fitem1= new MenuItem("Open");
menu.add(fitem1);
MenuItem fitem2= new MenuItem("Close");
menu.add(fitem2);
  menu.addSeparator();
  MenuItem fitem3= new MenuItem("Save");
  menu.add(fitem3);
  MenuItem fitem4= new MenuItem("Save As");
  menu.add(fitem4);
  menu.addSeparator();
  MenuItem fitem5= new MenuItem("Quit");
  menu.add(fitem5);

 
 
  menu1.add(new MenuItem("Undo"));
  menu1.add(new MenuItem("Redo"));
  menu1.addSeparator();
  eitem= new MenuItem("Cut");
menu1.add(eitem);
  eitem.enable(false);
eitem1= new MenuItem("Copy");
eitem1.enable(false);
  menu1.add(eitem1);
eitem2= new MenuItem("Paste");
menu1.add(eitem2);
  eitem2.enable(false);
  menu1.addSeparator();
  eitem3= new MenuItem("Delete");
  menu1.add(eitem3);
  eitem3.enable(false);
  MenuItem eitem6= new MenuItem("Bookmark");
  menu1.add(eitem6);
  menu1.addSeparator();
  MenuItem eitem4= new MenuItem("Find");
  menu1.add(eitem4);  
  MenuItem eitem5= new MenuItem("Repace");
  menu1.add(eitem5);

  MenuItem oitem= new MenuItem("Color");
menu2.add(oitem);
MenuItem oitem1= new MenuItem("Font");
menu2.add(oitem1);

  }

public void setQuit()
  {
  this.dispose();
  System.exit(0);
  }

  public void setfont(Font f)
  {
  Ffont= f;
  current_t.setFont(f);
  repaint();
  }

  public void setcolor(Color c)
  {
  Fcolor= c;
  current_t.setColor(c);
  repaint();
  }
 
  public void paint(Graphics g)
{
  if(Ffont!= null)
  g.setFont(Ffont);

}

  public void read(String fn,String fd)
{
current_t.setname(fn,fd);
  String line= null;
  String input= null;
File s= new File(fd,fn);
  FileInputStream in= null;
  DataInputStream datain= null;

  try
{
in= new FileInputStream(s);
datain = new DataInputStream(in);
}catch(Exception e)
{
System.out.println("Unable to open file");
return;
}

  try{
while((line=datain.readLine())!= null)
{
  line+= "n";
  if(input== null)
  input= line;
  else
  input+= line;
  }
  }catch(IOException e){
  System.out.println("Error in reading file");
  }
  current_t.open(input);

try{
in.close();
}catch(IOException e){
System.out.println("e");
}


public void write(String fn,String fd)
{
FileOutputStream out= null;
  File s= new File(fd,fn);

try{
  out= new FileOutputStream(s);
  }catch(Exception e)
  {
  System.out.println("Unable to open file");
  return;
  }
PrintStream psOut=new PrintStream(out);
psOut.print(current_t.getText());///
try{
out.close();
}catch(IOException e){
System.out.println("e");
}
}

public boolean keyDown(Event evt,int key)
{
  System.out.println(key);
  switch(key)
{
  case 1004://up
  current_t.keycusor(0,-1);
  return true;
  case 1005://down
  current_t.keycusor(0,1);
  return true;
  case 1006:
  current_t.keycusor(-1,0);
  return true;
  case 1007:
  current_t.keycusor(1,0);
  return true;  
  case 8:
  current_t.del(-1);
  return true;
  case 127:
  current_t.del(1);
  return true;
  case 1001://end
  current_t.end();
  return true;

  case 1000://home
  current_t.home();
  return true;
  case 1002:
  current_t.pageup();
  return true;
  case 1003:
  current_t.pagedown();
  return true;
  }
  //  if(!current_t.border)
  //   current_t.addchar((char)evt.key);
  //  else
  current_t.add((char)evt.key);
  return true;
  }

  public boolean mouseDown(Event evt,int x,int y)
  {
  //****單擊右鍵*******************不完整
  eitem.enable(false);
  eitem1.enable(false);
  eitem3.enable(false);
  current_t.bfind= false;
 
  if((evt.modifiers&Event.META_MASK)>0)
  {
  Lshow.show(evt.x,evt.y);
  return false;
  }else
  {
  Lshow.hide();
  begin= true;
  current_t.movecusor(evt.x,evt.y);
  if(current_t.selold)
  {
  current_t.selold= false;
  current_t.selrep();
  }
  }
  if(end)
  {
  //  current_t.rep();
  //  current_t.paint =true;
  end= false;
  }
  return false;
  }

  public boolean mouseDrag(Event evt,int x,int y)
  {
  eitem.enable(true);
  eitem1.enable(true);
  eitem3.enable(true);
  current_t.drag(evt.x,evt.y);
  //}
  return true;
  }
 
  public boolean handleEvent(Event evt)
  {
  if(evt.id== Event.WINDOW_DESTROY)
{
  W_quit aa= new W_quit(this,this);
  aa.show();
  return true;
  }
  switch(evt.id)
{
case 601:
  case 602:
  case 603:
  case 604:
  case 605:
  //current_t.offsety= (vert.getValue());
  //   current_t.offsetx= (horz.getValue());
  //   current_t.paint= true;
  //   current_t.rep();
  current_t.scrollpaint(horz.getValue(),vert.getValue());
 
  vert.setValue(current_t.sc.offsety);
  horz.setValue(current_t.sc.offsetx);
  return true;
  }


  return super.handleEvent(evt);
  }

  public boolean action(Event evt,Object arg)
{
String filename;
  if(evt.target instanceof MenuItem)
  {
  if(evt.arg.equals("New"))
  {
  return true;
  }
  if(evt.arg.equals("Open"))
  {
  openDialog.show();
  String fn= openDialog.getFile();
  String filedir= openDialog.getDirectory();
  read(fn,filedir);
  return true;
  }
  if(evt.arg.equals("Save"))
  {
  write(current_t.filename,current_t.filedir);
  return true;
  }
  if(evt.arg.equals("Save As"))
  {
  saveDialog.show();
  filename= saveDialog.getFile();
  String filedir= openDialog.getDirectory();
  write(filename,filedir);
  return true;
  }
  if(evt.arg.equals("Quit"))
  {
  System.exit(0);
  }
  if(evt.arg.equals("Cut"))
  {
  current_t.dels();
  eitem.enable(false);
  eitem1.enable(false);
  eitem3.enable(false);
  eitem2.enable(true);
  return true;
  }
  if(evt.arg.equals("Paste"))
  {
  current_t.adds();
  eitem2.enable(false);
  eitem.enable(false);
  eitem1.enable(false);
  eitem3.enable(false);
  return true;
  }
  if(evt.arg.equals("Copy"))
  {
  eitem.enable(false);
  eitem1.enable(false);
  eitem3.enable(false);
  eitem2.enable(true);
  return true;
  }
  if(evt.arg.equals("Delete"))
  {
  current_t.dels();
  eitem3.enable(false);
  eitem.enable(false);
  eitem1.enable(false);
  eitem2.enable(false);
  return true;
  }
  if(evt.arg.equals("Close"))
  {
  current_t.totle= 0;
  current_t.rep();
  return true;
  }
  if(evt.arg.equals("Find"))
  {
  new outPanel(this);
  return true;
  }
if(evt.arg.equals("Font"))
{
new D_font(this,this,screenw,screenh);
return true;
}
if(evt.arg.equals("Color"))
{
new D_color(this,this,screenw,screenh);
return true;
}
}
/*else if(evt.target instanceof Button)
{
} */
return false;
}

  public void Find(String find,int dire)
  {
  current_t.find(find,dire);
  System.out.println(find);
  }

  public static void main(String[] args)
  {
  MainF ff= new MainF("文字編譯器");
  }
}

class outPanel extends Dialog
{
  MainF fr;
  Label lbname; //name label
  TextField tfname; //entry field
  outlinePanel psex; //two outlined panels]
  CheckboxGroup cbsex;
  Checkbox up,down,boxc; //2 radios
  Button OK, Cancel; //two pushbuttons
  GridBagConstraints gbc;
  GridBagLayout gbl;
  int dire= 1;

  public outPanel(MainF fr)
  {
  super(fr,"查詢",true);
  this.fr= fr;
  setFont(new Font("Helvetica", Font.PLAIN, 12));
  setBackground(Color.lightGray);
  gbl =new GridBagLayout();
  gbc = new GridBagConstraints();
  setLayout(gbl);
  gbc.ipadx = 5; //make buttons wider
  gbc.ipady = 3; //make buttons higher
  gbc.insets.left =6;
  gbc.insets.right =6;
  gbc.insets.bottom =4;
  gbc.insets.top =4;
  gbc.weightx =1;
  gbc.weighty =1;
 
  lbname = new Label("查詢目標:"); //label
  add_component(lbname, 0,0,1,1);
  tfname = new TextField(20); //text entry field
  add_component(tfname, 1,0,3,1);
  //panel with two buttons for sex
  boxc= new Checkbox("區分大小寫");
  add_component(boxc, 0,2,1,1);
  psex = new outlinePanel(); //first panel
  add_component(psex, 1,1,3,2); //insert in layout
  //put two radio buttons in panel
  up = psex.addCheckbox("向上", false);
  down = psex.addCheckbox("向下", true);
  psex.resize(148,53);
  //add two command buttons to bottom
  OK = new Button("找下一個"); //buttons at bottom
  Cancel = new Button("取消");
  add_component(OK,4,0,1,1);
  add_component(Cancel,4,2,1,1);
  reshape(100,100, 380,146);
  show();
}
//--------------------------------------
private void add_component(Component c, int x, int y, int w, int h)
{
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight =h;
add(c);
gbl.setConstraints(c, gbc);
}
//--------------------------------------
public boolean action(Event evt, Object arg)
{
  if(evt.target== OK)
  {
  String ss= tfname.getText();
  if(boxc.getState())
  {
  ss.toLowerCase();
  fr.Find(ss,dire);
  }else
  fr.Find(ss,dire);
  }
  if (evt.target == Cancel)
  {
  dispose();
  return true;
  }
  if(evt.target== up)
  {
  dire=-1;  
  }
  if(evt.target== down)
  {
  dire= 1;
  }
  if(evt.target== boxc)
  {
  }
  return super.action(evt, arg);
}
}
//*///=======================================
class outlinePanel extends Panel
{
CheckboxGroup cbg;
int yposn;
Vector cblist;
//--------------------------------------
public outlinePanel()
{
super();
cbg = new CheckboxGroup(); //for radio buttons
setLayout(null);
yposn = 3;
cblist = new Vector();
}
//--------------------------------------
public void reshape(int x, int y, int w, int h)
{
super.reshape(x,y,w,h);
for (int i=0; i< cblist.size(); i++)
{
Component c = (Component)cblist.elementAt(i);
c.reshape(c.location().x, c.location().y, w-6, c.size().height);
}
}
//--------------------------------------
public Component add(Component c)
{
super.add(c);
return c;
}
//--------------------------------------
public Checkbox addCheckbox(String s, boolean checked)
{
Checkbox cb = new Checkbox(s, cbg, checked);
add(cb);
cblist.addElement(cb);
cb.reshape(3, yposn, 50, 12);
yposn += 15;
return cb;
}
//--------------------------------------
public void paint(Graphics g)
{
Dimension sz = size();
Point pt = location();
g.setColor(Color.darkGray); // graw rectangle
g.drawRect(0, 0, sz.width-2, sz.height-2);
//outline gray rectangle with 2 white inner lines
g.setColor(Color.white);
g.drawLine(1, 1, sz.width-3, 1);
g.drawLine(1, 1, 1, sz.height-3);
//and two white outer lines
g.drawLine(0,sz.height-1,sz.width-1,sz.height-1);
g.drawLine(sz.width-1, 0, sz.width-1, sz.height-1);
}
//--------------------------------------
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990057/,如需轉載,請註明出處,否則將追究法律責任。

相關文章