⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawcanvas.java

📁 用Java开发的、实现类似Visio功能的应用程序源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 *    $Id:DrawCanvas.java $
 *
 *    Copyright 2004 ~ 2005  JingFei International Cooperation LTD. All rights reserved. *
 */
package com.jfimagine.jfdraw.gui;

import java.util.Iterator;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;



import javax.swing.JPanel;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;   
import javax.swing.JScrollPane;

import com.jfimagine.jfgraph.shape.union.JFPage;
import com.jfimagine.jfgraph.shape.base.ShapeConst;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.ObjectList;
import com.jfimagine.jfgraph.shape.action.JFOperationManager;

import com.jfimagine.jfgraph.shape.line.JFQuadrant;
import com.jfimagine.jfgraph.shape.union.JFLayer;

import com.jfimagine.jfgraph.shape.decorate.GridFormat;
import com.jfimagine.jfgraph.shape.decorate.FontFormat;
import com.jfimagine.jfgraph.shape.decorate.LineFormat;  
import com.jfimagine.jfgraph.shape.decorate.CanvasFormat;

import java.awt.print.PageFormat;
import com.jfimagine.jfgraph.shape.decorate.JFPageFormat;

import com.jfimagine.jfgraph.geom.GeomConst;
import com.jfimagine.jfgraph.geom.Rect;
import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.JFPoint;

import com.jfimagine.jfdraw.draw.DrawState;
import com.jfimagine.jfdraw.draw.AbstractDrawEvent;
import com.jfimagine.jfdraw.draw.EventDispatcher;
import com.jfimagine.jfdraw.draw.DrawConst;
import com.jfimagine.jfdraw.draw.Selection;

import com.jfimagine.jfdraw.gui.GlobalSettings;




 /**
 * Drawing canvas class. A main drawing canvas used to draw or show graphs.
 *
 * @author     CookieMaker    
 *
 * @version $Revision: 1.3.0 $
 */ 
