Παρασκευή 30 Σεπτεμβρίου 2022

Java Compiler001 not yet ready !! heheheh

 

paste,compile,run and read















/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package javacompiler001;


import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Cursor;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridLayout;

import java.awt.LayoutManager;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ComponentListener;

import java.awt.event.ContainerListener;

import java.awt.event.FocusListener;

import java.awt.event.HierarchyBoundsListener;

import java.awt.event.HierarchyListener;

import java.awt.event.InputMethodListener;

import java.awt.event.KeyListener;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.awt.event.MouseWheelListener;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.StringTokenizer;

import java.util.Vector;

import javax.swing.JComponent;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.JTabbedPane;

import javax.swing.JTextArea;

import javax.swing.JTree;

import javax.swing.SwingUtilities;

import javax.swing.event.AncestorListener;

import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeModel;

import javax.swing.tree.TreePath;


/**

 *

 * @author jimak

 */

public class JavaCompiler001 extends Jp implements TreeSelectionListener{


    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        // TODO code application logic here

        JavaCompiler001 test=new JavaCompiler001();


        

    }

    static Dimension scr=Toolkit.getDefaultToolkit().getScreenSize();

    public static JFrame njfr(Component c){

        JFrame out=new JFrame();

        out.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        out.setBounds(0,0,scr.width/2,scr.height/2);

        out.getContentPane().add(BorderLayout.CENTER,c);

        out.setVisible(true);

        return out;

    }

    

    JFileChooser jfch=new JFileChooser();

    JMenuBar jmb=new JMenuBar();

    JMenuItem jmiOpenFile=new JMenuItem("Open File");

    

    

    Dmtn openedView=new Dmtn("openedView");

    DefaultTreeModel openedModel=new DefaultTreeModel(openedView);

    JTree openedJtr=new JTree(openedModel);

    JScrollPane openedJscr=new JScrollPane(openedJtr);

    

    

    KlassLoader packView=new KlassLoader("packView");

    DefaultTreeModel packModel=new DefaultTreeModel(packView);

    JTree packJtr=new JTree(packModel);

    JScrollPane packJscr=new JScrollPane(packJtr);

    

    Dmtn extView=new Dmtn("extView");

    DefaultTreeModel extModel=new DefaultTreeModel(extView);

    JTree extJtr=new JTree(extModel);

    JScrollPane extJscr=new JScrollPane(extJtr);

    

    JSplitPane jsplPackExt=new JSplitPane(0,packJscr,extJscr);

    JSplitPane jsplOpened=new JSplitPane(0,openedJscr,jsplPackExt);

    

    

    

    

    

    

    

    JTextArea jtaViewClassOriginal=new JTextArea();

    JScrollPane jscrViewClassOriginal=new JScrollPane(jtaViewClassOriginal);

    Jp jpViewClassOriginal=new Jp();

    Jp jpViewClassOriginalHolder=new Jp(new JLabel("ViewClassOriginal"),0,jscrViewClassOriginal,2);

    

    JTextArea jtaNoComments=new JTextArea();

    JScrollPane jscrNoComments=new JScrollPane(jtaNoComments);

    Jp jpNoComments=new Jp();

    Jp jpNoCommentsHolder=new Jp(new JLabel("NoComments"),0,jscrNoComments,2);

    

    JTextArea jtaOneSpacePerMultiSpacesTabsLines=new JTextArea();

    JScrollPane jscrOneSpacePerMultiSpacesTabsLines=new JScrollPane(jtaOneSpacePerMultiSpacesTabsLines);

    Jp jpOneSpacePerMultiSpacesTabsLines=new Jp();

    Jp jpOneSpacePerMultiSpacesTabsLinesHolder=new Jp(new JLabel("OneSpacePerMultiSpacesTabsLines"),0,jscrOneSpacePerMultiSpacesTabsLines,2);

    

    

    

    JTree jtrBlocks=new JTree();

    JScrollPane jtrBlocksJscr=new JScrollPane(jtrBlocks);

    Jp jpBlocks=new Jp(jtrBlocksJscr);

    Jp jpBlocksHolder=new Jp(new JLabel("Blocks"),0,jpBlocks,2);

    

    JTabbedPane jtpViewClass=new JTabbedPane();

    

    

    JSplitPane jsplMain=new JSplitPane(1,jsplOpened,jtpViewClass);

    

    JFrame jfr=null;

    

    public JavaCompiler001() {

        super();

        

        jsplMain.setResizeWeight(0.5);

        jsplOpened.setResizeWeight(0.5);

        jsplPackExt.setResizeWeight(0.5);

        

        

        jtpViewClass.addTab("0", jpViewClassOriginalHolder);

        jtpViewClass.addTab("1", jpNoCommentsHolder);

        jtpViewClass.addTab("2", jpOneSpacePerMultiSpacesTabsLinesHolder);

        jtpViewClass.addTab("3", jpBlocksHolder);

    

        jtpViewClass.setSelectedIndex(3);

        

        cad(jsplMain);

        

        jfch.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

        jmb.add(jmiOpenFile);

        nad(jmb);

        

        

        jmiOpenFile.addActionListener(e->jmiOpenFile(e));

        openedJtr.addTreeSelectionListener(this);

        

        //null params means open private frame

        jfr=njfr(this);

        jfr.setTitle("Trying to learn compiling java files");

    

    }


    void jmiOpenFile(ActionEvent e){

        int apro=jfch.showOpenDialog(this);

        if(apro==JFileChooser.APPROVE_OPTION){

            openFile(jfch.getSelectedFile());

        }

    }

    public void openFile(File f){

        if(f!=null){

            if(jfr!=null){jfr.setTitle("Start reading "+f.getName());}

            Vector<FileSrcClass> newLoads=new Vector<>();

            openingFiles(f,newLoads);

            int newLoadsCount=newLoads.size();

            if(newLoadsCount>0){

                openedJtr.setSelectionPath(newLoads.get(0).ntp());

                System.out.println("Now ...just filling some imports ....and stop writing code for today....(because next is difficult!)");

                int newImports=0;

                int pendingImports=0;

                int totalImports=0;

                int newUserClasses=0;

                int pendingUserClasses=0;

                int i=0;

                while(i<newLoadsCount){

                    FileSrcClass fsc=newLoads.get(i);

                    

                    int importsCount=fsc.vImports.getChildCount();

                    if(importsCount>0){

                        int imi=0;

                        while(imi<importsCount){

                            Dmtn importNode=fsc.vImports.dmtn(imi);

                            String imps=importNode.getUserString();

                            try{

                                Class cl=Class.forName(imps);

                                Klass klimp=new Klass(cl);

                                Klass klFound=packView.loadKlass(klimp);

                                if(klimp==klFound){

                                    importNode.crad(klimp);//to remember if want after

                                    openedModel.nodeStructureChanged(importNode);

                                    packModel.nodeStructureChanged((Dmtn)klFound.dyn.getUserObject());

                                    ++newImports;

                                }

                                else{

                                    //System.out.println("already loaded import thing");

                                    ++totalImports;

                                }

                                

                            }catch(ClassNotFoundException cnfe){

                                ++pendingImports;

                            }

                            ++imi;

                        }

                    }

                    

                    

                    int classesCount=fsc.vClasses.getChildCount();

                    if(classesCount>0){

                        String pack="";

                        if(fsc.vPacks.getChildCount()>0){

                            pack=fsc.vPacks.dmtn(0).getUserString();

                        }

                        int cci=0;

                        while(cci<classesCount){

                            Dmtn clno=fsc.vClasses.dmtn(cci);

                            Klass kl=new Klass(clno.getUserString(), pack);

                            Klass klFound=packView.loadKlass(kl);

                            if(kl==klFound){

                                clno.crad(klFound);//to remember if want after

                                openedModel.nodeStructureChanged(clno);

                                packModel.nodeStructureChanged((Dmtn)klFound.dyn.getUserObject());

                                ++newUserClasses;

                            }

                            else{

                                //System.out.println("Already have this???? "+kl.getNameJava());

                                ++pendingUserClasses;

                            }

                            ++cci;

                        }

                    }

                    

                    ++i;

                }

                

                packModel.nodeStructureChanged(packView);

                JOptionPane.showMessageDialog(this,"Java Files read : "+newLoadsCount

                        + "\nnew Imports (from jdk) : "+newImports+" / "+totalImports+" totals"

                        + "\npending imports (from user or errors) :"+pendingImports

                        + "\n\n"

                        + "\nnew UserClasses on packView :"+newUserClasses

                        + "\nreacalled user classes :"+pendingUserClasses

                        + "\n"

                        + "\n\n...To be a real compiler we want too much work !!! (from Ockt 2022!)"

                ,"jimakoskx.blogspot/hotmail.com",JOptionPane.INFORMATION_MESSAGE);

                

            }

            else{

                JOptionPane.showMessageDialog(this, "Sorry,,couldnt found any .java File to read");

            }

        }

    }

    private void openingFiles(File f,Vector<FileSrcClass> newLoads){

        if(f!=null){

            if(f.isDirectory()){

                File fs[]=f.listFiles();

                if(fs!=null){

                    int i=0;

                    while(i<fs.length){

                        openingFiles(fs[i],newLoads);

                        ++i;

                    }

                }

            }

            else{

                String fname=f.getName();

                int ind=fname.lastIndexOf(".java");

                if(ind>-1){

                    openingJavaFile(f,newLoads);

                }

            }

        }

    }

    

    private void openingJavaFile(File f,Vector<FileSrcClass> newLoads){

        if(f!=null){

            if(jfr!=null){jfr.setTitle("Start reading "+f.getName());}

            //System.out.println(""+f);

            FileSrcClass newSrc=new FileSrcClass(f);

            newLoads.add(newSrc);

            newSrc.readFileBuffer();

            newSrc.parseFile();

            openedView.add(newSrc);

            openedModel.nodeStructureChanged(openedView);

        }

    }

    

    private void viewResultsOf(FileSrcClass fsc){

        jtaViewClassOriginal.setText(fsc.sb.toString());

        jtaNoComments.setText(fsc.sbNoComments.toString());

        jtaOneSpacePerMultiSpacesTabsLines.setText(fsc.sbNoLinesNoSpacesNoTabsOutOfStrings.toString());

        jtrBlocks.setModel(new DefaultTreeModel(fsc.blocks));

    }


    @Override

    public void valueChanged(TreeSelectionEvent e) {

        TreePath tp=e.getNewLeadSelectionPath();

        if(tp!=null){

            Object lpc=tp.getLastPathComponent();

            Object src=e.getSource();

            if(src==openedJtr){

                if(lpc instanceof FileSrcClass){

                    viewResultsOf((FileSrcClass)lpc);

                }

            }

        }

    }

    

    

    


    

    

    

    

    

    

}



class FileSrcClass extends Dmtn{


    

    public static final String strPackage="package";

    public static final String strImport="import";

    public static final String strClass="class";

    public static final String strExtends="extends";

    public static final String strImplements="implements";

    public static String searchForImport(String lineok){

        String out=null;

        lineok=lineok.trim();//no space or tabs

        int ind=lineok.indexOf(strImport);

        if(ind==0){

            int after=strImport.length()+1;

            int inder=lineok.indexOf(";",after);

            if(inder>after){//[package a;]

                String possible=lineok.substring(after,inder).trim();

                String maybeWithStar=possible;

                if(possible.endsWith("*")){

                    possible=possible.substring(0,possible.length()-1);

                }

                if(isJavaIdentifierFullClassName(possible)){

                    out=maybeWithStar;

                }

            }

        }

        return out;

    }

    public static String searchForPackage(String lineok){

        String out=null;

        lineok=lineok.trim();//no space or tabs

        int ind=lineok.indexOf(strPackage);

        if(ind==0){

            int after=strPackage.length()+1;

            int inder=lineok.indexOf(";",after);

            if(inder>after){//[package a;]

                String possible=lineok.substring(after,inder).trim();

                if(isJavaIdentifierFullClassName(possible)){

                    out=possible;

                }

            }

        }

        return out;

    }


    /**

     * will return a node with simpleclassname as userobject

     * <br> that will have 

     * <br>first child with 0.length or extendeing class string

     * <br>second child with 0.length or implementing classes with komma 

     */

    public static Dmtn searchForClass(String lineok){

        Dmtn out=null;

        lineok=lineok.trim();//no space or tabs

        int ind=lineok.indexOf(strClass);

        if(ind>-1){

            int extind=lineok.indexOf(strExtends);

            int implind=lineok.indexOf(strImplements);

            int agiind=lineok.indexOf("{");

            int end=lineok.length();

            if(extind>-1){end=extind;}

            else if(implind>-1){end=implind;}

            else if(agiind>-1){end=agiind;}

            String possible=lineok.substring(ind+strClass.length(),end).trim();

            //System.out.println("possible class : "+possible);

            if(isJavaIdentifierSimpleClassName(possible)){

                out=new Dmtn(possible);

                Dmtn outExt=out.crad("");

                Dmtn outImpls=out.crad("");

                

                

                if(extind>-1){

                    end=lineok.length();

                    if(implind>-1){end=implind;}

                    else if(agiind>-1){end=agiind;}

                    String extMaybe=lineok.substring(extind+strExtends.length(),end).trim();

                    if(isJavaIdentifierFullClassName(extMaybe)){

                        outExt.setUserObject(extMaybe);

                    }

                    else{

                        outExt.setUserObject("?"+extMaybe);

                    }

                }

                

            }

            

        }

        return out;

    }

    

