Esempio n. 1
0
void OpNumberEdit::Layout(INT32 width, INT32 height)
{
	INT32 spinner_width = GetSpinnerWidth(m_spinner, height);
	INT32 spinner_height = height;

	if (!GetRTL())
	{
		m_spinner->SetRect(OpRect(width - spinner_width, 0, spinner_width, spinner_height));
		m_edit->SetRect(OpRect(0, 0, width - spinner_width - SPINNER_MARGIN, height));
	}
	else
	{
		m_spinner->SetRect(OpRect(0, 0, spinner_width, spinner_height));
		m_edit->SetRect(OpRect(spinner_width + SPINNER_MARGIN, 0, width - spinner_width - SPINNER_MARGIN, height));
	}
}
Esempio n. 2
0
AwtChoice* AwtChoice::Create(jobject peer, jobject parent) {


    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    jobject target = NULL;
    AwtChoice* c = NULL;
    RECT rc;

    try {
        if (env->EnsureLocalCapacity(1) < 0) {
	    return NULL;
	}
	AwtCanvas* awtParent;

	JNI_CHECK_NULL_GOTO(parent, "null parent", done);

	awtParent = (AwtCanvas*)JNI_GET_PDATA(parent);
	JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

	target = env->GetObjectField(peer, AwtObject::targetID);
	JNI_CHECK_NULL_GOTO(target, "null target", done);

	c = new AwtChoice();

	{
	    DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL |
	                  CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED;
	    DWORD exStyle = 0;
	    if (GetRTL()) {
	        exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
		if (GetRTLReadingOrder())
		    exStyle |= WS_EX_RTLREADING;
	    }

	    /*
	     * In OWNER_DRAW, the size of the edit control part of the
	     * choice must be determinded in its creation, when the parent
	     * cannot get the choice's instance from its handle.  So
	     * record the pair of the ID and the instance of the choice.
	     */
	    UINT myId = awtParent->CreateControlID();
	    DASSERT(myId > 0);
	    c->m_myControlID = myId;
	    awtParent->PushChild(myId, c);

	    jint x = env->GetIntField(target, AwtComponent::xID);
	    jint y = env->GetIntField(target, AwtComponent::yID);
	    jint width = env->GetIntField(target, AwtComponent::widthID);
	    jint height = env->GetIntField(target, AwtComponent::heightID);
	    
            jobject dimension = JNU_CallMethodByName(env, NULL, peer,
                                                     "preferredSize",
                                                     "()Ljava/awt/Dimension;").l;
            DASSERT(!safe_ExceptionOccurred(env));

            if (dimension != NULL && width == 0) {
                width = env->GetIntField(dimension, AwtDimension::widthID);
            }
	    c->CreateHWnd(env, L"", style, exStyle,
			  x, y, width, height,
			  awtParent->GetHWnd(),
			  reinterpret_cast<HMENU>(static_cast<INT_PTR>(myId)),
			  ::GetSysColor(COLOR_WINDOWTEXT),
			  ::GetSysColor(COLOR_WINDOW),
			  peer);

	    /* suppress inheriting parent's color. */
	    c->m_backgroundColorSet = TRUE;
            c->UpdateBackground(env, target);

            /* Bug 4255631 Solaris: Size returned by Choice.getSize() does not match
             * actual size
             * Fix: Set the Choice to its actual size in the component.
             */
            ::GetClientRect(c->GetHWnd(), &rc);
            env->SetIntField(target, AwtComponent::widthID,  (jint) rc.right);
            env->SetIntField(target, AwtComponent::heightID, (jint) rc.bottom);

            env->DeleteLocalRef(dimension);
	}
    } catch (...) {
        env->DeleteLocalRef(target);
	throw;
    }

done:
    env->DeleteLocalRef(target);

    return c;
}
/* Create a new AwtTextArea or AwtTextField object and window.   */
AwtTextComponent* AwtTextComponent::Create(jobject peer, jobject parent, BOOL isMultiline)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    jobject target = NULL;
    AwtTextComponent* c = NULL;

    try {
        if (env->EnsureLocalCapacity(1) < 0) {
            return NULL;
        }

        PDATA pData;
        AwtCanvas* awtParent;
        JNI_CHECK_PEER_GOTO(parent, done);

        awtParent = (AwtCanvas*)pData;
        JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

        target = env->GetObjectField(peer, AwtObject::targetID);
        JNI_CHECK_NULL_GOTO(target, "null target", done);

        if(isMultiline) {
            c = new AwtTextArea();
        } else {
            c = new AwtTextField();
        }

        {
            /* Adjust style for scrollbar visibility and word wrap  */
            DWORD scroll_style;

            if(isMultiline) {

                jint scrollbarVisibility =
                    env->GetIntField(target, AwtTextArea::scrollbarVisibilityID);

                switch (scrollbarVisibility) {
                case java_awt_TextArea_SCROLLBARS_NONE:
                    scroll_style = ES_AUTOVSCROLL;
                    break;
                case java_awt_TextArea_SCROLLBARS_VERTICAL_ONLY:
                    scroll_style = WS_VSCROLL | ES_AUTOVSCROLL;
                    break;
                case java_awt_TextArea_SCROLLBARS_HORIZONTAL_ONLY:
                    scroll_style = WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL;
                    break;
                case java_awt_TextArea_SCROLLBARS_BOTH:
                    scroll_style = WS_VSCROLL | WS_HSCROLL |
                                   ES_AUTOVSCROLL | ES_AUTOHSCROLL;
                    break;
                }
            }

            DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT;

            /*
             * Specify ES_DISABLENOSCROLL - RichEdit control style to disable
             * scrollbars instead of hiding them when not needed.
             */
            style |= isMultiline ?  ES_MULTILINE | ES_WANTRETURN | scroll_style
                     | ES_DISABLENOSCROLL : ES_AUTOHSCROLL;


            DWORD exStyle = WS_EX_CLIENTEDGE;
            if (GetRTL()) {
                exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
                if (GetRTLReadingOrder())
                    exStyle |= WS_EX_RTLREADING;
            }


            jint x = env->GetIntField(target, AwtComponent::xID);
            jint y = env->GetIntField(target, AwtComponent::yID);
            jint width = env->GetIntField(target, AwtComponent::widthID);
            jint height = env->GetIntField(target, AwtComponent::heightID);

            c->CreateHWnd(env, L"", style, exStyle,
                          x, y, width, height,
                          awtParent->GetHWnd(),
                          reinterpret_cast<HMENU>(static_cast<INT_PTR>(
                                  awtParent->CreateControlID())),
                          ::GetSysColor(COLOR_WINDOWTEXT),
                          ::GetSysColor(COLOR_WINDOW),
                          peer);

            // Fix for 4753116.
            // If it is not win95 (we are using Richedit 2.0)
            // we set plain text mode, in which the control is
            // similar to a standard edit control:
            //  - The text in a plain text control can have only
            //    one format.
            //  - The user cannot paste rich text formats, such as RTF
            //    or embedded objects into a plain text control.
            //  - Rich text mode controls always have a default
            //    end-of-document marker or carriage return,
            //    to format paragraphs.
            // [email protected]
            c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0);

            c->m_backgroundColorSet = TRUE;
            /* suppress inheriting parent's color. */
            c->UpdateBackground(env, target);
            c->SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN,
                           MAKELPARAM(1, 1));
            /*
             * Fix for BugTraq Id 4260109.
             * Set the text limit to the maximum.
             * Use EM_EXLIMITTEXT for RichEdit controls.
             * For some reason RichEdit 1.0 becomes read-only if the
             * specified limit is greater than 0x7FFFFFFD.
             */
            c->SendMessage(EM_EXLIMITTEXT, 0, 0x7FFFFFFD);

            /* Unregister RichEdit built-in drop target. */
            VERIFY(::RevokeDragDrop(c->GetHWnd()) != DRAGDROP_E_INVALIDHWND);

            /* To enforce CF_TEXT format for paste operations. */
            VERIFY(c->SendMessage(EM_SETOLECALLBACK, 0,
                                  (LPARAM)&GetOleCallback()));

            c->SendMessage(EM_SETEVENTMASK, 0, ENM_CHANGE);
        }
    } catch (...) {
        env->DeleteLocalRef(target);
        throw;
    }