public class DrawCanvas extends JPanel  
			implements Scrollable,MouseListener,MouseMotionListener,KeyListener {

    /** for scrolling increment. */
    private double m_maxUnitIncrement = 1;

    private boolean m_isMetric  =true;
    
    /** for event processing.*/
    private EventDispatcher m_eventDispatcher;
    
    /** current draw state.*/
    private DrawState	m_drawState;

    /** A CAD page for each canvas.*/
    private JFPage m_page=new JFPage(); 
    
    /** An operation manager for undo and redo */
    private JFOperationManager m_operationManager = new JFOperationManager(m_page);

    /** A CAD selection for current shape objects.*/
    private Selection m_selection=new Selection(this);
    
    /** Last mouse position on this canvas.*/
    private JFPoint m_lastMousePos	=new JFPoint();
    
    /** grid of this canvas.*/
    private GridFormat m_gridFormat	=new GridFormat();
    
    /** zoom scale.*/
    private double m_zoomScale		=1.0;

    /** original canvas dimension.*/
    private Dimension m_originalSize	=new Dimension();
    
    /** parent draw pane */
    private DrawPane m_parentDrawPane;
    
    /** if hide grids */
    private boolean m_hideGrids	=false;

    /** if hide popup menus */
    private boolean m_hidePopupMenus	=false;

    /** if use page bounds to restrict drawing*/
    private boolean m_usePageBounds	=true;   
    
    /** graph file name **/
    private String m_fileName		=""; 
    
    /** background color for drawing canvas */
    private Color m_backgroundColor	=Color.white;   
    
    /** if current drawing canvas is under a reversed color */
    private boolean m_isReverse	=false;
   
    /** 
     *  Constructor
     *  @param maxIncrement A max increment unit for scrolling.
     */ 
    public DrawCanvas(DrawAdapter drawAdapter,double maxUnitIncrement) {
	
	setLayout(new java.awt.BorderLayout());
	
	if (drawAdapter!=null && drawAdapter instanceof DrawPane){
		m_parentDrawPane	=(DrawPane)drawAdapter;
	}
                
        m_drawState	=new DrawState();
	m_drawState.setDrawState(DrawConst.DRAWSTATE_NONE,ShapeConst.SHAPETYPE_NONE); 

        m_eventDispatcher	=new EventDispatcher(drawAdapter,this);

	
        setOpaque(true);
        setBackground(m_backgroundColor);
        m_maxUnitIncrement = maxUnitIncrement;

        //Let the user scroll by dragging to outside the window.
        setAutoscrolls(true); //enable synthetic drag events
        addMouseListener(this); //handle mouse events(e.g. click, press,release)
        addMouseMotionListener(this); //handle mouse events(e.g. move, drag)
        addKeyListener(this);//handle key events
        
        GlobalSettings settings	=GlobalSettings.getInstance();
        m_gridFormat.setIsMetric(settings.isMetric()); 
        m_page.setIsMetric(settings.isMetric());  
        
	//copy global settings to page settings
        m_page.setHidePorts(settings.isHidePorts());
        m_page.setDisablePortSnapping(settings.isDisablePortSnapping());
        m_page.setScaleValue(settings.getScaleValue());
        m_page.setScaleUnit(settings.getScaleUnit());
        m_page.setScreenUnit(settings.getScreenUnit()); 

    } 

    public boolean isMetric() {
        return m_isMetric;
    }

    public void setIsMetric(boolean isMetric) {
        this.m_isMetric = isMetric;
	
	//set gridformat to metric/english        
        getGridFormat().setIsMetric(isMetric);
	//set draw page to metric/english.        
        getDrawPage().setIsMetric(isMetric);
    }

    /** if hide grids now */	
    public boolean isHideGrids(){
	return m_hideGrids;
    }
    /** set if hide grids */
    public void setHideGrids(boolean hideGrids){
    	m_hideGrids	=hideGrids;
    }

    /** if hide popupmenus  now */	
    public boolean isHidePopupMenus(){
	return m_hidePopupMenus;
    }
    /** set if hide popupmenus */
    public void setHidePopupMenus(boolean hidePopupMenus){
    	m_hidePopupMenus	=hidePopupMenus;
    }

    /** if use page bounds(or the bounds of a canvas format) to restrict drawing */	
    public boolean isUsePageBounds(){
	return m_usePageBounds;
    }
    /** set if use page bounds(or the bounds of a canvas format) to restrict drawing */
    public void setUsePageBounds(boolean usePageBounds){
    	m_usePageBounds	=usePageBounds;
    }


    /** get the background color for drawing canvas 
     *  @return the background color
     */
    public Color getBackgroundColor(){
    	return m_backgroundColor;
    }
    
    /** set the background color for drawing canvas 
     *  @param A new background color for drawing canvas
     */
    public void setBackgroundColor(Color color){
    	if (color!=null)
    		m_backgroundColor	=new Color(color.getRGB());
    }

    /** get if current current drawing canvas is under a reverse color.
     *  @return True if is reversed, false otherwise.
     */
    public boolean isReverse(){
    	return m_isReverse;
    }
    
    /** set if current current drawing canvas is under a reverse color.
     *  @param reverse True if is reversed, false otherwise.
     */
    public void setReverse(boolean reverse){
    	  m_isReverse	=reverse;
    	  
    	  if (reverse){
    	  	setBackgroundColor(Color.black);
    	  	FontFormat.getDefaultFontFormat().setFontColor(Color.white);
    	  	LineFormat.getDefaultLineFormat().setLineColor(Color.white);
    	  }else{
    	  	setBackgroundColor(Color.white);
    	  	FontFormat.getDefaultFontFormat().setFontColor(Color.black);
    	  	LineFormat.getDefaultLineFormat().setLineColor(Color.black);
    	  }
    	
    }


    /** get graph file name */
    public String getFileName(){
    	return m_fileName;
    }	

    /** set graph file name */
    public void setFileName(String fileName){
    	m_fileName	=fileName;
    }	


    /** get current grid format
     *  @return the grid format.
     */	
    public GridFormat getGridFormat(){
    	return m_gridFormat;
    }

    /** get zoom scale
     *  @return the zoom scale
     */	
    public double getZoomScale(){
    	return m_zoomScale;
    }

    /** set zoom scale
     *  @param zoomScale A new zoom scale.
     */	
    public void setZoomScale(double zoomScale){

    	clearCanvas(null);
    	
    	if (zoomScale<0.25) zoomScale	=0.25;
    	
    	m_zoomScale	=zoomScale;
    	if (m_page.getZoomScale()!=zoomScale){
    		m_page.setZoomScale(zoomScale);
    	}
    	m_drawState.setZoomScale(zoomScale);
    	GeomConst.setZoom(zoomScale);
    	
    	Dimension d	=new Dimension((int)(m_originalSize.getWidth() * m_zoomScale),(int)(m_originalSize.getHeight() * m_zoomScale));
    	setPreferredSize(d);
    	setSize(d);
    	
    	if (m_parentDrawPane!=null)
    		m_parentDrawPane.setZoomScale(zoomScale);
    }
	
    /** 
     *  get view center of this canvas
     *  @return the center point of the view rectangle of this canvas
     */	
   public JFPoint getViewCenter(){

	double x	=0;
	double y	=0;
        double width	=0;
        double height	=0;

	DrawPane pane	=getParentDrawPane();
   	if (!pane.isHideScrollbars()){
   		JScrollPane	scrollPane	=getParentDrawPane().getScrollPane();
   		//view rectangle
   	        Rectangle	viewRect	=scrollPane.getViewport().getViewRect();
	
		x	=viewRect.getX()/m_zoomScale;
		y	=viewRect.getY()/m_zoomScale;
        	width	=viewRect.getWidth()/m_zoomScale;
        	height	=viewRect.getHeight()/m_zoomScale;
        }else{
        	Dimension	d		=getSize();
        	x	=0;
        	y	=0;
        	width	=d.getWidth()/m_zoomScale;
        	height	=d.getHeight()/m_zoomScale;
	}
        
        //actual page size
        double pageWidth	=m_page.getPageFormat().getWidth();
        double pageHeight	=m_page.getPageFormat().getHeight();
        
        //width different if the view rect exceed the actual page size.
        double widthDiff	=x+width-pageWidth*JFPageFormat.INCH_SCREEN/JFPageFormat.INCH;
        double heightDiff	=y+height-pageHeight*JFPageFormat.INCH_SCREEN/JFPageFormat.INCH; 
        
        
        if (widthDiff>0){
        	width	-=widthDiff;
        	if (width<0) width=0;
	}
	if (heightDiff>0){
		height	-=heightDiff;
		if (height<0) height=0;
	}
        
        return new JFPoint(x+width/2,y+height/2);
   }


    /** get original size
     *  @return the original size
     */	
    public Dimension getOriginalSize(){
    	return m_originalSize;
    }

    /** set original size
     *  @param originalSize A new original size.
     */	
    public void setOriginalSize(Dimension originalSize){
    	m_originalSize.setSize(originalSize);
    	setPreferredSize(new Dimension((int)(m_originalSize.getWidth() * m_zoomScale),(int)(m_originalSize.getHeight() * m_zoomScale)));
    }

    
    /** get current draw state*/	
    public DrawState getDrawState(){
    	return m_drawState;
    }

    /** set current draw state
     *  @param drawState A new draw state.
     */	
    public void setDrawState(DrawState drawState){
    	m_drawState	=new DrawState(drawState);
    }

    /** set parent draw pane
     *  @param drawPane a new parent drawPane
     */	
    public void setParentDrawPane(DrawPane drawPane){
    	m_parentDrawPane	=drawPane;
    }

    /** get parent draw pane
     *  @return the parent draw pane of this draw canvas.
     */	
    public DrawPane getParentDrawPane(){
    	return m_parentDrawPane;
    }


    /** get last mouse position on this canvas.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -