亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? selectionmodel.java

?? SWING的界面UI包 SWING的界面UI包
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/*
 * SelectionModel.java
 *
 * Created on 2007年5月7日, 下午9:58
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package dyno.swing.designer.beans.models;

import dyno.swing.beans.layouts.AbsoluteLayout;
import dyno.swing.designer.beans.AdapterBus;
import dyno.swing.designer.beans.ComponentAdapter;
import dyno.swing.designer.beans.Constants;
import dyno.swing.designer.beans.ContainerAdapter;
import dyno.swing.designer.beans.SwingDesigner;
import dyno.swing.designer.beans.Util;
import dyno.swing.designer.beans.events.DesignerEvent;
import java.awt.Component;
import java.awt.Container;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;


/**
 * 該model保存當前選擇的組件和剪切版信息
 * @author William Chen
 */
public class SelectionModel implements Constants {

    private SwingDesigner designer;
    //當前選中的組件,可以是多選,被選中的組件之間可以存在父子樹狀關系
    private transient ArrayList<Component> selection;
    //當前被拷貝或粘帖的剪切板
    private transient ArrayList<Component> clip_board;
    //當前拖拽和選擇的熱點區域
    private transient Rectangle hotspot_bounds;

    public SelectionModel(SwingDesigner designer) {
        this.designer = designer;
        selection = new ArrayList<Component>();
        clip_board = new ArrayList<Component>();
    }
    public void reset(){
        selection.clear();
        clip_board.clear();
        hotspot_bounds=null;
    }
    /**
     * 當前選擇的組件是否是可以拖拽的??梢酝献У臈l件為:
     * 1.選中的組件不為空(很明顯)
     * 2.選中的組件不是根組件
     * 3.選中的組件的父親容器必須是同一個容器(不同容器內的組件不可以被同時拖拽)
     * 4.選中的組件的父親容器的布局管理器為空,或者是AbsoluteLayout。這個規則以后可能發生,
     * 如果想在其他布局管理器的情況下支持特殊的拖拽。待定。
     *
     * @return 是否可以拖拽,是為true,否則false
     */
    public boolean isSelectedResizable() {
        if (selection.isEmpty()) {
            //1.選中的組件不為空
            return false;
        }

        Container current = null;
        for (Component comp : selection) {
            Container parent = comp.getParent();
            if ((parent == null) || (comp == designer.getRootComponent())) {
                //2.選中的組件不是根組件
                return false;
            }

            LayoutManager layout = parent.getLayout();

            if ((layout != null) && (layout.getClass() != AbsoluteLayout.class)) {
                //4.選中的組件的父親容器的布局管理器為空,或者是AbsoluteLayout
                return false;
            }

            if (current == null) {
                //第一個組件的父容器
                current = parent;
            } else if (current != parent) {
                //3.選中的組件的父親容器必須是同一個容器
                return false;
            }
        }

        return true;
    }

    public void setSelectedComponent(Component comp) {
        selection.clear();
        selection.add(comp);
        fireComponentSelected();
    }

    /**
     * 鼠標點擊一下,所選中的單個組件。按下Ctrl或者shift鍵時鼠標可以進行多選
     */
    public void selectAComponentAtMouseEvent(MouseEvent e) {
        if (!e.isControlDown() && !e.isShiftDown()) {
            //如果Ctrl或者Shift鍵盤沒有按下,則清除已經選擇的組件
            selection.clear();
        }

        //獲取e所在的組件
        Component comp = designer.getComponentAt(e);

        if (!((comp == null) || selection.contains(comp))) {
            //如果e所在的地方有組件,并且已經選中的組件中不包含此組件,則添加進去
            selection.add(comp);
        }

        //觸發鼠標組件選擇事件。
        fireComponentSelected();
        designer.repaint();
    }

    private void fireComponentSelected() {
        DesignerEvent evt = new DesignerEvent(this);
        evt.setSelectedComponents(selection);
        designer.getEditListenerTable().fireComponentSelected(evt);
    }

    /**
     * 在當前選中的組件中找出處于e鼠標事件所在的組件。
     */
    public Component getSelectionAt(MouseEvent e) {
        int x = e.getX() - designer.getOuterLeft();
        int y = e.getY() - designer.getOuterTop();

        for (Component comp : selection) {
            //獲取當前組件相對于根組件的相對位置
            Rectangle rect = Util.getRelativeBounds(comp);

            if ((x >= (rect.x - BOX_SIZE)) && (x <= (rect.x + rect.width + BOX_SIZE)) && (y >= (rect.y - BOX_SIZE)) && (y <= (rect.y + rect.height + BOX_SIZE))) {
                return comp;
            }
        }

        return null;
    }

