文本编辑器源文件(java语言)

/版权所有helj
import java.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.inside(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,Object 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<(i*fh)))
        {
            index= i;
            repaint();
        }
        return super.mouseMove(evt,x,y);
    }

    public boolean mouseDown(Event evt,int x,int y)
    {
        if(y>0&&y<fh)
        {
            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<(2*fh)))
        {
            fr.eitem.enable(false);
            fr.eitem1.enable(false);
            fr.eitem3.enable(false);
            fr.eitem2.enable(true);
            hide();
            return true;
        }
        if((y>(2*fh))&&(y<(3*fh)))
        {
            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<(4*fh)))
        {
            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;
       
        GridBagLayout 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<items1.length;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<items2.length;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<items3.length;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.getSelectedIndex()==-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<totle;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.liney+sc.offsety-1;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<totle;i++)
                text[i]= text[i+1];
            keycusor(-1,0);
        }
        if(de>0)
            for(int i= cus.index;i<totle;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<totle;i++)
                text[i]= text[i+end+2];
        }
        if(sel.count>0)
        {
            int end= sel.index+1;
            for(int i= end;i<totle;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);
}
//--------------------------------------
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值