done:
    env->DeleteLocalRef(target);

    return c;
}
/* Create a new AwtScrollPane object and window.   */
AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
    jobject target = NULL;
    AwtScrollPane* c = NULL;

    try {
        if (env->EnsureLocalCapacity(1) < 0) {
            return NULL;
        }

        PDATA pData;
        AwtComponent* awtParent;
        JNI_CHECK_PEER_GOTO(parent, done);

        awtParent = (AwtComponent*)pData;
        JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

        target = env->GetObjectField(self, AwtObject::targetID);
        JNI_CHECK_NULL_GOTO(target, "null target", done);

        c = new AwtScrollPane();

        {
            DWORD style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
            jint scrollbarDisplayPolicy =
                env->GetIntField(target, scrollbarDisplayPolicyID);

            if (scrollbarDisplayPolicy
                    == java_awt_ScrollPane_SCROLLBARS_ALWAYS) {
                style |= WS_HSCROLL | WS_VSCROLL;
            }
            DWORD exStyle = WS_EX_CLIENTEDGE;

            if (GetRTL()) {
                exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
                if (GetRTLReadingOrder())
                    exStyle |= WS_EX_RTLREADING;
            }

            jint x = env->GetIntField(target, AwtComponent::xID);
            jint y = env->GetIntField(target, AwtComponent::yID);
            jint width = env->GetIntField(target, AwtComponent::widthID);
            jint height = env->GetIntField(target, AwtComponent::heightID);
            c->CreateHWnd(env, L"", style, exStyle,
                          x, y, width, height,
                          awtParent->GetHWnd(),
                          reinterpret_cast<HMENU>(static_cast<INT_PTR>(
                awtParent->CreateControlID())),
                          ::GetSysColor(COLOR_WINDOWTEXT),
                          ::GetSysColor(COLOR_WINDOW),
                          self);
        }
    } catch (...) {
        env->DeleteLocalRef(target);
        throw;
    }