    public static boolean isJavaIdentifierSimpleClassName(String s){

        return isJavaIdentifier(s, false);

    }

    public static boolean isJavaIdentifierFullClassName(String s){

        return isJavaIdentifier(s, true);

    }

    public static boolean isJavaIdentifier(String s,boolean dotAllowed){

        int l=s.length();

        //if(l==0){return false;}

        int i=0;

        char ch;

        boolean prevdot=true;

        while(i<l){

            ch=s.charAt(i);

            if(prevdot && !Character.isJavaIdentifierStart(ch)){

                return false;

            }


            if(!Character.isJavaIdentifierPart(ch)){

                if(ch!='.' || !dotAllowed || prevdot){

                    return false;

                }

                prevdot=true;

            }

            else{

                prevdot=false;

            }

            ++i;

        }

        return !prevdot;

    }

    

    File fsrc;

    StringBuffer sb=new StringBuffer();

    StringBuffer sbNoComments=new StringBuffer();

    StringBuffer sbNoLinesNoSpacesNoTabsOutOfStrings=new StringBuffer();

    

    Dmtn blocks=new Dmtn();

    

    Dmtn vPacks=new Dmtn("packages");

    Dmtn vImports=new Dmtn("imports");

    Dmtn vClasses=new Dmtn("classes");

    public FileSrcClass(File f){

        super(f);

        fsrc=f;

        add(vPacks);

        add(vImports);

        add(vClasses);

    }

    static int counter=0;

    public FileSrcClass(String textOfSomeFile){

        super(new File("testFileData"+(counter++)));

        fsrc=null;

        add(vPacks);

        add(vImports);

        add(vClasses);

        sb.append(textOfSomeFile);

    }

    void readFileBuffer(){

        sb.delete(0, sb.length());

        FileInputStream fin=null;

        try{

            fin=new FileInputStream(fsrc);

            int reads=fin.read();

            while(reads>-1){

                sb.append((char)reads);

                reads=fin.read();

            }

            fin.close();

            fin=null;

        }catch(IOException io){

            io.printStackTrace();

        }

        if(fin!=null){

            try{fin.close();}catch(IOException io){}

        }        

        //readFileBuffer();

        //System.out.println(sb);

    }

    

    void parseFile(){

        

        

        


        parseNoCommentsBuffer();

        //System.out.println(sbNoComments);

        parseNoLinesNoSpacesNoTabsOutOfStringsBuffer();

        //System.out.println(""+sbNoLinesNoSpacesNoTabsOutOfStrings);

        parseBlocks();

        //new Jfr(new Jtr(blocks).jscr());

        vPacks.removeAllChildren();

        vImports.removeAllChildren();

        vClasses.removeAllChildren();

        

        int i=0;

        int l=blocks.getChildCount();

        boolean searchImport=true,searchClass=true;

        String bls;

        while(i<l){

            Dmtn bl=blocks.dmtn(i);

            bls=bl.getUserString();

            searchImport=true;

            searchClass=true;

            if(vPacks.getChildCount()==0){

                String packMaybe=searchForPackage(bls);

                if(packMaybe!=null){

                    vPacks.crad(packMaybe);

                    searchImport=false;

                    searchClass=false;

                }

            }

            if(searchImport){// && vClasses.getChildCount()==0){

                String importMaybe=searchForImport(bls);

                if(importMaybe!=null){

                    vImports.crad(importMaybe);

                    searchClass=false;

                }

            }

            if(searchClass){

                Dmtn classMaybe=searchForClass(bls);

                if(classMaybe!=null){

                    vClasses.add(classMaybe);

                }

            }

            

            ++i;

        }

        

    }

    int readBlocksErrorsUnknown=0;

    void parseBlocks(){

        blocks.removeAllChildren();

        blocks.setUserObject("");

        Dmtn it=blocks.crad("");

        int i=0,l=sbNoLinesNoSpacesNoTabsOutOfStrings.length();

        char ch;

        String buf="";

        boolean outOfString=true;

        while(i<l){

            ch=sbNoLinesNoSpacesNoTabsOutOfStrings.charAt(i);

            if(ch=='\"' && !(i>0 && sbNoComments.charAt(i-1)=='\\')){

                outOfString=!outOfString;

            }

            if(outOfString){

            

                if(ch==';'){

                    buf+=ch;

                    it.setUserObject(buf);

                    buf="";

                    Dmtn nn=it.dmtnPar().crad(buf);

                    it=nn;


                }

                else if(ch=='{'){

                    buf+=ch;

                    it.setUserObject(buf);

                    buf="";

                    Dmtn nn=it.crad(buf);

                    it=nn;


                }

                else if(ch=='}'){

                    //buf+=ch;

                    it.setUserObject(buf);


                    it=it.dmtnPar();

                    while(it!=null && !it.getUserString().endsWith("{")){

                        it=it.dmtnPar();

                    }

                    if(it==null){

                        System.out.println("error at "+fsrc);

                        ++readBlocksErrorsUnknown;

                        return;

                    }

                    buf=it.getUserString()+"}";

                    it.setUserObject(buf);

                    buf="";

                    it=it.dmtnPar().crad(buf);

                }

                else{buf+=ch;}

            }else{buf+=ch;}

            ++i;

        }

    }


    void parseNoCommentsBuffer(){

        sbNoComments.delete(0, sbNoComments.length());

        int i=0;

        int l=sb.length();

        char ch;

        while(i<l){

            ch=sb.charAt(i);

            if(ch=='/' && (i+1<l)){

                int nexti=i+1;

                char nextch=sb.charAt(nexti);

                if(nextch=='/'){

                    //System.out.println("skipping till end of line");

                    i=nexti+1;

                    while(i<l){

                        ch=sb.charAt(i);

                        if(ch=='\n'){

                            break;

                        }

                        ++i;

                    }

                    --i;

                }

                else if(nextch=='*'){

                    //System.out.println("skipping util next */");

                    i=nexti+2;

                    while(i<l){

                        ch=sb.charAt(i);

                        if(ch=='/' && sb.charAt(i-1)=='*'){

                            break;

                        }

                        ++i;

                    }

                }

                else{

                    sbNoComments.append(ch);

                }

            }

            else{

                sbNoComments.append(ch);

            }

            

            ++i;

        }

        

    }

    

