亚洲欧美第一页_禁久久精品乱码_粉嫩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;
    }
    /**
     * 當前選擇的組件是否是可以拖拽的。可以拖拽的條件為:
     * 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一区二区三区免费野_久草精品视频
欧美理论片在线| 亚洲五月六月丁香激情| 亚洲激情在线播放| 免费精品视频最新在线| 91在线观看污| 国产欧美一区二区三区在线看蜜臀| 综合网在线视频| 国产福利一区在线| 欧美tickling网站挠脚心| 亚洲男人的天堂在线aⅴ视频| 麻豆精品视频在线观看| 欧美一a一片一级一片| 欧美极品美女视频| 蜜臀av一区二区| 欧美日韩精品一区二区三区蜜桃 | 青青青爽久久午夜综合久久午夜| 岛国精品在线播放| 欧美mv日韩mv亚洲| 午夜a成v人精品| 欧美午夜电影在线播放| 亚洲人成电影网站色mp4| 成人性视频网站| 久久精品人人做人人爽97| 美女高潮久久久| 欧美一级精品在线| 日韩高清在线一区| 欧美久久久久免费| 午夜精品123| 欧美区一区二区三区| 亚洲香肠在线观看| 欧美在线观看18| 亚洲国产精品一区二区久久恐怖片| 91在线小视频| 亚洲免费资源在线播放| 91视视频在线观看入口直接观看www| 欧美国产精品一区二区三区| 国产精品一区一区| 国产拍揄自揄精品视频麻豆| 国产一区二区三区不卡在线观看| 久久亚洲一级片| 丁香婷婷综合激情五月色| 日本一区二区成人| 成人深夜在线观看| 亚洲欧美一区二区三区国产精品 | 日本一区二区三区在线不卡| 国产一区二区三区四区五区美女| 久久久久久久久免费| 丁香激情综合五月| 亚洲另类色综合网站| 在线免费亚洲电影| 日日欢夜夜爽一区| 久久久久久9999| 99re6这里只有精品视频在线观看| 国产精品久99| 欧美视频在线一区| 美洲天堂一区二卡三卡四卡视频 | 亚洲视频网在线直播| 色噜噜狠狠一区二区三区果冻| 亚洲国产精品嫩草影院| 欧美成人女星排行榜| 高清不卡一二三区| 亚洲精选在线视频| 日韩午夜av电影| 成人黄色在线网站| 偷拍日韩校园综合在线| 久久综合精品国产一区二区三区| 成人中文字幕在线| 五月激情六月综合| 欧美国产一区在线| 欧美人狂配大交3d怪物一区| 国产精品资源在线观看| 亚洲精品视频在线观看免费| 欧美一区二区三区在线观看视频| 国产·精品毛片| 视频一区二区中文字幕| 中文字幕av一区二区三区高| 精品视频999| 粉嫩嫩av羞羞动漫久久久 | 亚洲美女电影在线| 精品福利视频一区二区三区| 91视频免费看| 国产一区二区网址| 天堂va蜜桃一区二区三区| 中文字幕亚洲一区二区av在线| 欧美伦理视频网站| 99精品国产一区二区三区不卡| 蜜臀av亚洲一区中文字幕| 亚洲欧美一区二区三区孕妇| 久久久久久久久免费| 日韩一区二区在线免费观看| 一本久道久久综合中文字幕 | 色综合色综合色综合| 麻豆成人久久精品二区三区红| 亚洲情趣在线观看| 国产精品嫩草99a| 精品处破学生在线二十三| 91精品在线观看入口| 色欧美日韩亚洲| 成人高清在线视频| 国产一区二区日韩精品| 免费一级欧美片在线观看| 一二三四区精品视频| 国产精品久久久久精k8 | 亚洲国产色一区| 亚洲免费资源在线播放| 国产精品电影一区二区| 亚洲国产高清aⅴ视频| 久久免费的精品国产v∧| 欧美mv日韩mv国产网站app| 欧美一区二区女人| 欧美一区二区私人影院日本| 欧美日韩一区二区三区在线| 欧美性欧美巨大黑白大战| 色噜噜狠狠一区二区三区果冻| 91香蕉视频mp4| 日本精品视频一区二区| 色老头久久综合| 欧美午夜宅男影院| 欧美精品99久久久**| 欧美一区二区在线看| 欧美人与禽zozo性伦| 欧美一级搡bbbb搡bbbb| 日韩欧美成人一区| 久久久久久一二三区| 国产精品你懂的在线欣赏| 亚洲欧美一区二区视频| 亚洲欧美激情在线| 亚洲一区二区三区自拍| 日韩国产欧美一区二区三区| 久久精品国产精品亚洲红杏| 国产一区在线看| av在线这里只有精品| 一本大道久久a久久精二百| 欧美久久一二区| 亚洲精品一区二区精华| 国产日韩欧美制服另类| 成人免费在线视频观看| 亚洲chinese男男1069| 麻豆传媒一区二区三区| 国产suv一区二区三区88区| 91污片在线观看| 欧美精品色综合| 国产精品色呦呦| 亚洲v日本v欧美v久久精品| 国产一区二区三区观看| 色综合天天天天做夜夜夜夜做| 777奇米成人网| 国产农村妇女毛片精品久久麻豆| 亚洲美女淫视频| 精品亚洲国内自在自线福利| 99综合影院在线| 91麻豆精品国产91久久久| 国产日本欧洲亚洲| 亚洲资源在线观看| 国产成人在线影院| 欧美三级中文字幕| 亚洲国产高清不卡| 日本不卡视频在线观看| 99久久综合狠狠综合久久| 3751色影院一区二区三区| 欧美韩国日本不卡| 美日韩一区二区三区| 91免费视频大全| 久久夜色精品国产欧美乱极品| 亚洲亚洲人成综合网络| 成人免费视频视频在线观看免费| 制服.丝袜.亚洲.另类.中文| 一区在线观看免费| 韩国精品免费视频| 欧美日本高清视频在线观看| 日韩一区中文字幕| 从欧美一区二区三区| 欧美一区二区精品| 亚洲一区自拍偷拍| av在线这里只有精品| 久久综合色婷婷| 日韩精品五月天| 欧美日韩在线亚洲一区蜜芽| 国产精品乱码一区二三区小蝌蚪| 久久er99精品| 91精品国产综合久久蜜臀| 亚洲最大成人网4388xx| 成人性生交大片免费看中文| 日韩久久精品一区| 日韩精品一级中文字幕精品视频免费观看 | 五月天欧美精品| 91高清视频在线| 亚洲欧美另类小说视频| 96av麻豆蜜桃一区二区| 中文字幕va一区二区三区| 国产精品18久久久久久久网站| 欧美成人一级视频| 日韩影院在线观看| 欧美一区二区在线观看| 日本强好片久久久久久aaa| 欧美三片在线视频观看| 午夜电影网亚洲视频| 91精品国产一区二区三区蜜臀| 亚洲一区二区在线视频| 欧美日韩国产中文|