done:
    env->DeleteLocalRef(target);
    return c;
}
Esempio n. 5
0
AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    jstring label = NULL;
    jobject target = NULL;
    AwtCheckbox *checkbox = NULL;

    try {
        if (env->EnsureLocalCapacity(2) < 0) {
            return NULL;
        }

        AwtComponent* awtParent;
        JNI_CHECK_NULL_GOTO(parent, "null parent", done);

        awtParent = (AwtComponent*)JNI_GET_PDATA(parent);
        JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

        target = env->GetObjectField(peer, AwtObject::targetID);
        JNI_CHECK_NULL_GOTO(target, "null target", done);

        checkbox = new AwtCheckbox();

        {
            DWORD style = WS_CHILD | WS_CLIPSIBLINGS | BS_OWNERDRAW;
            LPCWSTR defaultLabelStr = L"";
            LPCWSTR labelStr = defaultLabelStr;
            DWORD exStyle = 0;

            if (GetRTL()) {
                exStyle |= WS_EX_RIGHT;
                if (GetRTLReadingOrder())
                    exStyle |= WS_EX_RTLREADING;
            }

            label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
            if (label != NULL) {
                labelStr = JNU_GetStringPlatformChars(env, label, 0);
            }
            if (labelStr != 0) {
                jint x = env->GetIntField(target, AwtComponent::xID);
                jint y = env->GetIntField(target, AwtComponent::yID);
                jint width = env->GetIntField(target, AwtComponent::widthID);
                jint height = env->GetIntField(target, AwtComponent::heightID);
                checkbox->CreateHWnd(env, labelStr, style, exStyle,
                                     x, y, width, height,
                                     awtParent->GetHWnd(),
                                     reinterpret_cast<HMENU>(static_cast<INT_PTR>(
                         awtParent->CreateControlID())),
                                     ::GetSysColor(COLOR_WINDOWTEXT),
                                     ::GetSysColor(COLOR_BTNFACE),
                                     peer);

                if (labelStr != defaultLabelStr) {
                    JNU_ReleaseStringPlatformChars(env, label, labelStr);
                }
            } else {
                throw std::bad_alloc();
            }
        }
    } catch (...) {
        env->DeleteLocalRef(label);
        env->DeleteLocalRef(target);
        throw;
    }

done:
    env->DeleteLocalRef(label);
    env->DeleteLocalRef(target);

    return checkbox;
}
Esempio n. 6
0
MsgRouting
AwtCheckbox::OwnerDrawItem(UINT /*ctrlId*/, DRAWITEMSTRUCT& drawInfo)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    if (env->EnsureLocalCapacity(4) < 0) {
        return mrConsume;
    }

    jobject self = GetPeer(env);
    jobject target = env->GetObjectField(self, AwtObject::targetID);

    HDC hDC = drawInfo.hDC;
    RECT rect = drawInfo.rcItem;
    int checkSize;
    UINT nState;
    SIZE size;

    jobject font = GET_FONT(target, self);
    jstring str = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
    size = AwtFont::getMFStringSize(hDC, font, str);

    jobject group = env->GetObjectField(target, AwtCheckbox::groupID);
    if (group != NULL)
        nState = DFCS_BUTTONRADIO;
    else
        nState = DFCS_BUTTONCHECK;

    if (GetState())
        nState |= DFCS_CHECKED;
    else
        nState &= ~DFCS_CHECKED;

    if (drawInfo.itemState & ODS_SELECTED)
        nState |= DFCS_PUSHED;

    if (drawInfo.itemAction & ODA_DRAWENTIRE) {
        VERIFY(::FillRect (hDC, &rect, GetBackgroundBrush()));
    }

    /* draw check mark */
    checkSize = GetCheckSize();
    RECT boxRect;

    boxRect.left = (GetRTL()) ? rect.right - checkSize : rect.left;
    boxRect.top = (rect.bottom - rect.top - checkSize)/2;
    boxRect.right = boxRect.left + checkSize;
    boxRect.bottom = boxRect.top + checkSize;
    ::DrawFrameControl(hDC, &boxRect, DFC_BUTTON, nState);

    /*
     * draw string
     *
     * 4 is a heuristic number
     */
    rect.left = rect.left + checkSize + checkSize/4;
    if (drawInfo.itemAction & ODA_DRAWENTIRE) {
        BOOL bEnabled = isEnabled();

        int x = (GetRTL()) ? rect.right - (checkSize + checkSize / 4 + size.cx)
                           : rect.left;
        int y = (rect.top + rect.bottom - size.cy) / 2;
        if (bEnabled) {
            AwtComponent::DrawWindowText(hDC, font, str, x, y);
        } else {
            AwtComponent::DrawGrayText(hDC, font, str, x, y);
        }
    }

    /* Draw focus rect */
    RECT focusRect;
    const int margin = 2; /*  2 is a heuristic number */

    focusRect.left = (GetRTL()) ? rect.right - checkSize - checkSize / 4 -
                                      2 * margin - size.cx
                                : rect.left - margin;
    focusRect.top = (rect.top+rect.bottom-size.cy)/2;
    focusRect.right = (GetRTL()) ? rect.right - checkSize - checkSize / 4 +
                                      margin
                                 : focusRect.left + size.cx + 2 * margin;
    focusRect.bottom = focusRect.top + size.cy;

    /*  draw focus rect */
    if ((drawInfo.itemState & ODS_FOCUS) &&
        ((drawInfo.itemAction & ODA_FOCUS)||
         (drawInfo.itemAction &ODA_DRAWENTIRE))) {
        VERIFY(::DrawFocusRect(hDC, &focusRect));
    }
    /*  erase focus rect */
    else if (!(drawInfo.itemState & ODS_FOCUS) &&
             (drawInfo.itemAction & ODA_FOCUS)) {
        VERIFY(::DrawFocusRect(hDC, &focusRect));
    }

    /*  Notify any subclasses */
    rect = drawInfo.rcItem;
    DoCallback("handlePaint", "(IIII)V", rect.left, rect.top,
               rect.right-rect.left, rect.bottom-rect.top);

    env->DeleteLocalRef(target);
    env->DeleteLocalRef(font);
    env->DeleteLocalRef(str);
    env->DeleteLocalRef(group);

    return mrConsume;
}
Esempio n. 7
0
/* Create a new AwtList object and window.   */
AwtList* AwtList::Create(jobject peer, jobject parent)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    jobject target = NULL;
    AwtList* c = NULL;

    try {
        if (env->EnsureLocalCapacity(1) < 0) {
            return NULL;
        }

        PDATA pData;
        AwtCanvas* awtParent;
        JNI_CHECK_PEER_GOTO(parent, done);

        awtParent = (AwtCanvas*)pData;
        JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

        /* target is Hjava_awt_List * */
        target = env->GetObjectField(peer, AwtObject::targetID);
        JNI_CHECK_NULL_GOTO(target, "null target", done);

        c = new AwtList();

        {

            /*
             * NOTE: WS_CLIPCHILDREN is excluded so that repaint requests
             * from Java will pass through the wrap to the native listbox.
             */
            DWORD wrapStyle = WS_CHILD | WS_CLIPSIBLINGS;
            DWORD wrapExStyle = 0;

            DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL |
                LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED;
            DWORD exStyle = WS_EX_CLIENTEDGE;

            /*
             * NOTE: WS_VISIBLE is always set for the listbox. Listbox
             * visibility is controlled by toggling the wrap's WS_VISIBLE bit.
             */
            style |= WS_VISIBLE;

            if (GetRTL()) {
                exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
                if (GetRTLReadingOrder())
                    exStyle |= WS_EX_RTLREADING;
            }

            jint x = env->GetIntField(target, AwtComponent::xID);
            jint y = env->GetIntField(target, AwtComponent::yID);
            jint width = env->GetIntField(target, AwtComponent::widthID);
            jint height = env->GetIntField(target, AwtComponent::heightID);

            c->CreateHWnd(env, L"", style, exStyle,
                          x, y, width, height,
                          awtParent->GetHWnd(),
                          NULL,
                          ::GetSysColor(COLOR_WINDOWTEXT),
                          ::GetSysColor(COLOR_WINDOW),
                          peer
                          );

            /* suppress inheriting awtParent's color. */
            c->m_backgroundColorSet = TRUE;
            c->UpdateBackground(env, target);
        }
    } catch (...) {
        env->DeleteLocalRef(target);
        throw;
    }