    void parseNoLinesNoSpacesNoTabsOutOfStringsBuffer(){

        sbNoLinesNoSpacesNoTabsOutOfStrings.delete(0, sbNoLinesNoSpacesNoTabsOutOfStrings.length());

        int i=0;

        int l=sbNoComments.length();

        char ch;

        boolean prevSLT=false;

        boolean outOfString=true;

        while(i<l){

            ch=sbNoComments.charAt(i);

            if(ch=='\"' && !(i>0 && sbNoComments.charAt(i-1)=='\\')){

                outOfString=!outOfString;

            }

            if(outOfString&&(ch==' '||ch=='\n'||ch=='\t')){

                if(prevSLT){

                    //System.out.println("skipping");

                    ++i;

                    while(i<l){

                        ch=sbNoComments.charAt(i);

                        if(!(ch==' '||ch=='\n'||ch=='\t')){

                            break;

                        }

                        ++i;

                    }

                    prevSLT=false;

                    --i;

                }

                else{

                    //put space if space or line or tab....

                    sbNoLinesNoSpacesNoTabsOutOfStrings.append(' ');

                    prevSLT=true;

                }

            }

            else{

                sbNoLinesNoSpacesNoTabsOutOfStrings.append(ch);

                prevSLT=false;

            }

            

            ++i;

        }

        

    }

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    void analyseLine(String line){

        if(line!=null){

            int linelen=line.length();

            if(linelen>6){//[class A]

                if(vPacks.getChildCount()==0){

                    String packfoundnow=searchForPackage(line);

                    if(packfoundnow!=null){

                        vPacks.crad(packfoundnow);

                        System.out.println(""+packfoundnow);

                        return;

                    }

                }

                //continue search for import 

            }

        }

        String test="a                                       b";

    }

    

}///end class



class KlassLoader extends Dmtn{

    

    Hashtable<String, Klass> NameJavaToKlass=new Hashtable<>();


    public KlassLoader() {

    }


    public KlassLoader(Object userObject) {

        super(userObject);

    }

    

    

    

    

    public boolean hasKlass(Class cl){

        return hasKlass(new Klass(cl));

    }

    public boolean hasKlass(Klass kl){

        return hasKlass(kl.getNameJava());

    }

    public boolean hasKlass(String NameJava){

        return NameJavaToKlass.get(NameJava)!=null;

    }

    public Klass loadKlass(Klass kl){

        String NameJava=kl.getNameJava();

        Klass found=NameJavaToKlass.get(NameJava);

        if(found!=null){

            return found;

        }

        return loadingKlass(kl, NameJava);

    }

    public Klass loadKlass(Class cl){

        return loadKlass(new Klass(cl));

    }

    

    

    

    private Klass loadingKlass(Klass kl,String NameJava){

        NameJavaToKlass.put(NameJava, kl);

        Dmtn klassPackView=sbadDeep(new StringTokenizer(NameJava,"."));

        klassPackView.dyn=new Dmtn(kl);

        kl.dyn=new Dmtn(klassPackView);

        return kl;

    }


}

class Klass extends Dmtn{

    Class clfor;

    Klass(Class cl){

        super();

        clfor=cl;

    }

    String sn="",pn="";

    Klass(String simpleName,String packageName){

        super();

        sn=simpleName;

        pn=packageName;

    }

    

    

    public String getName(){

        String out="";

        if(clfor!=null){

            out=clfor.getName();

        }

        else{

            if(pn.length()>0){

                out=pn+"."+sn;

            }

            else{

                out=sn;

            }

        }

        return out;

    }

    public String getNameJava(){

        return getName()+"~";

    }

    public String getSimpleName(){

        String out="";

        if(clfor!=null){

            out=clfor.getSimpleName();

        }

        else{

            out=sn;

        }

        return out;

    }

    public String getSimpleNameJava(){

        return getSimpleName()+"~";

    }

    

    public String getPackageName(){

        String out="";

        if(clfor!=null){

            Package pack=clfor.getPackage();

            if(pack!=null){

                out=clfor.getPackage().getName();

            }

        }

        else{

            out=pn;

        }

        return out;

    }

    


}



class Dmtn extends DefaultMutableTreeNode{

    /**

     * This 'dyn'amic data field is for programmer purposes

     * <br>A private field for programmer used in many cases

     * <br>Many of this cases is for search/and add methods

     * <br>like sbad

     * <br>if sbad finds the node

     * <br> we can know if its ours if we just check

     * <br>DmtnNode mynew=new Dmtn("basicsearch/order key")

     * <br>if(root.sbad(mynew).dyn!=null) say(Already exists)

     * <br>else mynew.dyn=new Dmtn(with all my app spesific data)

     * <br>with just 2 lines of code

     * <br>-----

     * <br>

     */

    public Dmtn dyn=null;

    /**

     * constructs the dyn(uoOfDyn)

     * @param uoOfDyn

     * @return this

     */

    public Dmtn qdyno(Object uoOfDyn){

        dyn=new Dmtn(uoOfDyn);

        return this;

    }   

    /**

     * Assigns to dyn

     * @param dynToBeAssigned

     * @return this

     */

    public Dmtn qdyn(Dmtn dynToBeAssigned){

        dyn=dynToBeAssigned;

        return this;

    }   


    public Dmtn() {

    }


    public Dmtn(Object userObject) {

        super(userObject);

    }


    public Dmtn(Object userObject, boolean allowsChildren) {

        super(userObject, allowsChildren);

    }

    public String getUserString(){

        return userObject+"";

    }

    

    public Dmtn cr(){

        return new Dmtn();

    }

    /**

     * Will be use from crad

     * <br>Not yet decide 

     * if must use setObject(uo) or protected userObject=uo

     * @param uo

     * @return 

     */

    public Dmtn cr(Object uo){

        Dmtn out=cr();

        out.setUserObject(uo);//or this?

        //out.userObject=uo;//or this?

        return out;

    }

    /**

     * @param uo

     * @return the new child 

     */

    public Dmtn crad(Object uo){

        Dmtn out=cr(uo);

        add(out);

        return out;

    }

    /**

     * Create and adds a new child

     * @param uo

     * @return this to be used continiuslly if need

     */

    public Dmtn cradThis(Object uo){

        crad(uo);

        return this;

    }

    /**

     * 

     * @param uo

     * @param index

     * @return the new child inserted 

     */

    public Dmtn crin(Object uo,int index){

        Dmtn out=cr(uo);

        insert(out,index);

        return out;

    }

    /**

     * 

     * @param uo

     * @param index

     * @return this

     */

    public Dmtn crinThis(Object uo,int index){

        crin(uo,index);

        return this;

    }

    

    

    

    

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

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

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

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

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

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

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

    /**

     * 

     * @param index

     * @return (Dmtn)getChildAt(index)

     */