    /**
     * 將所選組件剪切到剪切板上
     */
    public void cutSelectedComponent2ClipBoard() {
        if (!selection.isEmpty()) {
            //清空剪切板
            clip_board.clear();

            //找到所選擇組件的根
            ArrayList<Component> roots = getSelectedRoots();

            for (Component root : roots) {
                ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, root);
                //添加他們的根組件
                clip_board.add(adapter.clone());
            }

            for (Component component : roots) {
                removeBeanFromContainer(component);
            }

            //觸發事件
            fireComponentCut();
            //清除被選擇的組件
            selection.clear();
            designer.repaint();
        }
    }

    private void fireComponentCut() {
        DesignerEvent evt = new DesignerEvent(this);
        evt.setCutComponents(clip_board);
        designer.getEditListenerTable().fireComponentCut(evt);
    }

    /**
     * 獲取當前被選中組件的根列表
     */
    public ArrayList<Component> getSelectedRoots() {
        ArrayList<Component> roots = new ArrayList<Component>();
        for (Component current : selection) {
            //如果當前不為根組件,并且當前組件在selection是根組件,則添加該組件
            if ((current != designer.getRootComponent()) && isTopContainer(current, selection)) {
                roots.add(current);
            }
        }

        return roots;
    }

    /**
     *判斷comonent1在組件列表selection是否是根組件,即頂層容器組件
     */
    private boolean isTopContainer(Component component1, ArrayList<Component> selection) {
        for (Component component2 : selection) {
            //查找每個組件
            if ((component1 != component2) && SwingUtilities.isDescendingFrom(component1, component2) && (component2 != designer.getRootComponent())) {
                //如果不是組件自身,切component1是component2的子或孫組件,并且component2不是根組件,那么不是頂層容器
                return false;
            }
        }

        return true;
    }

    /**
     * 復制當前選中的組件到剪切板
     */
    public void copySelectedComponent2ClipBoard() {
        if (!selection.isEmpty()) {
            //清空剪切板
            clip_board.clear();

            //獲取被選中組件的根組件
            ArrayList<Component> roots = getSelectedRoots();

            for (Component root : roots) {
                ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, root);
                //放到剪切板中
                clip_board.add(adapter.clone());
            }
            //觸發事件
            fireComponentCopyed();
        }
    }

    private void fireComponentCopyed() {
        DesignerEvent evt = new DesignerEvent(this);
        evt.setCopyedComponents(clip_board);
        designer.getEditListenerTable().fireComponentCopyed(evt);
    }

    /**
     * 從剪切板粘帖組件
     */
    public void pasteFromClipBoard() {
        if (!clip_board.isEmpty()) {
            if (!isPasteable()) {
                //如果當前被選擇的組件不是容器或者剪切板的內容不可以粘帖
                Toolkit.getDefaultToolkit().beep();
            } else {
                //唯一的容器組件就是粘帖組件的地方
                Component root = selection.get(0);
                Container container = (Container) root;

                for (Component comp : clip_board) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜久久久久中文字幕久| 日本不卡中文字幕| 伦理电影国产精品| 在线观看精品一区| 国产精品国产三级国产aⅴ中文 | 久久精品夜夜夜夜久久| 日本不卡中文字幕| 日韩欧美激情在线| 久久精品国产久精国产爱| 欧美亚一区二区| 亚洲一区二区三区不卡国产欧美| 91在线播放网址| 国产精品色婷婷| 色综合久久久久| 日本伊人色综合网| 91精品国产麻豆| 美女一区二区久久| 中文字幕乱码久久午夜不卡| 色婷婷av一区二区三区之一色屋| 亚洲精品久久嫩草网站秘色| 欧美zozo另类异族| 国产精品白丝jk黑袜喷水| 最新热久久免费视频| 在线观看免费成人| 日本成人超碰在线观看| 中文字幕不卡在线观看| 91福利在线免费观看| 麻豆91在线观看| 中文字幕免费不卡| 欧美性受xxxx| 国产乱子伦视频一区二区三区| 一区二区三区四区乱视频| 51午夜精品国产| 91网站黄www| 成人性色生活片| 青草国产精品久久久久久| 国产欧美日韩精品a在线观看| 欧美一二三区在线观看| 丰满白嫩尤物一区二区| 免费观看91视频大全| 亚洲午夜免费视频| 国产精品伦理一区二区| 欧美大片在线观看| 欧美色视频一区| 91猫先生在线| 91蝌蚪porny九色| a4yy欧美一区二区三区| 国产一区福利在线| 美女网站色91| 免费高清在线一区| 日韩影院精彩在线| 日本人妖一区二区| 天涯成人国产亚洲精品一区av| 国产精品福利电影一区二区三区四区| 国产亚洲精品aa| 久久理论电影网| 久久久蜜臀国产一区二区| 成人高清免费在线播放| 免费成人在线观看| 日韩vs国产vs欧美| 奇米色777欧美一区二区| 一区二区免费视频| 视频一区中文字幕| 免费成人在线观看视频| 丝袜美腿亚洲一区| 国产iv一区二区三区| 成人精品鲁一区一区二区| 国产风韵犹存在线视精品| 成人激情小说乱人伦| 成人天堂资源www在线| yourporn久久国产精品| 777午夜精品视频在线播放| 日韩丝袜情趣美女图片| 精品嫩草影院久久| 亚洲日本在线视频观看| 麻豆国产欧美日韩综合精品二区| 蜜臀91精品一区二区三区| 国产成人精品www牛牛影视| 欧美亚洲一区二区在线| 欧美精品一区二区三区在线播放| 欧美激情一区二区三区四区| 亚洲视频在线观看三级| 精品一区二区三区视频在线观看| 成人v精品蜜桃久久一区| 欧美伦理影视网| 亚洲男人的天堂av| 国产成人鲁色资源国产91色综 | 国产欧美视频在线观看| 偷拍亚洲欧洲综合| 99综合影院在线| 国产亚洲一区二区在线观看| 婷婷一区二区三区| 91在线码无精品| 国产日产欧美一区二区三区| 国产一区二区三区免费在线观看| 欧美日韩国产首页| 亚洲成人资源在线| 91精品婷婷国产综合久久性色| 夜夜精品视频一区二区| 92国产精品观看| 一区二区三区在线视频免费观看| 另类综合日韩欧美亚洲| 91精品视频网| 国模少妇一区二区三区| 久久久天堂av| 99国产精品久| 成人免费一区二区三区视频| 色爱区综合激月婷婷| 亚洲一线二线三线视频| 精品日韩欧美在线| 国产精品影视在线| 中文字幕一区二区三区四区| 不卡视频在线观看| 五月天国产精品| 中文字幕精品一区| 欧美在线观看视频一区二区三区| 性做久久久久久免费观看欧美| 欧美一级黄色录像| 成人精品视频一区| 老司机精品视频一区二区三区| 久久久精品天堂| 欧美在线视频不卡| 国产精品美女一区二区在线观看| 91免费看片在线观看| 另类成人小视频在线| 久久精品视频免费观看| 日本电影欧美片| 成人黄色大片在线观看| 欧美96一区二区免费视频| 国产精品久久综合| 欧美成人a视频| 欧美视频中文字幕| 国产黄色精品网站| 蜜臀久久久99精品久久久久久| 国产精品女上位| 26uuu亚洲综合色欧美| 91麻豆精品91久久久久同性| av男人天堂一区| 99这里只有久久精品视频| 国产美女精品在线| 美女视频黄久久| 日韩成人午夜电影| 日产欧产美韩系列久久99| ww久久中文字幕| 欧美高清一级片在线| 欧美性猛交xxxx乱大交退制版| 不卡一区在线观看| 91在线精品秘密一区二区| 成人午夜视频免费看| 粉嫩aⅴ一区二区三区四区五区 | 天天色 色综合| 日本伊人午夜精品| 韩国av一区二区三区四区 | 国产麻豆午夜三级精品| 极品瑜伽女神91| 国产一区二区三区免费观看| 国产一区二区三区黄视频 | 伊人色综合久久天天| 精品国产亚洲在线| 久久久久久久综合日本| 日本一区二区三区电影| 国产精品护士白丝一区av| 亚洲欧美国产三级| 亚洲一区中文在线| 狠狠狠色丁香婷婷综合激情| 国产成人综合亚洲网站| 欧美性生活一区| 亚洲国产精品国自产拍av| 亚洲国产视频在线| 免费在线看一区| 日本福利一区二区| 欧美精品一区二区三区蜜桃| 中文字幕一区二区不卡| 午夜精品免费在线| 色哟哟在线观看一区二区三区| 日韩午夜激情av| 一区二区不卡在线播放 | 美腿丝袜亚洲色图| 精品视频免费看| 亚洲摸摸操操av| 国产精品123区| 久久久不卡网国产精品一区| 日韩一区欧美二区| 欧美精品 国产精品| 亚洲日本乱码在线观看| 成人免费看片app下载| 国产欧美精品一区二区色综合朱莉 | av亚洲精华国产精华| 久久久久久久久久久久久久久99 | 国产精品欧美一级免费| 国产黄人亚洲片| 国产午夜久久久久| 成人听书哪个软件好| 国产精品国产三级国产| 99综合电影在线视频| 亚洲精品成人少妇| 欧美日韩国产123区| 蜜臀av一级做a爰片久久| 欧美一卡2卡3卡4卡| 毛片av一区二区|