done:
    env->DeleteLocalRef(target);
    return c;
}
/* Create a new AwtTextField object and window.   */
AwtTextField* AwtTextField::Create(jobject peer, jobject parent)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);

    jobject target = NULL;
    AwtTextField* c = NULL;

    try {
        PDATA pData;
        AwtCanvas* awtParent;
        JNI_CHECK_PEER_GOTO(parent, done);
        awtParent = (AwtCanvas*)pData;

        JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);

        target = env->GetObjectField(peer, AwtObject::targetID);
        JNI_CHECK_NULL_GOTO(target, "null target", done);

        c = new AwtTextField();

        {
            DWORD style = WS_CHILD | WS_CLIPSIBLINGS |
                ES_LEFT | ES_AUTOHSCROLL |
                (IS_WIN4X ? 0 : WS_BORDER);
            DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
            if (GetRTL()) {
                exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
                if (GetRTLReadingOrder())
                    exStyle |= WS_EX_RTLREADING;
            }

            jint x = env->GetIntField(target, AwtComponent::xID);
            jint y = env->GetIntField(target, AwtComponent::yID);
            jint width = env->GetIntField(target, AwtComponent::widthID);
            jint height = env->GetIntField(target, AwtComponent::heightID);

            c->CreateHWnd(env, L"", style, exStyle,
                          x, y, width, height,
                          awtParent->GetHWnd(),
                          reinterpret_cast<HMENU>(static_cast<INT_PTR>(
                awtParent->CreateControlID())),
                          ::GetSysColor(COLOR_WINDOWTEXT),
                          ::GetSysColor(COLOR_WINDOW),
                          peer);

            c->m_backgroundColorSet = TRUE;
            /* suppress inheriting parent's color. */
            c->UpdateBackground(env, target);
            c->SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN,
                           MAKELPARAM(1, 1));
            /*
             * Fix for BugTraq Id 4260109.
             * Set the text limit to the maximum.
             */
            c->SendMessage(EM_SETLIMITTEXT);

        }
    } catch (...) {
        env->DeleteLocalRef(target);
        throw;
    }