    public Dmtn dmtn(int index){

        return (Dmtn)getChildAt(index);

    }

    

    public Dmtn dmtnLast(){

        return dmtn(getChildCount()-1);

    }

    

    

    

    public TreePath ntp(){return new TreePath(getPath());}

     /**

     * 

     * @return this or the last parent 

     */

    public Dmtn dmtnRoot(){

        Dmtn out=this;

        Dmtn parit=out.dmtnPar();

        while(parit!=null){

            out=parit;

            parit=out.dmtnPar();

        }

        return out;

    }

    

    

    public Dmtn dmtnPar(){return (Dmtn)parent;}

    public Dmtn qtoparadd(Dmtn parentToBeAdded){parentToBeAdded.add(this);return this;}

    

    public Dmtn firstDmtnAssignableUp(Class cl){

        Dmtn it=this;

        while(it!=null){

            if(cl.isAssignableFrom(it.getClass())){

                return (Dmtn)it;

            }

            it=(Dmtn)it.parent;

        }

        return null;

    }

    /**

     * @param index

     * @return ++index;index=-index;

     */

    public static int sbdecode(int index){++index;index=-index;return index;}

    /**

     * @param index

     * @return index=-index;--index;

     */

    public static int sbencode(int index){index=-index;--index;return index;}

    

    /**

     * 

     * @param toCompare

     * @return index founde OR 

     * <br>the negative-1 insertion position

     * <br> if(sbi()<0){no Found and we can insert at -(++sbi)}

     * <br> else found on position sbi

     */

    public int sbi(Comparable toCompare){

        int lo = 0,hi = getChildCount() - 1,mid,d;Dmtn it;

        while (lo <= hi) {mid = lo + (hi - lo) / 2;

            it=(Dmtn)getChildAt(mid);

            d=toCompare.compareTo(it.userObject);

            if(d<0){ hi = mid - 1;}

            else if (d>0){lo = mid + 1;}

            else {return mid;}

        }return sbencode(lo);

    }

    /**

     * @param toCompare

     * @return the founded or null

     */

    public Dmtn sbn(Comparable toCompare){

        int index=sbi(toCompare);

        if(index>-1){

            return dmtn(index);

        }

        return null;

    }

    public Dmtn sbad(Comparable findOrAdd){

        int foundAt=sbi(findOrAdd);

        if(foundAt<0){return crin(findOrAdd, sbdecode(foundAt));}

        else{return dmtn(foundAt);}

    }

    public Dmtn sbadDeep(Enumeration en){

        Dmtn out=this;

        while(en.hasMoreElements()){

            out=out.sbad((Comparable)en.nextElement());

        }

        return out;

    }

    


    public Dmtn sbadAllowEquals(Comparable findOrAdd){

        int foundAt=sbi(findOrAdd);

        if(foundAt<0){return crin(findOrAdd, sbdecode(foundAt));}

        else{

            return dmtn(foundAt).crad(findOrAdd);

        }

    }


}









class Jp extends javax.swing.JPanel{


    public static Object bl(int code04){

        if(code04<1){return BorderLayout.NORTH;}

        else if(code04<2){return BorderLayout.WEST;}

        else if(code04<3){return BorderLayout.CENTER;}

        else if(code04<4){return BorderLayout.EAST;}

        return BorderLayout.SOUTH;

    }

    

    public void pushWest(JComponent ccFreeClientPropsBorderLayoutClass){

        pushBordered(1,ccFreeClientPropsBorderLayoutClass);

    }

    public void pushEast(JComponent ccFreeClientPropsBorderLayoutClass){

        pushBordered(3,ccFreeClientPropsBorderLayoutClass);

    }

    public void pushBordered(Integer bl0134,JComponent ccFreeClientPropsBorderLayoutClass){

        int i=0;

        JComponent foundWithPropertyAtWest=null;

        Component comps[]=getComponents();

        while(i<comps.length){

            if(comps[i] instanceof JComponent){

                JComponent jc=(JComponent)comps[i];

                Object prop=jc.getClientProperty(BorderLayout.class);

                if(bl0134.equals(prop)){foundWithPropertyAtWest=jc;break;}

            }

            ++i;

        }

        if(foundWithPropertyAtWest!=null){

            if(foundWithPropertyAtWest instanceof Jp){

                ((Jp)foundWithPropertyAtWest).pushBordered(bl0134,ccFreeClientPropsBorderLayoutClass);

            }

            else{

                //SOS...the new comp will have centerized property

                ccFreeClientPropsBorderLayoutClass.putClientProperty(BorderLayout.class, 2);

                //the old will remain at ?west?-bl0134

                remove(foundWithPropertyAtWest);

                Jp jpnew=new Jp(foundWithPropertyAtWest,bl0134,ccFreeClientPropsBorderLayoutClass,2);

                jpnew.putClientProperty(BorderLayout.class, bl0134);

                blad(jpnew,bl0134);

            }

        }

        else{

            ccFreeClientPropsBorderLayoutClass.putClientProperty(BorderLayout.class, bl0134);

            blad(ccFreeClientPropsBorderLayoutClass,bl0134);

        }

        valful();

    }


    @Override

    public String toString() {

        String out=super.toString();

        String name=getName();

        if(name!=null){

            out=name;

        }

        return out;

    }

    

    /**

     * 'private' field to be used on possible event handlers

     */

    public boolean isAdjusting=false;

    

    

    

   

    

    public JScrollPane jscr;

    public JScrollPane jscr(){

        if(jscr==null){

            jscr=new JScrollPane(this);

            revalidate();

            repaint();

        }

        return jscr;

    }

    

    //general purpose

    public Dmtn pro=null;

    public Jp qpro(Dmtn some){pro = some;return this;}

    

    public BufferedImage takePhoto(){

        BufferedImage bim=new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);

        Graphics2D g=bim.createGraphics();

        //g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0.5f));

        paintAll(g);

        g.dispose();

