wbrcomponentpeer.java

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· Java 代码 · 共 588 行 · 第 1/2 页

JAVA
588
字号
    
    public long sendMouseEvent(MouseEvent e) {
        long ret = 0;
        int wm = 0;
        final int modifiers = e.getModifiers();        
        int wParam =
            (( 0 != (modifiers & MouseEvent.CTRL_MASK) ) ? 0x0008/*MK_CONTROL*/ : 0)
            | (( 0 != (modifiers & MouseEvent.SHIFT_MASK) ) ? 0x0004/*MK_SHIFT*/ : 0)
            | (( 0 != (modifiers & MouseEvent.BUTTON1_DOWN_MASK) ) ? 0x0001/*MK_LBUTTON*/ : 0)
            | (( 0 != (modifiers & MouseEvent.BUTTON3_DOWN_MASK) ) ? 0x0002/*MK_RBUTTON*/ : 0)
            | (( 0 != (modifiers & MouseEvent.BUTTON2_DOWN_MASK) ) ? 0x0010/*MK_MBUTTON*/ : 0);
        int lParam = e.getX() + (e.getY() << 16 );
        if( MouseEvent.MOUSE_PRESSED==e.getID() ){
            switch(e.getButton()){
            case MouseEvent.BUTTON1:
                wm = 0x0202; //WM_LBUTTONUP
                break;
            case MouseEvent.BUTTON3:
                wm = 0x0205; //WM_RBUTTONUP
                break;
            case MouseEvent.BUTTON2:
                wm = 0x0208; //WM_MBUTTONUP
                break;
            }
            nativeSendMouseEvent(WND_PARENT, wm, wParam, lParam);            
        }
        nativeSetTransparent(false);
        //System.out.println("MouseEvent  m:" + e.getModifiers() + " " + e);
        switch(e.getID()){
        case MouseEvent.MOUSE_PRESSED:
            switch(e.getButton()){
            case MouseEvent.BUTTON1:
                wm = 0x0201; //WM_LBUTTONDOWN             
                wParam |= 0x0001/*MK_LBUTTON*/; 
                break;
            case MouseEvent.BUTTON3:
                wm = 0x0204; //WM_RBUTTONDOWN
                wParam |= 0x0002/*MK_RBUTTON*/;
                break;
            case MouseEvent.BUTTON2:
                wm = 0x0207; //WM_MBUTTONDOWN
                wParam |= 0x0010/*MK_MBUTTON*/;
                break;
            }
            break;
        case MouseEvent.MOUSE_RELEASED:
            switch(e.getButton()){
            case MouseEvent.BUTTON1:
                wm = 0x0202; //WM_LBUTTONUP
                break;
            case MouseEvent.BUTTON3:
                wm = 0x0205; //WM_RBUTTONUP
                break;
            case MouseEvent.BUTTON2:
                wm = 0x0208; //WM_MBUTTONUP
                break;
            }
            break;
        case MouseEvent.MOUSE_MOVED:
        case MouseEvent.MOUSE_DRAGGED:
            wm = 0x0200; //WM_MOUSEMOVE
            break;
        case MouseEvent.MOUSE_ENTERED:
            wm = 0x02A1; //WM_MOUSEHOVER
            break;            
        case MouseEvent.MOUSE_EXITED:
            if( hasFocus() ){
                //System.out.println("MouseEvent skipped");
            } else {
                wm = 0x02A3; //WM_MOUSELEAVE
            }    
            break;
        }
        if(0!=wm && !hasFocus()){
            int iHitTest = (int)nativeSendMouseEvent(
                WND_IE,
                0x0084,//WM_NCHITTEST
                0, e.getXOnScreen() + (e.getYOnScreen() << 16 ));
            if( MouseEvent.MOUSE_PRESSED==e.getID() )
                focusGain(false);
            /*
            if( MouseEvent.MOUSE_PRESSED==e.getID() ){
                //System.out.println("##focusGain!");
                long res = nativeSendMouseEvent(
                    WND_IE,
                    0x0021,//WM_MOUSEACTIVATE
                    (int)((WComponentPeer)target.getTopLevelAncestor().getPeer()).getHWnd(),
                    iHitTest //HTCLIENT
                    + (wm << 16 ));
                if(1==res || 2==res){
                    focusGain(false);                    
                }
                if(4==res || 2==res){
                    //discad message
                    return ret;
                }
            }*/
            nativeSendMouseEvent(
                WND_IE,
                0x0020,//WM_SETCURSOR
                0,
                iHitTest + (wm << 16 ));
            ret = nativeSendMouseEvent(
                 WND_IE,
                 wm,
                 wParam,
                 lParam);
        }
        if( !hasFocus() ){
            nativeSetTransparent(true);
        }            
        return ret;
    }

    native public void setEnabled(boolean enabled);
    native public void setVisible(boolean aFlag);

