SSISO Community

시소당

형식있는 문서 만들기

/**
*  @author  Stanislav  Lapitsky
*  @version  1.0
*/

import  java.awt.*;
import  java.awt.geom.*;

import  javax.swing.*;
import  javax.swing.text.*;
import  java.awt.event.*;

public  class  ScaledTextPane  extends  JEditorPane  {

    JComboBox  zoomCombo=new  JComboBox(new  String[]  {"50%","75%",
                                                                                                    "100%","200%",
                                                                                                    "250%"});
    public  static  void  main(String[]  args)  {
        JFrame  frame=new  JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ScaledTextPane  scaledTextPane=new  ScaledTextPane();
        scaledTextPane.setEditorKit(new  ScaledEditorKit());
        scaledTextPane.getDocument().putProperty("i18n",  Boolean.TRUE);
        scaledTextPane.getDocument().putProperty("ZOOM_FACTOR",
                                                                                          new  Double(2.5));
        JScrollPane  scroll=new  JScrollPane(scaledTextPane);
        frame.getContentPane().add(scroll);
        frame.getContentPane().add(scaledTextPane.zoomCombo,
                                                              BorderLayout.NORTH);

        frame.setSize(200,200);
        frame.show();
    }

    public  ScaledTextPane()  {
        super();
        zoomCombo.addActionListener(new  ActionListener()  {
            public  void  actionPerformed(ActionEvent  e)  {
                String  s  =  (String)  zoomCombo.getSelectedItem();
                s  =  s.substring(0,  s.length()  -  1);
                double  scale  =  new  Double(s).doubleValue()  /  100;
                ScaledTextPane.this.getDocument().putProperty("ZOOM_FACTOR",
                                                                                    new  Double(scale));
                try  {
                    ScaledTextPane.this.getDocument().insertString(0,  "",
                                                                                        null);        //refresh
                }
                catch  (Exception  ex)  {
                    ex.printStackTrace();
                }
            }
        });
        zoomCombo.setSelectedItem("250%");
    }

    public  void  repaint(int  x,  int  y,  int  width,  int  height)  {
        super.repaint(0,0,getWidth(),getHeight());
    }

}

class  ScaledEditorKit  extends  StyledEditorKit  {
    public  ViewFactory  getViewFactory()  {
        return  new  StyledViewFactory();
    }
    class  StyledViewFactory  implements  ViewFactory  {

        public  View  create(Element  elem)  {
            String  kind  =  elem.getName();
            if  (kind  !=  null)  {
                if  (kind.equals(AbstractDocument.ContentElementName))  {
                    return  new  LabelView(elem);
                }  else  if  (kind.equals(AbstractDocument.
                                                              ParagraphElementName))  {
                    return  new  ParagraphView(elem);
                }  else  if  (kind.equals(AbstractDocument.
                                                              SectionElementName))  {
                    return  new  ScaledView(elem,  View.Y_AXIS);
                }  else  if  (kind.equals(StyleConstants.
                                                              ComponentElementName))  {
                    return  new  ComponentView(elem);
                }  else  if  (kind.equals(StyleConstants.IconElementName))  {
                    return  new  IconView(elem);
                }
            }

            //  default  to  text  display
            return  new  LabelView(elem);
        }

    }
}

//-----------------------------------------------------------------
class  ScaledView  extends  BoxView{
    public  ScaledView(Element  elem,  int  axis)  {
        super(elem,axis);
    }
    public  double  getZoomFactor()  {
            Double  scale=(Double)getDocument().getProperty("ZOOM_FACTOR");
            if  (scale!=null)  {
                    return  scale.doubleValue();
        }

        return  1;
    }

    public  void  paint(Graphics  g,  Shape  allocation)  {
        Graphics2D  g2d  =  (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                                                  RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        double  zoomFactor  =  getZoomFactor();
        AffineTransform  old=g2d.getTransform();
        g2d.scale(zoomFactor,  zoomFactor);
        super.paint(g2d,  allocation);
        g2d.setTransform(old);
    }

    public  float  getMinimumSpan(int  axis)  {
        float  f  =  super.getMinimumSpan(axis);
        f  *=  getZoomFactor();
        return  f;
    }

    public  float  getMaximumSpan(int  axis)  {
        float  f  =  super.getMaximumSpan(axis);
        f  *=  getZoomFactor();
        return  f;
    }

    public  float  getPreferredSpan(int  axis)  {
        float  f  =  super.getPreferredSpan(axis);
        f  *=  getZoomFactor();
        return  f;
    }

    protected  void  layout(int  width,  int  height)  {
        super.layout(new  Double(width  /  getZoomFactor()).intValue(),
                                                        new  Double(height  *
                                                        getZoomFactor()).intValue());
    }

    public  Shape  modelToView(int  pos,  Shape  a,  Position.Bias  b)
                  throws  BadLocationException  {
        double  zoomFactor  =  getZoomFactor();
        Rectangle  alloc;
        alloc  =  a.getBounds();
        Shape  s  =  super.modelToView(pos,  alloc,  b);
        alloc  =  s.getBounds();
        alloc.x*=zoomFactor;
        alloc.y*=zoomFactor;
        alloc.width*=zoomFactor;
        alloc.height*=zoomFactor;

        return  alloc;
    }


    public  int  viewToModel(float  x,  float  y,  Shape  a,
                                                  Position.Bias[]  bias)  {
        double  zoomFactor  =  getZoomFactor();
        Rectangle  alloc  =  a.getBounds();
        x/=zoomFactor;
        y/=zoomFactor;
        alloc.x/=zoomFactor;
        alloc.y/=zoomFactor;
        alloc.width/=zoomFactor;
        alloc.height/=zoomFactor;

        return  super.viewToModel(x,  y,  alloc,  bias);
    }


}

[출처]  형식있는  문서  만들기|작성자  처리

523 view

4.0 stars