        return bim;

    }


    

    


    public Jp(LayoutManager layout, boolean isDoubleBuffered) {

        super(layout, isDoubleBuffered);

    }


    public Jp(LayoutManager layout) {

        super(layout);

    }


    public Jp(boolean isDoubleBuffered) {

        super(isDoubleBuffered);

    }


    

    public Jp() {

        super(new BorderLayout());

    }

    public Jp(Component centered){

        this(centered,2);

    }

    public Jp(Component ca,int a){

        this();

        super.add(ca,bl(a));

    }

    

    public Jp(Component ca,int a,Component cb,int b){

        this(ca,a);

        super.add(cb,bl(b));

    }

    public Jp(Component ca,int a,Component cb,int b,Component cc,int c){

        this(ca,a,cb,b);

        super.add(cc,bl(c));

    }

    public Jp(Component ca,int a,Component cb,int b,Component cc,int c,Component cd,int d){

        this(ca,a,cb,b,cc,c);

        super.add(cd,bl(d));

    }

    public Jp(Component ca,int a,Component cb,int b,Component cc,int c,Component cd,int d,Component ce,int e){

        this(ca,a,cb,b,cc,c,cd,d);

        super.add(ce,bl(e));

    }


    


    public Jp qaddto(Jp jpanel){

        jpanel.add(this);

        return this;

    }

    

    

    public void blad(Component c,int pos){

        add(c,bl(pos));

        validate();

        repaint();

    }

    public void nad(Component c){ blad(c,0); }

    public void wad(Component c){ blad(c,1); }

    public void cad(Component c){ blad(c,2); }

    public void ead(Component c){ blad(c,3); }

    public void sad(Component c){ blad(c,4); }

    

    

    

    

    

    

    

    

    

    public Jp(int rows,int cols){

        super(new GridLayout(rows, cols));

    }

    public Jp(int rows,int cols,Component c0){

        this(rows, cols);

        add(c0);

    }

    public Jp(int rows,int cols,Component c0,Component c1){

        this(rows, cols);

        add(c0);add(c1);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2){

        this(rows, cols);

        add(c0);add(c1);add(c2);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5,Component c6){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);add(c6);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5,Component c6,Component c7){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);add(c6);add(c7);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5,Component c6,Component c7,Component c8){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);add(c6);add(c7);add(c8);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5,Component c6,Component c7,Component c8,Component c9){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);add(c6);add(c7);add(c8);add(c9);

    }

    public Jp(int rows,int cols,Component c0,Component c1,Component c2,Component c3,Component c4,Component c5,Component c6,Component c7,Component c8,Component c9,Component c10){

        this(rows, cols);

        add(c0);add(c1);add(c2);add(c3);add(c4);add(c5);add(c6);add(c7);add(c8);add(c9);add(c10);

    }

    public void resetGridOnRows(){

        resetGrid(new GridLayout(getComponentCount(),1));

    }

    public void resetGridOnColumns(){

        resetGrid(new GridLayout(1,getComponentCount()));

    }

    public void resetGrid(int newRows,int newCols){

        resetGrid(new GridLayout(newRows, newCols));

    }

    public void resetGrid(GridLayout gl){

        setLayout(gl);

        validate();

        repaint();

    } 







    //public Jp q(ActionListener l) {super.addActionListener(l); return this; }

    public Jp q(AncestorListener l) {super.addAncestorListener(l); return this; }

    //public Jp q(ChangeListener l) {super.addChangeListener(l); return this; }

    public Jp q(ComponentListener l) {super.addComponentListener(l); return this; }

    public Jp q(ContainerListener l) {super.addContainerListener(l); return this; }

    public Jp q(FocusListener l) {super.addFocusListener(l); return this; }

    public Jp q(HierarchyBoundsListener l) {super.addHierarchyBoundsListener(l); return this; }

    public Jp q(HierarchyListener l) {super.addHierarchyListener(l); return this; }

    public Jp q(InputMethodListener l) {super.addInputMethodListener(l); return this; }

    //public Jp q(ItemListener l) {super.addItemListener(l); return this; }

    public Jp q(KeyListener l) {super.addKeyListener(l); return this;  }

    public Jp q(MouseListener l) {super.addMouseListener(l); return this;  }

    public Jp q(MouseMotionListener l) {super.addMouseMotionListener(l); return this; }

    public Jp q(MouseWheelListener l) {super.addMouseWheelListener(l); return this; }

    public Jp q(PropertyChangeListener l) {super.addPropertyChangeListener(l); return this; }




    public Jp q(Cursor cursor) {super.setCursor(cursor); return this;}

    public Jp qCursorCrossHair() {super.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); return this;}

    public Jp qCursorHand() {super.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); return this;}

    public Jp qCursorMove() {super.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); return this;}

    public Jp qCursorText() {super.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); return this;}

    public Jp qCursorWait() {super.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); return this;}

    public Jp qMax(Dimension maximumSize) {super.setMaximumSize(maximumSize); return this; }

    public Jp qMin(Dimension minimumSize) {super.setMinimumSize(minimumSize); return this; }

    public Jp qPref(Dimension preferredSize) {super.setPreferredSize(preferredSize); return this; }

    public Jp q(Font f) {super.setFont(f); return this; }

    public Jp qFont(int size) {Font f=getFont();super.setFont(new Font(f.getName(), f.getStyle(), size)); return this; }

    public Jp qb(Color c) {super.setBackground(c); return this; }

    public Jp qf(Color c) {super.setForeground(c); return this; }

    public Jp qe(boolean b) {setEnabled(b); return this; }

    public Jp qn(String name) {super.setName(name); return this;  }

    public Jp qtt(String tooltip) {super.setToolTipText(tooltip); return this;  }

    public Jp qcp(Object key,Object prop){super.putClientProperty(key, prop);return this;}

    public Object gcp(Object key){return getClientProperty(key);}

    

    

    

    public void allCompsSetEnabled(boolean enabled){

        Component comps[]=getComponents();int i=0;

        while(i<comps.length){comps[i++].setEnabled(enabled);}

    }

    

    public Jp valful(){

        validate();

        revalidate();

        invalidate();

        repaint();

        return this;

    }

    public Jp valrep(){

        validate();

        repaint();

        return this;

    }

    

    


}



Τετάρτη 28 Σεπτεμβρίου 2022

UTF-8 decoder try version....

Reading anscii to utf...

                if(b1<=127){}//U+007F

                else if(b1<=2047){}//U+07FF

                else if(b1<=65535){}//U+FFFF

                else if(b1<=1114111){}//U+10FFFF

                else{} //???


https://en.wikipedia.org/wiki/UTF-8












/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package asciutfnotepadsolution;


import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.Rectangle;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.nio.charset.Charset;

import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JComboBox;

import javax.swing.JComponent;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSpinner;

import javax.swing.JSplitPane;

import javax.swing.JTabbedPane;

import javax.swing.JTable;

import javax.swing.JTextArea;

import javax.swing.SpinnerNumberModel;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.table.DefaultTableColumnModel;

import javax.swing.table.DefaultTableModel;


/**

 *

 * @author jimak

 */

public class AsciUtfNotepadSolution extends JPanel implements ActionListener,ChangeListener{


    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        // TODO code application logic here