//    public boolean requestFocusInWindow() {
//        return true;  //To change body of implemented methods use File | Settings | File Templates.
//    }
    /**
     * Synchronous callback for notifications from native code.
     * @param iId the event identifier - <code>BrComponentEvent.DISPID_XXXX</code> const
     * @param stName the event name of (optional)
     * @param stValue the event paramenter(s) (optional)
     * @return the application respont
     */
    private String postEvent(
            int iId,
            String stName,
            String stValue)
    {
        switch(iId){
        case BrComponentEvent.DISPID_REFRESH:
            refreshHard();
            break;
        case BrComponentEvent.DISPID_DOCUMENTCOMPLETE:
            if(isEditable()!=editable){
                //System.out.println("setEditable(" + editable + ");");
                enableEditing(editable);
            } else if(editable) {
                //System.out.println("refreshHard");
                refreshHard();
            }
            documentReady = true;
            break;
        case BrComponentEvent.DISPID_ONFOCUCHANGE:
            isFocusOwner = Boolean.parseBoolean(stValue);
            break;
        case BrComponentEvent.DISPID_ONFOCUSMOVE:
            focusMove(Boolean.parseBoolean(stValue));
            break;
        case BrComponentEvent.DISPID_PROGRESSCHANGE:
            break;
        }        
        return target.processBrComponentEvent(
                new BrComponentEvent(target, iId, stName, stValue));
    }

    public Image getImage(int x, int y, int width, int height){
        BrComponent ie = (BrComponent)target;
        if(
            x < 0 ||
            y < 0 ||
            (x+width)>(ie.getX()+ie.getWidth()) ||
            (y+height)>(ie.getY()+ie.getHeight()) )
        {
            return null;
        }
        int[] imageData = ImageData(x, y, width, height);
        if(null==imageData || 0==imageData.length) {
            return null;
        }   

        int len = imageData.length - 2;
        int rwidth = imageData[len];
        int rheight = imageData[len + 1];

        DataBufferInt buffer = new DataBufferInt(imageData, len);
        WritableRaster raster = Raster.createPackedRaster(buffer, rwidth,
                                                          rheight, rwidth,
                                                          bandmasks, null);

        return new BufferedImage(directColorModel, raster, false, null);
    }
    
    public void paintClientArea(Graphics g, int iPaintHint)
    {
        if( target.isVisible()  ){
            //System.err.println("paintClientArea");
            Rectangle updateRect = g.getClipBounds();            
            if(null==updateRect){
                updateRect = target.getBounds();
            }
            if( null!=updateRect ){            
                if(updateRect.x < 0){
                    updateRect.width += updateRect.x;
                    updateRect.x = 0;
                }
                if(updateRect.y < 0){
                    updateRect.height += updateRect.y;
                    updateRect.y = 0;
                }
                if( 0<updateRect.width 
                    && 0<updateRect.height)
                {
                    //if(BrComponent.PAINT_NATIVE!=iPaintHint )
                    {
                        //System.err.println("getImage");
                        Image updateImage = getImage(
                            updateRect.x,                                                 
                            updateRect.y,
                            updateRect.width,
                            updateRect.height);
                        if( null!=updateImage ){
                            //System.err.println("getImage is");
                            g.drawImage(
                                updateImage,
                                updateRect.x,
                                updateRect.y,
                                null
                            );
                        }
                    }
                }    
            }    
        }    
    }

    public long getNativeHandle() {
        return data;
    }
    
    protected int notifyCounter = 0;    
    protected boolean showOnZero = true;
    
    public void onAddNotify() {
        if(0 == notifyCounter){
            if( !BrComponent.DESIGN_MODE ) {
                if( NativeLoadMgr.loadLibrary("jdicWeb") ) {
                    //init IDs for native callbacks on the first load
                    initIDs();
                }   
                for( Container c = target.getParent(); null != c; c = c.getParent() )
                {
                    ComponentPeer cp = c.getPeer();
                    if( (cp instanceof WComponentPeer) ){
                        parentHW = c;
                        data = create( ((WComponentPeer)cp).getHWnd(), target.paintAlgorithm);
                        acceptTargetURL();
                        setEditable(target.isEditable());
                        break;
                    }
                }
            } else if( !target.isMandatoryDispose() ){
                setVisible(showOnZero);
            }
        }
        ++notifyCounter;
    }

    public void onRemoveNotify() {
        --notifyCounter;                
       if( 0==notifyCounter ){
            showOnZero = target.isVisible();
            if( !target.isMandatoryDispose() ) {
                if(showOnZero){
                   setVisible(false);
                }
            } else if( 0!=data ) {
               destroy();
               data = 0;
            }
        }
    }

    public boolean isNativeReady() {
        return 0!=data;
    }

    public boolean isSelfPaint()
    {
        return false;
    }
    
    public JComponent getCentralPanel() {
        return target;
    }

    BrComponent target;
    long        data = 0;

}    

⌨️ 快捷键说明

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