lfpport_qte_string_image_item.cpp
来自「This is a resource based on j2me embedde」· C++ 代码 · 共 477 行
CPP
477 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * * This source file is specific for Qt-based configurations. */#include <kni.h>#include <qfontmetrics.h>#include "lfpport_qte_mscreen.h"#include "lfpport_qte_util.h"#include <gxpportqt_image.h>#include <lfpport_stringitem.h>#include <lfpport_imageitem.h>#include "lfpport_qte_string_image_item.h"#include <moc_lfpport_qte_string_image_item.cpp>StringImageItem::StringImageItem(QWidget *parent, const QString &labelStr, int layout, const QString &textStr, QFont *f, int appearance) : Item( parent, labelStr, layout) { body = new StringBody(textStr, appearance, f, this); // Delegate focus to QPushButton setFocusProxy(body); connect(body, SIGNAL(clicked()), this, SLOT(activateDefaultCommand()));}StringImageItem::StringImageItem(QWidget *parent, const QString &labelStr, int layout, QPixmap *pixmap, const QString &altTextStr, int appearance) : Item( parent, labelStr, layout) { body = new ImageBody(pixmap, altTextStr, appearance, this); // Delegate focus to QPushButton setFocusProxy(body); connect(body, SIGNAL(clicked()), this, SLOT(activateDefaultCommand()));}StringImageItem::~StringImageItem() { // Item's destructor will be called since it is StringImageItem's base class delete body;}void StringImageItem::bodyRelocate(int x, int y) { body->move(x, y);}void StringImageItem::bodyResize(int w, int h) { body->resize(w, h);}int StringImageItem::bodyHeightForWidth(int *takenWidth, int w) { return body->heightForWidth(takenWidth, w);}int StringImageItem::bodyWidthForHeight(int *takenHeight, int h) { return body->widthForHeight(takenHeight, h);}bool StringImageItem::bodyCanBeOnSameLine(int bodyHeight) { return Item::bodyCanBeOnSameLine(bodyHeight) && body->isSingleLine(bodyHeight);}MidpError StringImageItem::setTextFont(const QFont &font) { body->setTextFont(font); body->repaint(); return KNI_OK;}MidpError StringImageItem::setContent(const QString &textStr, int appearanceMode) { // The order of calling setContent and setAppearance is important; // setContent() depends on the appearanceMode to be set; // initFocus() is called as the last thing in setContent since // it depends on the content set body->setAppearance(appearanceMode); body->setContent(textStr, appearanceMode); body->repaint(); return KNI_OK;}MidpError StringImageItem::setContent(QPixmap *pixmap, const QString &altTextStr, int appearanceMode) { /* Suppress unused-parameter warning */ (void)altTextStr; // The order of calling setPixmap and setAppearance is important; // setAppearance() calls initFocus() which could do different things // depending on the content body->setPixmap(pixmap == NULL ? 0 : *pixmap); body->setAppearance(appearanceMode); body->repaint(); return KNI_OK;}/** * Notify Java to call activate a default command associated with * this StringItem or ImageItem */void StringImageItem::activateDefaultCommand() { MidpFormItemPeerStateChanged(this, -1);}//*************************************************************************StringBody::StringBody(const QString &textStr, int appearance, QFont *f, QWidget *parent) : QPushButton(parent) { if (f != NULL) { setFont(*f); } textLineHeight = QFontMetrics(font()).height(); setAppearance(appearance); setContent(textStr, appearance);}StringBody::~StringBody() {}void StringBody::drawButtonLabel(QPainter *painter) { if (!text.isEmpty()) { painter->setFont(font()); painter->drawText(PAD, PAD, width() - PAD - PAD, height() - PAD - PAD, WordBreak, text); }}void StringBody::drawButton(QPainter *painter) { if (appearance == HYPERLINK) { drawButtonLabel(painter); if (hasFocus()) { style().drawFocusRect( painter, rect(), colorGroup(), &colorGroup().button()); } } else { QPushButton::drawButton(painter); }}int StringBody::heightForWidth(int *takenWidth, int w) { if (text.isEmpty()) { *takenWidth = 0; return 0; } QRect textRect = QFontMetrics(font()).boundingRect(PAD, PAD, w - PAD - PAD, qteapp_get_mscreen()->getScreenHeight(), WordBreak, text); *takenWidth = PAD + textRect.width() + PAD; return (PAD + textRect.height() + PAD);}int StringBody::widthForHeight(int *takenHeight, int h) { /* Suppress unused-parameter warning */ (void)takenHeight; (void)h; return 0;}bool StringBody::isSingleLine(int bodyHeight) { if (text.isEmpty()) { return true; } return (bodyHeight <= (PAD +textLineHeight + PAD));}void StringBody::setAppearance(int appearance) { this->appearance = appearance; switch (appearance) { case PLAIN: setFlat(true); setEnabled(false); { // Use the same background color as Form's qwidget setBackgroundColor(parentWidget()->palette().active().background()); // Make sure that text is displayed with active color values QPalette curPalette = palette(); QColorGroup curActive = curPalette.active(); setPalette(QPalette(curActive, curActive, curActive)); } PAD = 0; break; case HYPERLINK: setFlat(true); setEnabled(true); PAD = 2; break; case BUTTON: setFlat(false); setEnabled(true); PAD = 5; break; }}void StringBody::setContent(const QString &textStr, int appearance) { text = textStr.copy(); QFont f = font(); f.setUnderline(appearance == HYPERLINK); setFont(f); initFocus();}void StringBody::setTextFont(const QFont &font) { setFont(font); textLineHeight = QFontMetrics(font).height();}/** Override to notify Form focus change */void StringBody::focusInEvent(QFocusEvent *event) { // Notify Java if this is caused by user action if (event->reason() != QFocusEvent::Other) { MidpFormFocusChanged(parent()); } // Continue with focus activation QPushButton::focusInEvent(event);}void StringBody::initFocus() { // should be called after content is set if (!text.isEmpty() && appearance != PLAIN) { setFocusPolicy(QWidget::StrongFocus); } else { setFocusPolicy(QWidget::NoFocus); }}//*************************************************************************ImageBody::ImageBody(QPixmap *pixmap, const QString &altText, int appearance, QWidget *parent) : StringBody(altText, appearance, NULL, parent) { QPushButton::setPixmap(pixmap == NULL ? 0 : *pixmap); setAppearance(appearance);}ImageBody::~ImageBody() {}void ImageBody::drawButtonLabel(QPainter *painter) { const QPixmap *p = pixmap(); if (p != 0) { painter->drawPixmap(PAD, PAD, *p, 0, 0, p->width(), p->height()); return; } StringBody::drawButtonLabel(painter);}void ImageBody::drawButton(QPainter *painter) { if (appearance == HYPERLINK) { drawButtonLabel(painter); // by default focus is drawn on top of the button; // hilight might not be visible if image background is black. // To make sure that hilight is visible we do not call // QPushButton::drawButton() and draw hilight outside of the image if (qteapp_get_application()->focusWidget() == this) { // draw focus painter->drawWinFocusRect(2, 2, width() - 4, height() - 4); } } else { QPushButton::drawButton(painter); }}int ImageBody::heightForWidth(int *takenWidth, int w) { const QPixmap *p = pixmap(); if (p != 0) { *takenWidth = PAD + p->width() + PAD; return PAD + p->height() + PAD; } return StringBody::heightForWidth(takenWidth, w);}int ImageBody::widthForHeight(int *takenHeight, int h) { /* Suppress unused-parameter warning */ (void)takenHeight; (void)h; return 0;}bool ImageBody::isSingleLine(int bodyHeight) { return StringBody::isSingleLine(bodyHeight);}void ImageBody::setAppearance(int appearance) { StringBody::setAppearance(appearance); if (appearance == HYPERLINK) { PAD = 5; } initFocus();}void ImageBody::initFocus() { const QPixmap *p = pixmap(); if (p != NULL && p->width() > 0 && p->height() > 0 && appearance != PLAIN) { setFocusPolicy(QWidget::StrongFocus); } else { setFocusPolicy(QWidget::NoFocus); }}// **************************************************************************extern "C" {/** * Creates a StringImageItem native peer without showing it yet. * Upon successful return, fields in *itemPtr should be set properly. */ MidpError lfpport_stringitem_create(MidpItem* itemPtr, MidpDisplayable* formPtr, const pcsl_string* label, int layout, const pcsl_string* text, PlatformFontPtr fontPtr, int appearanceMode) { /* Suppress unused-parameter warning */ (void)fontPtr; QString labelStr; QString textStr; pcsl_string2QString(*label, labelStr); pcsl_string2QString(*text, textStr); itemPtr->widgetPtr = new StringImageItem((formPtr == INVALID_NATIVE_ID ? 0 : (QWidget *)formPtr->frame.widgetPtr), labelStr, layout, textStr, (QFont *)fontPtr, appearanceMode); initItemPtr(itemPtr, formPtr); return KNI_OK; }/** * Notifies a content change in the corresponding StringImageItem. * @param text - the new string set in the StringImageItem */ MidpError lfpport_stringitem_set_content(MidpItem* itemPtr, const pcsl_string* text, int appearanceMode) { QString textStr; pcsl_string2QString(*text, textStr); return ((StringImageItem *)itemPtr->widgetPtr)->setContent(textStr, appearanceMode); } /** * Notifies a font change in the corresponding StringImageItem. * @param font - the new font set in the StringImageItem */ MidpError lfpport_stringitem_set_font(MidpItem* itemPtr, PlatformFontPtr fontPtr) { QFont font(*(QFont *)fontPtr); return ((StringImageItem *)itemPtr->widgetPtr)->setTextFont(font); }/** * Creates a StringImageItem native peer without showing it yet. * Upon successful return, fields in *itemPtr should be set properly. */MidpError lfpport_imageitem_create(MidpItem* itemPtr, MidpDisplayable* formPtr, const pcsl_string* label, int layout, unsigned char* imgPtr, const pcsl_string* altText, int appearanceMode) { QString labelStr; QString altTextStr; pcsl_string2QString(*label, labelStr); pcsl_string2QString(*altText, altTextStr); itemPtr->widgetPtr = new StringImageItem((formPtr == INVALID_NATIVE_ID ? 0 : (QWidget *)formPtr->frame.widgetPtr), labelStr, layout, gxpportqt_get_immutableimage_pixmap(imgPtr), altTextStr, appearanceMode); initItemPtr(itemPtr, formPtr); return KNI_OK;}/** * Notifies a content change in the corresponding StringImageItem. */MidpError lfpport_imageitem_set_content(MidpItem* itemPtr, unsigned char* imgPtr, const pcsl_string* altText, int appearanceMode) { QString altTextStr; pcsl_string2QString(*altText, altTextStr); return ((StringImageItem *)itemPtr->widgetPtr)->setContent( gxpportqt_get_immutableimage_pixmap(imgPtr), altTextStr, appearanceMode); }} /* extern C */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?