        new AsciUtfNotepadSolution();

    }

    static Dimension scr=Toolkit.getDefaultToolkit().getScreenSize();

    public JFrame njfr(JComponent jc){

        JFrame out=new JFrame(jc.getClass().getSimpleName());

        out.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        out.setBounds(scr.width/2,0,scr.width/2,scr.height/4);

        out.getContentPane().add(jc);

        out.setVisible(true);

        return out;

    }

    JTabbedPane jtp=new JTabbedPane();

    JPanel jpLeft=new JPanel(new BorderLayout());

    JPanel jpRight=new JPanel(new BorderLayout());

    JSplitPane jspl=new JSplitPane(0,jpLeft,jpRight);

    


    JFrame jfr=null;

    Ints2 ints=new Ints2();

    JLabel jlUnicode=new JLabel("Unicode char : ");

    JPanel jpUnicode=new JPanel(new BorderLayout());

    JLabel jlMaps=new JLabel("possibly written as");

    JPanel jpMaps=new JPanel(new BorderLayout());

    

    JPanel jpUnicodeMaps=new JPanel(new GridLayout(2,1));

    

    JTextArea jtaManual=new JTextArea("ÅÐÉÊÏÕÑÉÊÇ ÈÁÍÁÔÏÕ\nÊÕÑÉÁ ÈÁÍÁÔÏÕ");

    

    

    JFileChooser jfch=new JFileChooser();

    JButton jbTryDecodeFile=new JButton("decode from File");

    JButton jbTryDecodeFromTextArea=new JButton("decodeFrom TextArea");

    JPanel sp=new JPanel(new BorderLayout());

    public AsciUtfNotepadSolution(){

        super(new BorderLayout());

        

        jpRight.add(BorderLayout.CENTER,jtp);

        jspl.setResizeWeight(0.1);

        add(BorderLayout.CENTER,jspl);

        

        jpUnicode.add(BorderLayout.WEST,jlUnicode);

        jpUnicode.add(BorderLayout.CENTER,ints.jspun);

        jpUnicodeMaps.add(jpUnicode);

        jpMaps.add(BorderLayout.WEST,jlMaps);

        jpMaps.add(BorderLayout.CENTER,ints.jspwr);

        jpUnicodeMaps.add(jpMaps);

        

        

        sp.add(BorderLayout.WEST,jbTryDecodeFromTextArea);

        sp.add(BorderLayout.EAST,jbTryDecodeFile);

        jbTryDecodeFromTextArea.setEnabled(false);

        jtaManual.setEnabled(false);

        

        

        jpLeft.add(BorderLayout.WEST,new JScrollPane(jtaManual));

        jpLeft.add(BorderLayout.CENTER,jpUnicodeMaps);

        jpLeft.add(BorderLayout.SOUTH,sp);

        jfr=njfr(this);

        jfr.setTitle(""+Charset.defaultCharset()+"..");

        jfr.setBounds(50,50,scr.width-100,scr.height-100);

        jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jbTryDecodeFile.addActionListener(this);

        jbTryDecodeFromTextArea.addActionListener(this);

        ints.jspun.addChangeListener(this);

        ints.jspwr.addChangeListener(this);

    }

    static Vector createColumns(){

        Vector out=new Vector();

        out.add("index");

        out.add("view");

        out.add("unicode");

        out.add("<127");

        out.add("result");

        out.add("repr");

        out.add("reads(b1)");

        out.add("bin_b1");

        out.add("b2");

        out.add("bin_b2");

        out.add("b3");

        out.add("bin_b3");

        out.add("b4");

        out.add("bin_b4");

        return out;

    }

    void newTxtDecodingTaskFinished(Rows rows){

        System.out.println("done creating swing");

        

        rows.jtbl=new Jtl(rows,createColumns());

        rows.jscr=new JScrollPane(rows.jtbl);

        rows.jscr.getVerticalScrollBar().setUnitIncrement(100);

        rows.jp.add(BorderLayout.CENTER,rows.jscr);

        rows.jp.add(BorderLayout.NORTH,rows.jpn);

        String tabname="from JTA";

        if(rows.src!=null){

            tabname=""+rows.src.getName();

        }

        jtp.addTab(tabname, rows.jspl);

        rows.jta.setText(rows.sbuf.toString());

        rows.jta.setCaretPosition(0);


    }

    public static final int []lastCodePoint={127,2047,65535,1114111};

    void newTxtDecodeingTask(Rows rows){

        if(rows.input!=null){

            System.out.println("Decoding bytes vector length="+rows.input.size());

            System.out.println("creating multi vectors for");

            System.out.println("charOut,i,(<-)byteRead-b1, b1Bin, b2, b2Bin, b3, b3Bin, b4, b4Bin");

            

            int i=0,l=rows.input.size();

            

            int b1,b2,b3,b4;//bytes

            int i1,i2,i3,i4;//trancated bytes

            int unicodeFinally=0;

            char unicode=0;

            while(i<l){

                Vector v=new Vector();

                v.add(i+":i");

                v.add("");//view[1]

                v.add("");//unicodefinal[2]

                v.add(0);//<127[3]

                v.add("");//complex resuylt[4]

                v.add("");//repr[5]

                b1=rows.input.get(i);

                v.add(b1);

                v.add(Integer.toBinaryString(b1));

                


                rows.add(v);

                ++i;

            }

            System.out.println("finished heavy job now omputing job(2nd pass)");

            

            i=0;

            int idif=1;

            while(i<l){

                Vector v=(Vector)rows.get(i);

                b1=rows.input.get(i);

                if(b1<=127){

                    v.setElementAt(b1, 3);//result

                    unicodeFinally=b1;

                    idif=1;

                }

                else if(b1<=2047){

                    if(i+1<l){

                        b2=rows.input.get(i+1);

                        v.add(b2);

                        v.add(Integer.toBinaryString(b2));

                        i1=b1&31;

                        i2=b2&63;

                        i1<<=6;

                        i1+=i2;

                        

                        v.setElementAt(i1, 4);//result

                        unicodeFinally=rows.un+(i1-rows.wr);

                        

                        

                        String s1=Integer.toBinaryString(b1);

                        String s2=Integer.toBinaryString(b2);

                        String s="";

                        String st="";

                        try{

                            s+=s1.substring(0,s1.length()-5);

                            s+="(";

                            s+=s1.substring(s1.length()-5,s1.length());

                            s+=")+";

                            s+=s2.substring(0,s2.length()-6);

                            s+="(";

                            s+=s2.substring(s2.length()-6,s2.length());

                            s+=")";


                            v.setElementAt(s, 5);

                        }catch(Exception e){v.setElementAt("errSTr", 3);}

                        

                    }

                    else{v.add("err_2");}

                    idif=2;

                }

                else if(b1<=65535){

                    

                    idif=3;

                }

                else if(b1<=1114111){

                    

                    idif=4;

                }

                else{

                    v.add("err_1");

                    idif=1;

                }

                

                

                

                

                

                unicode=(char)unicodeFinally;

                v.setElementAt(unicodeFinally,2);

                v.setElementAt(unicode,1);

                rows.sbuf.append(unicode);

                i+=idif;                

            }

            

            newTxtDecodingTaskFinished(rows);

            

        }

    }

    void newTxtDecodingTask(String text){

        if(text!=null){

            int l=text.length();

            if(l>0){

                Rows rows=new Rows(null,ints.un(),ints.wr());

                System.out.println("textArea.len()="+l);

                int i=0;

                while(i<l){

                    int ch=(int)text.charAt(i);

                    int i1=ch%256;

                    int i0=ch>>8;

                    rows.input.add(i0);

                    rows.input.add(i1);

                    ++i;

                }

                newTxtDecodeingTask(rows);

            }else{JOptionPane.showMessageDialog(this, "You must have some text in the up left TextArea to decode it");}

        }

    }

    void newTxtDecodingTask(File f){

        if(f!=null){

            System.out.println("Task:"+f);

            jfr.setTitle("Reading :"+f.getName());

            Rows rows=new Rows(f,ints.un(),ints.wr());

            IOException iof=null;

            boolean end=false;

            int ri;

            FileInputStream fin=null;

            try{

                fin=new FileInputStream(f);

                ri=fin.read();

                while(ri>-1){

                    rows.input.add(ri);

                    ri=fin.read();

                }

                end=true;

            }catch(IOException io){iof=io;}

            finally{

                try{fin.close();System.out.println("closed");}catch(Exception e){}

            }

            if(iof!=null){

                if(!end){

                    JOptionPane.showMessageDialog(this, iof);

                }

            }

            else{

                System.out.println("ok...we have read "+rows.input.size()+" bytes");

                System.out.println(f.getName()+" has length = "+f.length());

                jfr.setTitle(rows.input.size()+" bytes read ok from "+f.getName());

                newTxtDecodeingTask(rows);

            }

        }

    }

    void jcUnicodeSetted(int unicodepoint){

        jlUnicode.setText("Unicode char: "+((char)unicodepoint)+" = "+unicodepoint);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        Object src=e.getSource();

        if(src==jbTryDecodeFile){

            int answer=jfch.showOpenDialog(this);

            if(answer==JFileChooser.APPROVE_OPTION){

                newTxtDecodingTask(jfch.getSelectedFile());

            }

        }

        else if(src==jbTryDecodeFromTextArea){

            newTxtDecodingTask(jtaManual.getText());

        }

    }


    @Override

    public void stateChanged(ChangeEvent e) {

        

    }

    

    

    

    

    

    

    

}