done:
    env->DeleteLocalRef(target);

    return c;
}
Esempio n. 9
0
void
AwtMenuItem::DrawSelf(DRAWITEMSTRUCT& drawInfo)
{
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
    if (env->EnsureLocalCapacity(4) < 0) {
        return;
    }

    // self is sun.awt.windows.WMenuItemPeer
    jobject self = GetPeer(env);

    //  target is java.awt.MenuItem
    jobject target = env->GetObjectField(self, AwtObject::targetID);

    HDC hDC = drawInfo.hDC;
    RECT rect = drawInfo.rcItem;
    RECT textRect = rect;
    SIZE size;

    DWORD crBack,crText;
    HBRUSH hbrBack;

    jobject font = GetFont(env);
    jstring text = GetJavaString(env);
    size = AwtFont::getMFStringSize(hDC, font, text);

    /* 4700350: If the font size is taller than the menubar, change to the
     * default font.  Otherwise, menu text is painted over the title bar and
     * client area.  -bchristi
     */
    if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) {
        env->DeleteLocalRef(font);
        font = env->NewLocalRef(GetDefaultFont(env));
        size = AwtFont::getMFStringSize(hDC, font, text);
    }

    /* Fix for bug 4257944 by [email protected]
    * check state of the parent
    */
    AwtMenu* menu = GetMenuContainer();
    DASSERT(menu != NULL && GetID() >= 0);

    //Check whether the MenuItem is disabled.
    BOOL bEnabled = (jboolean)env->GetBooleanField(target,
                                                   AwtMenuItem::enabledID);
    if (menu != NULL) {
        bEnabled = bEnabled && !menu->IsDisabledAndPopup();
    }

    if ((drawInfo.itemState) & (ODS_SELECTED)) {
        // Set background and text colors for selected item
        crBack = ::GetSysColor (COLOR_HIGHLIGHT);
        // Disabled text must be drawn in gray.
        crText = ::GetSysColor(bEnabled? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT);
    } else {
        // COLOR_MENUBAR is only defined on WindowsXP. Our binaries are
        // built on NT, hence the below ifdef.

#ifndef COLOR_MENUBAR
#define COLOR_MENUBAR 30
#endif
        // Set background and text colors for unselected item
        if (IS_WINXP && IsTopMenu() && AwtDesktopProperties::IsXPStyle()) {
            crBack = ::GetSysColor (COLOR_MENUBAR);
        } else {
            crBack = ::GetSysColor (COLOR_MENU);
        }
        // Disabled text must be drawn in gray.
        crText = ::GetSysColor (bEnabled ? COLOR_MENUTEXT : COLOR_GRAYTEXT);
    }

    // Fill item rectangle with background color
    hbrBack = ::CreateSolidBrush (crBack);
    DASSERT(hbrBack);
    VERIFY(::FillRect (hDC, &rect, hbrBack));
    VERIFY(::DeleteObject (hbrBack));

    // Set current background and text colors
    ::SetBkColor (hDC, crBack);
    ::SetTextColor (hDC, crText);

    int nOldBkMode = ::SetBkMode(hDC, OPAQUE);
    DASSERT(nOldBkMode != 0);

    //draw check mark
    int checkWidth = ::GetSystemMetrics(SM_CXMENUCHECK);
    // Workaround for CR#6401956
    if (IS_WINVISTA) {
        AdjustCheckWidth(checkWidth);
    }

    if (IsCheckbox()) {
        // means that target is a java.awt.CheckboxMenuItem
        jboolean state =
            (jboolean)env->GetBooleanField(target, AwtMenuItem::stateID);
        if (state) {
            DASSERT(drawInfo.itemState & ODS_CHECKED);
            RECT checkRect;
            ::CopyRect(&checkRect, &textRect);
            if (GetRTL())
                checkRect.left = checkRect.right - checkWidth;
            else
                checkRect.right = checkRect.left + checkWidth;

            DrawCheck(hDC, checkRect);
        }
    }

    ::SetBkMode(hDC, TRANSPARENT);
    int x = 0;
    //draw string
    if (!IsTopMenu()){
        textRect.left += checkWidth;
        x = (GetRTL()) ? textRect.right - checkWidth - size.cx : textRect.left;
    } else {
        x = textRect.left = (textRect.left + textRect.right - size.cx) / 2;
    }

    int y = (textRect.top+textRect.bottom-size.cy)/2;

    // Text must be drawn in emboss if the Menu is disabled and not selected.
    BOOL bEmboss = !bEnabled && !(drawInfo.itemState & ODS_SELECTED);
    if (bEmboss) {
        ::SetTextColor(hDC, GetSysColor(COLOR_BTNHILIGHT));
        AwtFont::drawMFString(hDC, font, text, x + 1, y + 1, GetCodePage());
        ::SetTextColor(hDC, GetSysColor(COLOR_BTNSHADOW));
    }
    AwtFont::drawMFString(hDC, font, text, x, y, GetCodePage());

    jstring shortcutLabel =
        (jstring)env->GetObjectField(self, AwtMenuItem::shortcutLabelID);
    if (!IsTopMenu() && shortcutLabel != NULL) {
        UINT oldAlign = 0;
        if (GetRTL()){
            oldAlign = ::SetTextAlign(hDC, TA_LEFT);
            AwtFont::drawMFString(hDC, font, shortcutLabel, textRect.left, y,
                                  GetCodePage());
        } else {
            oldAlign = ::SetTextAlign(hDC, TA_RIGHT);
            AwtFont::drawMFString(hDC, font, shortcutLabel,
                                  textRect.right - checkWidth, y,
                                  GetCodePage());
        }

        ::SetTextAlign(hDC, oldAlign);
    }

    VERIFY(::SetBkMode(hDC,nOldBkMode));

    env->DeleteLocalRef(target);
    env->DeleteLocalRef(text);
    env->DeleteLocalRef(font);
    env->DeleteLocalRef(shortcutLabel);
}
Esempio n. 10
0
void OpDocumentEdit::EditAction(OpInputAction* action)
{
	DEBUG_CHECKER(TRUE);
	SelectionBoundaryPoint anchor, focus;
	if (m_doc->GetHtmlDocument())
		m_doc->GetHtmlDocument()->GetSelection(anchor, focus);
	HTML_Element* old_caret_helm = m_caret.GetElement();
	INT32 old_caret_ofs = m_caret.GetOffset();
#ifdef INTERNAL_SPELLCHECK_SUPPORT
	SpellWordInfoObject old_info;
#endif // INTERNAL_SPELLCHECK_SUPPORT

	switch (action->GetAction())
	{
		case OpInputAction::ACTION_NEXT_CHARACTER_SPATIAL:
			m_caret.MoveSpatial(TRUE);
			break;
		case OpInputAction::ACTION_PREVIOUS_CHARACTER_SPATIAL:
			m_caret.MoveSpatial(FALSE);
			break;

		case OpInputAction::ACTION_RANGE_GO_TO_START:
		case OpInputAction::ACTION_GO_TO_START:
			m_caret.Place(OpWindowCommander::CARET_DOCUMENT_HOME);
			break;

		case OpInputAction::ACTION_RANGE_GO_TO_LINE_START:
		case OpInputAction::ACTION_GO_TO_LINE_START:
			m_caret.Place(GetRTL() ? OpWindowCommander::CARET_LINE_END : OpWindowCommander::CARET_LINE_HOME);
			break;

		case OpInputAction::ACTION_RANGE_GO_TO_END:
		case OpInputAction::ACTION_GO_TO_END:
			m_caret.Place(OpWindowCommander::CARET_DOCUMENT_END);
			break;

		case OpInputAction::ACTION_RANGE_GO_TO_LINE_END:
		case OpInputAction::ACTION_GO_TO_LINE_END:
			m_caret.Place(GetRTL() ? OpWindowCommander::CARET_LINE_HOME : OpWindowCommander::CARET_LINE_END);
			break;

		case OpInputAction::ACTION_RANGE_PAGE_UP:
		case OpInputAction::ACTION_PAGE_UP:
			m_caret.Place(OpWindowCommander::CARET_PAGEUP);
			break;
		case OpInputAction::ACTION_RANGE_PAGE_DOWN:
		case OpInputAction::ACTION_PAGE_DOWN:
			m_caret.Place(OpWindowCommander::CARET_PAGEDOWN);
			break;

		case OpInputAction::ACTION_RANGE_NEXT_CHARACTER:
		case OpInputAction::ACTION_NEXT_CHARACTER:
			if (m_selection.HasContent() && !action->IsRangeAction())
			{
				TextSelection* text_selection = m_doc->GetTextSelection();
				m_caret.Place(text_selection->GetEndSelectionPoint());
			}
			else
			{
				// Move action moves in visual order. Range action moves in logical order but reversed if RTL.
				BOOL forward = TRUE;
				if (/*action->IsRangeAction() && */GetRTL())
					forward = !forward;
				m_caret.Move(forward, FALSE/*, !action->IsRangeAction()*/);
			}
			break;
		case OpInputAction::ACTION_RANGE_PREVIOUS_CHARACTER:
		case OpInputAction::ACTION_PREVIOUS_CHARACTER:
			if (m_selection.HasContent() && !action->IsRangeAction())
			{
				TextSelection* text_selection = m_doc->GetTextSelection();
				m_caret.Place(text_selection->GetStartSelectionPoint());
			}
			else
			{
				// Move action moves in visual order. Range action moves in logical order but reversed if RTL.
				BOOL forward = FALSE;
				if (/*action->IsRangeAction() && */GetRTL())
					forward = !forward;
				m_caret.Move(forward, FALSE/*, !action->IsRangeAction()*/);
			}
			break;

		case OpInputAction::ACTION_RANGE_NEXT_WORD:
		case OpInputAction::ACTION_NEXT_WORD:
			m_caret.Move(TRUE, TRUE);
			break;
		case OpInputAction::ACTION_RANGE_PREVIOUS_WORD:
		case OpInputAction::ACTION_PREVIOUS_WORD:
			m_caret.Move(FALSE, TRUE);
			break;

		case OpInputAction::ACTION_NEXT_LINE_SPATIAL:
		case OpInputAction::ACTION_RANGE_NEXT_LINE:
		case OpInputAction::ACTION_NEXT_LINE:
			m_caret.Place(OpWindowCommander::CARET_DOWN);
			break;
		case OpInputAction::ACTION_PREVIOUS_LINE_SPATIAL:
		case OpInputAction::ACTION_RANGE_PREVIOUS_LINE:
		case OpInputAction::ACTION_PREVIOUS_LINE:
			m_caret.Place(OpWindowCommander::CARET_UP);
			break;

		case OpInputAction::ACTION_DELETE_WORD:
		case OpInputAction::ACTION_BACKSPACE_WORD:
		case OpInputAction::ACTION_DELETE_TO_END_OF_LINE:
		case OpInputAction::ACTION_DELETE:
		case OpInputAction::ACTION_BACKSPACE:
			if (m_readonly)
				break;
			if (m_layout_modifier.IsActive())
			{
				m_layout_modifier.Delete();
				break;
			}
			m_caret.LockUpdatePos(TRUE);
			if (!m_selection.HasContent())
			{
#ifdef INTERNAL_SPELLCHECK_SUPPORT
				old_info.Set(m_caret.GetElement());
#endif // INTERNAL_SPELLCHECK_SUPPORT
				m_caret.SetNotRemoveWhenMoveIfUntouched();
				switch(action->GetAction())
				{
				case OpInputAction::ACTION_DELETE_WORD:
					m_caret.Move(TRUE, TRUE);
					break;
				case OpInputAction::ACTION_BACKSPACE_WORD:
					m_caret.Move(FALSE, TRUE);
					break;
				case OpInputAction::ACTION_DELETE_TO_END_OF_LINE:
					m_caret.Place(OpWindowCommander::CARET_LINE_END);
					break;
				case OpInputAction::ACTION_DELETE:
					m_caret.Move(TRUE, FALSE);
					break;
				case OpInputAction::ACTION_BACKSPACE:
					m_caret.Move(FALSE, FALSE);
					break;
				}
				HTML_Element* anchor_elm;
				int anchor_offset;
				TextSelection::ConvertPointToOldStyle(anchor, anchor_elm, anchor_offset);
				m_selection.SelectToCaret(anchor_elm, anchor_offset);
			}
			if (m_selection.HasContent())
			{
				m_selection.RemoveContent();
#ifdef INTERNAL_SPELLCHECK_SUPPORT
				DoSpellWordInfoUpdate(&old_info);
#endif // INTERNAL_SPELLCHECK_SUPPORT
			}
			else
			{
				HTML_Element* list = GetParentListElm(m_caret.GetElement());
				if (list && action->GetAction() == OpInputAction::ACTION_BACKSPACE && (m_body_is_root || list->IsContentEditable(TRUE)))
				{
					HTML_Element* new_caret_helm = NULL;
					int new_caret_ofs = 0;
					GetNearestCaretPos(list, &new_caret_helm, &new_caret_ofs, FALSE, FALSE);

					HTML_Element* root = m_doc->GetCaret()->GetContainingElementActual(list);
					BeginChange(root, CHANGE_FLAGS_ALLOW_APPEND);

					DeleteElement(list);
					ReflowAndUpdate();
					if (new_caret_helm)
						m_caret.Place(new_caret_helm, new_caret_ofs);
					else
						m_caret.PlaceFirst(root);
					EndChange(root);
				}
			}
			m_caret.LockUpdatePos(FALSE);
			if (m_listener)
				m_listener->OnTextChanged();
			break;

		case OpInputAction::ACTION_CONVERT_HEX_TO_UNICODE:
			{
				if (m_caret.GetElement()->Parent()->GetIsPseudoElement())
					// Don't let us do something in pseudoelements.
					break;
				if (!m_caret.IsElementEditable(m_caret.GetElement()))
					// Don't let us do something in elements with contentEditable false.
					break;

				// Extract the text of the current element
				OpString string;
				int text_len = m_caret.GetElement()->GetTextContentLength() + 1;
				if (!string.Reserve(text_len))
					break;
				if (OpStatus::IsError(m_caret.GetElement()->GetTextContent(string.DataPtr(), text_len)))
					break;
				int hex_start = 0;

				// Find the hex string
				if (UnicodePoint charcode = ConvertHexToUnicode(0, m_caret.GetOffset(), hex_start, string.CStr()))
				{
					// Remove the hex string
					m_undo_stack.BeginGroup();
#ifdef INTERNAL_SPELLCHECK_SUPPORT
					old_info.Set(m_caret.GetElement());
#endif // INTERNAL_SPELLCHECK_SUPPORT
					m_caret.SetNotRemoveWhenMoveIfUntouched();
					SelectionBoundaryPoint hex_start_point(old_caret_helm, hex_start);
					HTML_Element* hex_start_elm;
					int hex_start_offset;
					TextSelection::ConvertPointToOldStyle(hex_start_point, hex_start_elm, hex_start_offset);
					m_selection.SelectToCaret(hex_start_elm, hex_start_offset);
//					m_caret.Set(old_caret_helm, old_caret_ofs);
					m_selection.RemoveContent();
#ifdef INTERNAL_SPELLCHECK_SUPPORT
					DoSpellWordInfoUpdate(&old_info);
#endif // INTERNAL_SPELLCHECK_SUPPORT

					// Insert the new text
					uni_char instr[3] = { 0, 0, 0 }; /* ARRAY OK 2011-11-07 peter */
					int len = Unicode::WriteUnicodePoint(instr, charcode);
					m_caret.LockUpdatePos(TRUE);

#ifdef INTERNAL_SPELLCHECK_SUPPORT
					BOOL was_delayed_misspell = FALSE;
#endif // INTERNAL_SPELLCHECK_SUPPORT
					BOOL has_content = m_selection.HasContent();
					if (GetDoc()->GetCaretPainter()->GetOverstrike() && !has_content)
					{
						m_caret.Move(TRUE, FALSE);
						if (IsFriends(old_caret_helm, m_caret.GetElement()))
							m_selection.SelectToCaret(old_caret_helm, old_caret_ofs);
						m_caret.Set(old_caret_helm, old_caret_ofs);
					}
#ifdef INTERNAL_SPELLCHECK_SUPPORT
					else if(!has_content && !m_layout_modifier.IsActive() && m_delay_misspell_word_info)
						was_delayed_misspell = TRUE;
#endif // INTERNAL_SPELLCHECK_SUPPORT

					InsertText(instr, len, TRUE);
					m_undo_stack.EndGroup();

					m_caret.LockUpdatePos(FALSE);
#ifdef INTERNAL_SPELLCHECK_SUPPORT
					if(m_spell_session)
						PossiblyDelayMisspell(was_delayed_misspell);
					m_doc_has_changed = FALSE;
#endif // INTERNAL_SPELLCHECK_SUPPORT

					if (m_listener)
						m_listener->OnTextChanged();
				}

				break;
			}

		case OpInputAction::ACTION_TOGGLE_STYLE_BOLD:
			execCommand(OP_DOCUMENT_EDIT_COMMAND_BOLD);
			if (m_listener)
				m_listener->OnTextChanged();
			break;
		case OpInputAction::ACTION_TOGGLE_STYLE_ITALIC:
			execCommand(OP_DOCUMENT_EDIT_COMMAND_ITALIC);
			if (m_listener)
				m_listener->OnTextChanged();
			break;
		case OpInputAction::ACTION_TOGGLE_STYLE_UNDERLINE:
			execCommand(OP_DOCUMENT_EDIT_COMMAND_UNDERLINE);
			if (m_listener)
				m_listener->OnTextChanged();
			break;
		case OpInputAction::ACTION_LOWLEVEL_KEY_PRESSED:
		{
			if (m_readonly)
				break;
			OpKey::Code key = action->GetActionKeyCode();

			if (!m_caret.GetElement())
				// Nowhere to put the input.
				break;
			if (m_caret.GetElement()->Parent()->GetIsPseudoElement())
				// Don't let us do something in pseudoelements.
				break;
			if (!m_caret.IsElementEditable(m_caret.GetElement()))
				// Don't let us do something in elements with contentEditable false.
				break;

			if (key == OP_KEY_ENTER)
			{
				BOOL new_paragraph = action->GetShiftKeys() & SHIFTKEY_SHIFT ? FALSE : TRUE;
				BOOL break_list = TRUE;
#ifdef DOCUMENT_EDIT_USE_PARAGRAPH_BREAK
				break_list = new_paragraph;
#endif // DOCUMENT_EDIT_USE_PARAGRAPH_BREAK
				InsertBreak(break_list, new_paragraph);
			}
			else if (key == OP_KEY_TAB)
			{
				// FIX: if we don't use wrap_pre, we can't do this! we have to insert nbspaces then.
				uni_char instr[2] = { 9, 0 };
				InsertText(instr, 1, TRUE);
			}
			else
			{
				m_caret.LockUpdatePos(TRUE);

#ifdef INTERNAL_SPELLCHECK_SUPPORT
				BOOL was_delayed_misspell = FALSE;
#endif // INTERNAL_SPELLCHECK_SUPPORT
				BOOL has_content = m_selection.HasContent();
				if (GetDoc()->GetCaretPainter()->GetOverstrike() && !has_content)
				{
					m_caret.Move(TRUE, FALSE);
					if (IsFriends(old_caret_helm, m_caret.GetElement()))
						m_selection.SelectToCaret(old_caret_helm, old_caret_ofs);
					m_caret.Set(old_caret_helm, old_caret_ofs);
				}
#ifdef INTERNAL_SPELLCHECK_SUPPORT
				else if(!has_content && !m_layout_modifier.IsActive() && m_delay_misspell_word_info)
					was_delayed_misspell = TRUE;
#endif // INTERNAL_SPELLCHECK_SUPPORT

				const uni_char *key_value = action->GetKeyValue();
				if (key_value)
					InsertText(key_value, uni_strlen(key_value), TRUE);

				m_caret.LockUpdatePos(FALSE);
#ifdef INTERNAL_SPELLCHECK_SUPPORT
				if(m_spell_session)
					PossiblyDelayMisspell(was_delayed_misspell);
				m_doc_has_changed = FALSE;
#endif // INTERNAL_SPELLCHECK_SUPPORT
			}
			if (m_listener)
				m_listener->OnTextChanged();
			break;
		}
	}

	if (action->IsRangeAction() && anchor.GetElement())
	{
		HTML_Element* anchor_elm;
		int anchor_offset;
		TextSelection::ConvertPointToOldStyle(anchor, anchor_elm, anchor_offset);
		m_selection.SelectToCaret(anchor_elm, anchor_offset);
	}
	else if (action->IsMoveAction())
		m_selection.SelectNothing();

	BOOL IsUpDownAction(int action); // widgets/OpMultiEdit.cpp
	if (!IsUpDownAction(action->GetAction()))
		m_caret.UpdateWantedX();

	ScrollIfNeeded();
}