<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邋遢居

    我的Java天堂

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

    #

    ?

    gef項目中連線一直扮演這個不可或缺的角色。碰巧前段時間有個機會好好的看了這個部分的內容。下面就把我的一點點認識和大家分享。

    首先要在模型上支持,能夠保存連接的信息。對于不同的項目有不同的要求。我們通過兩個例子就可以看出這一點來。

    1http://www13.plala.or.jp/observe/GEF/示例中的GEF6.zip (下面稱這個例子為HelloWold

    運行的結果入下圖所示:

    hellwoui.jpg

    它的模型可以使用如下的類圖來表示:

    LineConnectionModel-i.jpg

    用來描述Connection的分別是LineConnectionModelArrowConnectionModel這兩個類。這兩個類的父類和圖形模型(HellowModel)相關。

    2IBM紅皮書中的GEF范例(下面稱這個例子為workflow)

    運行效果如下圖:

    gefrun.jpg

    他的模型可用下面的類圖描述:

    gefredbook.jpg

    其實連接的模型應該很簡單,他只要能保存他的兩端的對象就好了。圖形模型(如HelloWold中的HelloModel)能夠保持與他相關連的連接(HelloWold中的LineConnectionModelArrowConnectionModel)。

    看完了Model,我們下面就可以看看EditPart部分了。

    要看EditPart當然是要看最關鍵的了。也就是和連接直接關聯的EditPart了。分別察看了和連接相關的EditPart,發現他們都會實現一個叫org.eclipse.gef.NodeEditPart的接口。如下圖所示:

    ShapeEditPart-a.jpg

    nodeEditPart中有四個方法需要實現。通過這個四個方法的名字就可以看出他們和Anchor2密切相關。下面就來看看這幾個方法的具體功能:

    ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection);

    當需要畫連接的時候,通過這個方法獲取連接的源錨點。不管這個錨點在什么位置,他取得以后直接就用它作為源點了。

    ConnectionAnchor getSourceConnectionAnchor(Request request);

    當在準備創建連接的時候,通過Request來獲取新連接的源錨點。

    另外的兩個就不再啰嗦了。是為了獲得目標的錨點。


    但是我們肯定看到了HelloWoldWorkflow中的連接有點不一樣。HelloWold中直接是圖元上的,而workflow是通過連接基本圖元上面的一個子圖元而連接的。簡單來說就是他們連接的anchor有點不一樣,這樣就會出現執行結果的不同。

    下面來看看他們到底是怎么實現的。根據上面提到的。錨點的獲取是通過getSourceConnectionAnchorgetTargetConnectionAnchor方法來獲取的。我們只需要好好比對一下他們這幾個方法的不同就可以了。

    HelloWold中的getSourceConnectionAnchor

    public ConnectionAnchor getSourceConnectionAnchor(Request request) {

    returnnew ChopboxAnchor(getFigure());

    }

    這里就簡單的創建一個 ChopboxAnchor 就好了。這個就可以直接連到該Figure上了。

    workflow中這個情況稍微有一點復雜了。先不說,還是看看他的 getSourceConnectionAnchor 是怎么實現的。

    public ConnectionAnchor getSourceConnectionAnchor(

    ConnectionEditPart connection) {

    Connection edge = (Connection) connection.getModel();

    return getNodeFigure().getConnectionAnchor(edge.getSource().getName());

    }


    /**

    *returnsananchorgivenitsname

    *

    *@paramportNamenameoftheanchor

    *@returntheanchorwiththename<code>portName</code>

    */

    public ConnectionAnchor getConnectionAnchor(String portName) {

    return (ConnectionAnchor)connectionAnchors.get( portName );

    }


    protected Hashtable connectionAnchors = new Hashtable(7);


    /**

    *Addaninputportanditsanchor

    *

    *@paramportName

    *uniquenametorefertotheport

    */

    publicvoid addInput(String portName) {

    InputPortFigure inputPort = new InputPortFigure();

    add(inputPort);


    PortConnectionAnchor anchor = new PortConnectionAnchor(inputPort);

    getTargetConnectionAnchors().add(anchor);

    connectionAnchors.put(portName, anchor);

    }


    通過這幾個方法可以看出它是在添加Input時候就創建好了一個和PortFigure 相關Anchor并把它保存起來。在要用的時候就把它取出來。這樣就搞定了。

    具體的可以參考這兩個例子的代碼。好了,打完收工。


    參考文檔

    IBM 紅皮書

    1荒野困獸(老臉歸來)’blog

    2GEF 進階,第一部分: Anchor


    posted @ 2007-01-08 17:09 Jet Geng 閱讀(2837) | 評論 (1)編輯 收藏

    ?

    我想在我的EditPartViewer中獲取一個圖形元素把它拖放到一個swt控件中。實現在<<圖形編輯器中拖拽對象到swt控件>>一文有提到了。不過我在處理的時候,并不是按照他的那個方式來做的。我是根據當前點DragSourceEvent的位置來查找該點下的對象。看是否是我需要的對象,如果是就允許拖動。否則就不可以。

    問題在這里出來:當沒有出現滾動條的時候一切都很正常,當一出現滾動條就死活沒有辦法拖動了。最后才發現DragSourceEvent中的坐標是按照屏幕來得,而EditPartViewer 中的坐標是按照他的那個viewer來得。這個地方需要轉換一下。



    這個轉換的動作發現在jfireorg.nightlabs.editor2d.util.EditorUtil https://svn.jfire.org/svn/main/trunk/org.nightlabs.editor2d/src/org/nightlabs/editor2d/util/EditorUtil.java)中有現成的。不多說了,拿來用吧。

    posted @ 2007-01-05 20:32 Jet Geng 閱讀(563) | 評論 (0)編輯 收藏

    ?

    近來看了點Ant的東西,想Ant真的很強。在使用的過程中發現,開發項目的過程中使用到的Ant其實并不多,只是有時候只是需要換一下其中的個別參數就可以重新用了。如果把這些重復的情況,寫成不同的build.xml的模板。定制成不同的任務,通過快捷鍵來調出,最后自動的執行ant腳本。呵呵,想想就是一個很不錯的主意。

    說干就干了。定義一些Action,和快捷鍵幫定就不多說了。生成build.xml通過你自己喜歡的代碼生成技術(個人喜歡用JET4)定義模板并生成代碼。

    下面在自動執行Ant腳本的時候卡了一會殼。看到《以編程方式調用 Apache Ant

    2 覺得問題已經解決了。不過這種方式是在Eclipse 運行的VM中執行,也就是說會把Eclipse 掛住。我希望達到的效果是和org.eclipse.ant.ui插件達到的效果一樣。最好是去調用他了。他是在eclipse默認集成的,直接依賴于他不會有什么問題。看了他plugin.xml發現了一個好東西“org.eclipse.debug.core.launchConfigurationTypes”,所以我就想我創建一個ILaunchConfigurationType 用它來實實例化一個ILaunchConfigurationWorkingCopy是不是就可以搞定了。上網google了一下有個兄弟寫完了這個部分的工作1。把他的代碼放到一個插件里面簡單的跑了一下,果然可行。爽!

    ?

    參考文檔:


    1. Eclipse 3.1 Update to “How to run ANT files programmatically”

    2. 以編程方式調用 Apache Anthttp://www.ibm.com/developerworks/cn/websphere/library/techarticles/0502_gawor/0502_gawor.html

    3. 代碼范例http://dev.eclipse.org/mhonarc/lists/platform-ant-dev/msg01053.html

    4. http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html

    posted @ 2006-12-30 16:13 Jet Geng 閱讀(2672) | 評論 (1)編輯 收藏

    大家肯定都知道在Eclipse中獲得當前活動的workbenchWindow可以采用如下的方式來完成。

    PlatformUI.getWorkbench().getActiveWorkbenchWindow()

    Plugin類中) getDefault().getWorkbench().getActiveWorkbenchWindow() 。一般情況下這兩個方式能夠很好的工作。但是突然有一天發現他不能工作了。郁悶我都不行了。察看了一下變量如下圖display.jpg

    這個activatedWindow明明有啊,怎么就取不到呢。

    打開代碼一看,看到 org.eclipse.ui.internal.Workbench 類中的 getActiveWorkbenchWindow 方法。

    public ?IWorkbenchWindow?getActiveWorkbenchWindow()?{
    ????????
    // ?Return?null?if?called?from?a?non-UI?thread.
    ????????
    // ?This?is?not?spec'ed?behaviour?and?is?misleading,?however?this?is?how
    ????????
    // ?it
    ????????
    // ?worked?in?2.1?and?we?cannot?change?it?now.
    ????????
    // ?For?more?details,?see?[Bug?57384]?[RCP]?Main?window?not?active?on
    ????????
    // ?startup
    ???????? if ?(Display.getCurrent()? == ? null )?{
    ????????????
    return ? null ;
    ????????}

    ????????
    // ?Look?at?the?current?shell?and?up?its?parent
    ????????
    // ?hierarchy?for?a?workbench?window.
    ????????Control?shell? = ?display.getActiveShell();
    ????????
    while ?(shell? != ? null )?{
    ????????????Object?data?
    = ?shell.getData();
    ????????????
    if ?(data? instanceof ?IWorkbenchWindow)?{
    ????????????????
    return ?(IWorkbenchWindow)?data;
    ????????????}
    ????????????shell?
    = ?shell.getParent();
    ????????}

    ????????
    // ?Look?for?the?window?that?was?last?known?being
    ????????
    // ?the?active?one
    ????????WorkbenchWindow?win? = ?getActivatedWindow();
    ????????
    if ?(win? != ? null )?{
    ????????????
    return ?win;
    ????????}

    ????????
    // ?Look?at?all?the?shells?and?pick?the?first?one
    ????????
    // ?that?is?a?workbench?window.
    ????????Shell?shells[]? = ?display.getShells();
    ????????
    for ?( int ?i? = ? 0 ;?i? < ?shells.length;?i ++ )?{
    ????????????Object?data?
    = ?shells[i].getData();
    ????????????
    if ?(data? instanceof ?IWorkbenchWindow)?{
    ????????????????
    return ?(IWorkbenchWindow)?data;
    ????????????}
    ????????}

    ????????
    // ?Can't?find?anything!
    ???????? return ? null ;
    ????}

    程序跑到 Display.getCurrent() 這一絕句就給我掉鏈子(返回了一個 null )。就是他,就是他了!到網上 google 了一下。看看在什么狀況下他會返回一個 null. http://wiki.eclipse.org/index.php/FAQ_How_do_I_get_a_Display_instance%3F 找到了。

    他說, Display 永遠和創建他的線程聯系在一起,并且一個線程擁有一個活動的 Display 。在創立 Display 的線程中可可以通過 Display.getCurrent() 獲得當前活動的 Display 。如果出了這個線程就看不到這個 Display 了。如果有的線程不擁有 Display ,那它的 Display.getCurrent() 就只能得到 null 了。

    回頭看了一下我的代碼,我是在新建的線程中啟動了調用了這個方法。難怪他不給面子呢!


    參考文獻:

    http://wiki.eclipse.org/index.php/FAQ_How_do_I_get_a_Display_instance%3F

    http://help.eclipse.org/help31/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html

    posted @ 2006-12-04 15:01 Jet Geng 閱讀(2671) | 評論 (0)編輯 收藏

    以前不知道有Ocl這個東西,前幾天有幸看到。深深被他吸引了。拋開其他的不說,就他的查詢功能的就讓人激動不已了:)

    現在只是看了

    oclQueryExmaple

    Querying EMF Models with OCL


    在項目中簡單的使用了一下他作為查詢的工具。感覺他真的很不錯,在下一段時間將會重點去了解他。

    posted @ 2006-11-11 20:30 Jet Geng 閱讀(743) | 評論 (0)編輯 收藏

    ??? 前面一段時間有一個需求就是從swt控件中拖拽對象到圖形編輯器中(就是class org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor 的兒子們)編輯器。

    后來就想假如我需要從圖形編輯器中拖拽對象到swt控件中又該怎么做。
    經過一段時間的探索,終于搞定了。

    記下如下過程,希望對需要的朋友有點幫助。

    首先有了《從SWT控件中托拽對象到GEF編輯器中》文中對addDropTargetListener方法使用的經歷,很快就確定我需要對GraphicalViewer添加一個DragSourceListener

    想著到這個地方我應該可以很快收工了。但是添加完了以后發現原來的拖動功能都沒有了,這個怎么回事。誰在后面搞鬼。

    經過一段時間的狂搜濫索終于找到了問題的關鍵。因為GEF不允許同時有兩個活動 DragSource

    它本身已經擁有一個DragSource了(編輯器內部的托拽),我們這時候添加一個就會存在多

    DragSource了。當我添加一個新的DragSource時候我們新家的DragSource就會被認為是默認的DragSource

    他以前的DragSource就失效了。這不是我像看到的。

    怎么處理。看到了一個牛人的解決方案。


    What I made to fix the problem was to only allow my DragSource to act under certain 
    conditions (in my application this happens when you click and drag the mouse AND
    ?the SHIFT key is pressed). So when the SHIFT key is not pressed my DragSource does
    nothing and the editor's internal drag and drop works fine。

    public void dragStart(DragSourceEvent event)
    {
    ...

    if (!condition.isValid())
    event.doit = false;

    ...
    }

    我嘗試了一下這種狀況,一下就搞定了。
    在我的項目中,由于還有一些數據需要轉化。呵呵,感覺不錯。

    參考文檔:
    http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg15754.html
    posted @ 2006-11-11 19:56 Jet Geng 閱讀(2969) | 評論 (1)編輯 收藏

    前一段日子荒廢了很多。現在該是重整旗鼓的時候了。不要在想,不要猶豫,直接做就好了。
    嗯,我回來了。
    posted @ 2006-11-09 21:53 Jet Geng 閱讀(482) | 評論 (0)編輯 收藏

    茶藝學習筆記

    前兩天拜了一個茶藝師父。今天師父正式給我上了一下午的課,感覺收獲很多。其實我師父已經給我上過很多課了,不過弟子不怎么好學沒有加以整理。今天就把學習到的東西稍微整理一下吧。防止以后會忘了。

    先來說說砌茶的三要素吧!

    1、水溫

    水溫是指砌茶,水的溫度。不同種類的茶對溫度的要求不一樣。一般來說綠茶類的溫度控制在80?C90?C(不同的茶可能要求有些差別)。紅茶、花茶、普洱茶要求水溫控制在90?C向上。我的理解是從不發酵到發酵的茶,要求的水溫是逐步上升的。

    砌綠茶的時候如果水溫過高,會在短時間內把茶葉燙熟。特別是嫩芽(碧螺春就是一個典型代表)更是如此。

    2、茶量

    茶量就是放入茶葉的多少。這個師父沒有強調太多,這是說不同的茶的要求不一樣。一般的用小蓋碗砌茶的話8克~10(不同的茶有不同要求)。然后師父留了一句話說,這個要多實踐。

    3、時間

    這個時間是指茶葉在茶湯里浸泡的時間。原則上是第一道在一分鐘左右,第二道和第三道的時間在第一道的時間上遞減。到了一定的程度以后時間要適當的加長。

    具體的趨勢可以下面的圖表表示:


    tea.jpg

    橫坐標表示茶的道數,縱坐標表示砌茶的時間。這個只是一個趨勢,其實里面的數據是不準確的。對于黑茶系(普洱為代表的)的茶沖泡的道數可能會多一點。但是綠茶沖泡的次數就要少一點(34道)。

    這張表,表示的只是在說明第一道時候時間茶沒有泡開需要的時間要長一點,等第二道,第三道的時候茶泡開了,時間就要相對短一點。但是隨著道數的增加,茶會越來越淡。這個時候就需要通過加長時間來彌補這個帶來的影響。直到這次茶葉不能再用為止。


    posted @ 2006-09-17 23:47 Jet Geng 閱讀(1099) | 評論 (0)編輯 收藏

    SWT控件中托拽對象到GEF編輯器中

    一般情況下GEF程序都是采用如下的界面:


    gef.jpg

    新建對象的操作時通過拖拽Palette中元素到編輯而獲得。但是有時候可能需要從SWT,操作系統拖一些元素到GEF編輯器中來。

    下面我就把創建這樣的拖拽過程大概的描述一下:

    1、定義拖拽源(DragSource)。

    2、定義拖拽目標的監聽(DropTarget)。

    到這里對于一般的拖拽其實是可以完工了。

    這個部分可以參考weidagang2046的專欄的《DND入門學習

    但是要能讓GraphicalViewer這個對象扮演起DropTarget我們還需要做點其他的工作。GraphicalViewer這個類本身提供了一個addDropTargetListener方法。看到這個方法是不是一陣狂喜啊。如果有也是應該的,因為這個方法就是我們解決前面提出問題的關鍵。

    好了看看他的聲明吧!

    				
    						
    								public void addDropTargetListener(TransferDropTargetListener?listener)
    						
    				
    		

    他這個參數居然不是 DropTargetListener 。這個 TransferDropTargetListener 是一個什么玩意啊!

    help 中查到:

    public interface TransferDropTargetListener
    extends TransferDropTargetListener

    A DropTragetListener that handles one type of SWT Transfer. The purpose of a TransferDropTargetListener is to:

    • Determine enablement for a Drop operation. Enablement is often a function drop location, and/or criteria.

    • When enabled, optionally showing feedback on the DropTarget.

    • Performing the actualy Drop

    DelegatingDropAdapter allows these functions to be implemented separately for unrelated types of Drags. DelegatingDropAdapter then combines the function of each TransferDropTargetListener, while allowing them to be implemented as if they were the only DragSourceListener.

    偷下懶,就不翻譯了。

    創建如下類來實現這個接口:

    public class TreeNodeTransferDropTargetListener extends

    AbstractTransferDropTargetListener {


    public TreeNodeTransferDropTargetListener(EditPartViewer editPartViewer) {

    // 改類默認是處理 TextTransfer 類型的拖拽事件

    super (editPartViewer,TextTransfer.getInstance());

    // TODO Auto-generated constructor stub

    }


    @Override

    protected void updateTargetRequest() {

    }


    }

    我們這個拖拽想是讓他執行一個 create 命令。所以下面就是要重載他的 createTargetRequest() 用來處理 create 對象的請求( CreateRequestion )。 CreateRequetion 需要使用到一個類,幫助我們創建對象的工廠類。 GEF 給了我們這樣的一個接口 CreationFactory 。下面我們取實現他就好了。


    package org.eclipse.gef.examples.shapes.rcp.views;


    import org.eclipse.gef.examples.shapes.model.EllipticalShape;

    import org.eclipse.gef.requests.CreationFactory;


    public class TypeCreationFactory implements CreationFactory {


    public Object getNewObject() {

    // TODO Auto-generated method stub

    EllipticalShape label = new EllipticalShape();

    return label;

    }


    public Object getObjectType() {

    return EllipticalShape. class ;

    }


    }


    注意:這里的 getNewObject 是返回要創建類的一個對象實例。 GetObjectType 需要返回需要創建對象的類。這個可不要搞反了。

    這樣我們就可以把我們的 TreeNodeTransferDropTargetListener 類中的 createTargetRequest 方法加上了。


    private TypeCreationFactory factory = new TypeCreationFactory();

    protected Request createTargetRequest() {

    CreateRequest request = new CreateRequest();

    request.setFactory( factory );

    return request;

    }


    好了這個時候不要客氣了,加上

    protected void handleDragOver() {

    getCurrentEvent(). detail = DND. DROP_MOVE |DND. DROP_COPY ;

    super .handleDragOver();

    }


    @Override

    protected void handleDrop() {

    //String s = (String)getCurrentEvent().data;

    //factory.setText(s);

    super .handleDrop();

    }

    這樣的方法吧。

    這樣這個功能就完成了。


    參考文獻:

    http://m.tkk7.com/weidagang2046/archive/2006/09/05/67707.html

    http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html


    posted @ 2006-09-12 17:16 Jet Geng 閱讀(3507) | 評論 (7)編輯 收藏

    在開發過程中經常需要把一些配置文件進行合并。一般情況下這些配置文件都是使用xml格式進行存儲的。對配置文件進行合并,說到底就變成了對xml的合并。

    有了這樣的需求就的好好想想有那些方案了。稍微的想了想(肯定不完整了)合并xml可行方案:

    1、使用dom4jsaxxml解析工具對需要合并的xml代碼進行分析、比較并合并。

    <<Java中合并XML文檔的設計與實現>>(http://fanqiang.chinaunix.net/program/html/2005-06-16/3313.shtml)一文就是采用的這種方式實現了。

    2、采用xsltxml進行合并。

    在這兩個技術中,我是重點的看了一下第二種。原因是以前對xslt有一點了解,而且不用我自己去控制遞規循環這樣比較容易出錯的環節。

    還有就是使用 xslt 有很多很不錯的調試環境可以使用如 xmlspy,stylus studio 等。可以直接看到調試過程。最后有幸在網上看到了一個老外寫的一個用于合并 xml xslt http://www2.informatik.hu-berlin.de/~obecker/XSLT/#merge )。用 xmlspy 跑了一下,當時感覺就是一個“爽”了得。狂喜過后,就開始思考想想如何用 java 實現這個 xslt 的轉換過程了。其實這也是一個很簡單的過程。使用 dom4j 用下面的代碼就可以實現:

    public ?Document?styleDocument(

    Document?document,

    String?stylesheet

    )?
    throws ?Exception?{

    // ?load?the?transformer?using?JAXP

    TransformerFactory?factory?
    = ?TransformerFactory.newInstance();

    Transformer?transformer?
    = ?factory.newTransformer(

    new ?StreamSource(?stylesheet?)

    );

    // ?now?lets?style?the?given?document

    DocumentSource?source?
    = ? new ?DocumentSource(?document?);

    DocumentResult?result?
    = ? new ?DocumentResult();

    transformer.transform(?source,?result?);

    // ?return?the?transformed?document

    Document?transformedDoc?
    = ?result.getDocument();

    return ?transformedDoc;

    }

    就用這樣的代碼一跑,他居然,居然沒有得到我想要的結果。郁悶啊!直接想去找塊豆腐,一頭撞死算了。但是在死前還是要把這個問題解決掉。要不死也不甘心。簡單的分析一下,在xmlspy中可以使用,說明xslt肯定沒有問題。那有問題的肯定是xslt 處理器有問題。你有問題我換不就的了嗎。最后我換成了如下的情況:

    < dependency >
    ??????
    < groupId > dom4j </ groupId >
    ??????
    < artifactId > dom4j </ artifactId >
    ??????
    < version > 1.6.1 </ version >
    ????
    </ dependency >
    ????
    < dependency >
    ??????
    < groupId > net.sf.saxon </ groupId >
    ??????
    < artifactId > saxon </ artifactId >
    ??????
    < version > 8.5.1 </ version >
    ????
    </ dependency >
    ??
    </ dependencies >

    重新跑了一下,ok了。沒有問題了。

    下面的任務就是對這個功能進行簡單的封裝一下。然需要xml合并的地方能夠很容易的調用他。



    posted @ 2006-08-23 17:21 Jet Geng 閱讀(2265) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 久久国产精品国产自线拍免费| 亚洲中文字幕久在线| 成人精品国产亚洲欧洲| 成人免费毛片视频| 学生妹亚洲一区二区| 成人性生交视频免费观看| 中文有码亚洲制服av片| 成年女人18级毛片毛片免费观看| 亚洲中文字幕无码一去台湾| 成人免费网站在线观看| 亚洲AV永久无码天堂影院| 国产一级淫片免费播放电影| 免费观看又污又黄在线观看| 在线播放亚洲第一字幕| 免费国产成人午夜在线观看| 色播亚洲视频在线观看| 皇色在线视频免费网站| 亚洲AV色无码乱码在线观看 | 亚洲黄色免费在线观看| 亚洲一区免费在线观看| 免费看大黄高清网站视频在线| 色九月亚洲综合网| 亚洲色欲色欲www在线丝| 免费网站看av片| 中文字幕乱码亚洲无线三区 | 国产亚洲精品国产福利在线观看| 免费一级毛片在播放视频| 日韩av无码免费播放| 亚洲春色在线观看| 国产精品久久久久影院免费| 中国一级毛片视频免费看| 亚洲综合男人的天堂色婷婷| 在线观着免费观看国产黄| a级毛片免费全部播放| 亚洲AV日韩综合一区尤物 | 国产AV无码专区亚洲Av| 思思re热免费精品视频66| 日韩精品视频在线观看免费| 久久久久亚洲av无码专区蜜芽| 最近免费中文字幕大全视频 | 亚洲国产人成在线观看69网站 |