class Rows extends Vector<Vector> implements ChangeListener{

    File src;

    Vector<Integer>input;

    int un,wr;

    StringBuffer sbuf=new StringBuffer();

    


    Ints2 unwr=new Ints2();

    JPanel jpn=new JPanel(new BorderLayout());

    

    Jtl jtbl=null;

    JScrollPane jscr=null;

    JPanel jp=new JPanel(new BorderLayout());

    

    JTextArea jta=new JTextArea();

    JScrollPane jscrjta=new JScrollPane(jta);

    

    JSplitPane jspl=new JSplitPane(1,jp,jscrjta);

    public Rows(File f,int unicodePoint,int writtenAs){

        src=f;

        input=new Vector();

        un=unicodePoint;

        wr=writtenAs;

        

        jspl.setResizeWeight(0.8);

        

        

        unwr.jspun.setValue(un);

        unwr.jspwr.setValue(wr);

        jpn.add(BorderLayout.WEST,unwr);

        

        unwr.jspun.addChangeListener(this);

        unwr.jspwr.addChangeListener(this);

        

    }

    

    void recompute(){

        if(jtbl!=null){

            //if(newPossibleWr>=0){

                System.out.println("recomputing for un="+un+" , wr="+wr);

                DefaultTableModel dtm=(DefaultTableModel)jtbl.getModel();

                int i=0,l=size();

                int unicodeFinally;

                sbuf.delete(0, sbuf.length());

                char unicode;

                while(i<l){

                    Vector v=(Vector)get(i);

                    Object o2=v.get(4);

                    if(o2 instanceof Integer){

                        unicodeFinally=(Integer)o2;

                        unicodeFinally+=un;

                        unicodeFinally-=wr;

                        

                    }

                    else{

                        unicodeFinally=(Integer)v.get(3);

                    }

                    unicode=(char)unicodeFinally;

                    sbuf.append(unicode);

                    v.setElementAt(unicodeFinally, 2);

                    v.setElementAt(unicode, 1);

                    ++i;

                }

                jtbl.repaint();

                jta.setText(sbuf.toString());

            //}

        }

    }


    @Override

    public void stateChanged(ChangeEvent e) {

        un=unwr.un();

        wr=unwr.wr();

        recompute();

    }

    

    

    

}





class Jtl extends JTable{

    

    public Jtl(Vector rowDate,Vector columnData){

        DefaultTableModel ndtm=new DefaultTableModel(rowDate, columnData);

        setModel(ndtm);

        

    }

    public Jtl(Vector rowsWithVectorsOrNot){

        super();

        if(rowsWithVectorsOrNot==null){

            rowsWithVectorsOrNot=new Vector();

        }

        int i=0,l=rowsWithVectorsOrNot.size(), maxCols=0,vCols;

        while(i<l){

            Object ov=rowsWithVectorsOrNot.get(i);

            Vector v=null;

            if(ov!=null && (ov instanceof Vector)){

                v=(Vector)ov;

            }

            else{

                    v=new Vector();

                    rowsWithVectorsOrNot.insertElementAt(v, i);

                    rowsWithVectorsOrNot.remove(i+1);

                    v.add(ov);

            }

            vCols=v.size();

            if(vCols>maxCols){

                maxCols=vCols;

            }

            ++i;

        }

        System.out.println("maxCols found : "+maxCols+"...creating default columns");

        Vector cs=new Vector();

        i=0;

        while(i<maxCols){

            cs.add("c"+i);

            ++i;

        }

        DefaultTableModel ndtm=new DefaultTableModel(rowsWithVectorsOrNot, cs);

        setModel(ndtm);

        

    }

}


class Ints2 extends JPanel{

    JSpinner jspun=new JSpinner(new SpinnerNumberModel(913,0,65555,1));

    JSpinner jspwr=new JSpinner(new SpinnerNumberModel(193,0,65555,1));

    

    Ints2(){

        super(new BorderLayout());

        add(BorderLayout.WEST,jspun);

        add(BorderLayout.EAST,jspwr);

        

    }

    public int un(){

        return (Integer)jspun.getValue();

    }

    public int wr(){

        return (Integer)jspwr.getValue();

    }

}