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)); } }
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; }
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; }
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; }
/* 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; }
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); }
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(); }