lfjport_qte_mscreen.cpp
来自「This is a resource based on j2me embedde」· C++ 代码 · 共 517 行
CPP
517 行
/* * * * 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 <qapplication.h>#include <qmainwindow.h>#include <qpainter.h>#include <qpaintdevice.h>#include <qpaintdevicemetrics.h>#include <qlayout.h>#include <qtoolbar.h>#include <qmenubar.h>#include <qaction.h>#include <qmessagebox.h>#include <keymap_input.h>#include <midpEventUtil.h>#include <midp_constants_data.h>#include <qteapp_export.h>#include <qteapp_key.h>#include "lfjport_qte_mscreen.h"#include <moc_lfjport_qte_mscreen.cpp>jboolean ChameleonMScreen::r_orientation = false;/** * @class ChameleonMScreen lfjport_qte_mscreen.h * * @brief ChameleonMScreen class map to a Java widget based drawing widget * * @note Even thought we may support mscreen per Java graphics context * it is not the way we design. Only one ChameleonMScreen should exists. */ChameleonMScreen::ChameleonMScreen(QWidget *parent, const char* name) : QWidget(parent, name){ vm_stopped = false; /* Graphics context */ gc = new QPainter(); /* Slots */ connect(&vm_slicer, SIGNAL(timeout()), this, SLOT(slotTimeout()));}/** * Note: width used in form for layout should be without scrollbar (SCREEN_WIDTH) * height returned in form should be SCREEN_HEIGHT */void ChameleonMScreen::init() { /* Normal screen height and width */ DISPLAY_WIDTH = width(); DISPLAY_HEIGHT = height(); /* * Full screen mode * -Height * -Width */ DISPLAY_FULLHEIGHT = CHAM_FULLHEIGHT; DISPLAY_FULLWIDTH = CHAM_FULLWIDTH; /* Set up coordinate for the whole screen */ /* SCREEN excludes the scroll bar */ SCREEN_X = SCREEN_Y = 0; SCREEN_WIDTH = DISPLAY_WIDTH; SCREEN_HEIGHT = DISPLAY_HEIGHT; /* * Set the size of the midlet suites app area * @note this will change in full screen mode */ qpixmap.resize(SCREEN_WIDTH, SCREEN_HEIGHT); /* * IMPL_NOTE:Performance team should benchmark the difference on * qpixmap.setOptimization(QPixmap::BestOptim); */ /* The widget accepts focus by both tabbing and clicking */ setFocusPolicy(QWidget::StrongFocus); /* Clean up GC related parameters */ force_refresh = true; last_pen = last_brush = -1; last_dotted = 0;}/** * Resize the buffer size (either normal or fullscreen) */void ChameleonMScreen::setBufferSize(BufferSize newSize){ if (newSize == fullScreenSize) { if (gc->isActive()) { gc->end(); } qpixmap.resize(getDisplayFullWidth(), getDisplayFullHeight()); } else { qpixmap.resize(getDisplayWidth(), getDisplayHeight()); } // Whether current Displayable won't repaint the entire screen on // resize event, the artefacts from the old screen content can appear. // That's why the buffer content is not preserved. qpixmap.fill(Qt::black);}/** * Start VM by starting a time share request for it. */void ChameleonMScreen::startVM() { vm_stopped = false; /* Setup next VM time slice to happen immediately */ midp_resetEvents(); seen_key_press = KNI_FALSE; painted = KNI_FALSE; setNextVMTimeSlice(0);}/** * Stop VM by stopping requests for VM time slice. */void ChameleonMScreen::stopVM() { /* Stop any further VM time slice */ setNextVMTimeSlice(-1);}ChameleonMScreen::~ChameleonMScreen(){ killTimers(); delete gc; gc = NULL;}void ChameleonMScreen::mousePressEvent(QMouseEvent *mouse){ MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); evt.type = MIDP_PEN_EVENT; evt.ACTION = KEYMAP_STATE_PRESSED; evt.X_POS = mouse->x(); evt.Y_POS = mouse->y(); midpStoreEventAndSignalForeground(evt);}void ChameleonMScreen::mouseMoveEvent( QMouseEvent *mouse){ MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); evt.type = MIDP_PEN_EVENT; evt.ACTION = KEYMAP_STATE_DRAGGED; evt.X_POS = mouse->x(); evt.Y_POS = mouse->y(); midpStoreEventAndSignalForeground(evt);}void ChameleonMScreen::mouseReleaseEvent( QMouseEvent *mouse){ MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); evt.type = MIDP_PEN_EVENT; evt.ACTION = KEYMAP_STATE_RELEASED; evt.X_POS = mouse->x(); evt.Y_POS = mouse->y(); midpStoreEventAndSignalForeground(evt);}void ChameleonMScreen::keyPressEvent(QKeyEvent *key){ seen_key_press = KNI_TRUE;#if ENABLE_MULTIPLE_ISOLATES if (key->key() == Qt::Key_F7|| key->key() == Qt::Key_Home) { /* F12 to display the foreground selector */ if (!key->isAutoRepeat()) { MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); evt.type = SELECT_FOREGROUND_EVENT; evt.intParam1 = 0; midpStoreEventAndSignalAms(evt); }#ifdef QT_KEYPAD_MODE } else if (key->key() == Qt::Key_Flip) {#else } else if (key->key() == Qt::Key_F4) {#endif if (!key->isAutoRepeat()) { MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); evt.type = SELECT_FOREGROUND_EVENT; evt.intParam1 = 1; midpStoreEventAndSignalAms(evt); } }#else /* F7 pause or activate all Java apps */ if ((key->key() == Qt::Key_F7 || key->key() == Qt::Key_Home) && !key->isAutoRepeat()) { pauseAll(); }#endif else { MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); if ((evt.CHR = mapKey(key)) != KEYMAP_KEY_INVALID) { if (evt.CHR == KEYMAP_KEY_SCREEN_ROT) { evt.type = ROTATION_EVENT; } else if (evt.CHR == KEYMAP_KEY_VIRT_KEYB) { evt.type = VIRTUAL_KEYBOARD_EVENT; } else { evt.type = MIDP_KEY_EVENT; } evt.ACTION = key->isAutoRepeat() ? KEYMAP_STATE_REPEATED : KEYMAP_STATE_PRESSED; midpStoreEventAndSignalForeground(evt); } }}void ChameleonMScreen::keyReleaseEvent(QKeyEvent *key){ if (!seen_key_press || key->isAutoRepeat()) { /* * We may have a left-over keyReleaseEvent from a previous * invocation of the VM! */ return; } MidpEvent evt; MIDP_EVENT_INITIALIZE(evt); if ((evt.CHR = mapKey(key)) != KEYMAP_KEY_INVALID) { evt.type = MIDP_KEY_EVENT; evt.ACTION = KEYMAP_STATE_RELEASED; midpStoreEventAndSignalForeground(evt); }}void ChameleonMScreen::resizeEvent(QResizeEvent *event) { /* We simply ignore it as we don't support resize */ /* Suppress unused-parameter warning */ (void)event;}void ChameleonMScreen::paintEvent(QPaintEvent *e){ QRect r(e->rect()); refresh(r.left(), r.top(), r.right(), r.bottom()); /* Done, the Java level does not process repaint events. */}/** * Create a Color from the packed pixel value. */QColor ChameleonMScreen::getColor(int pixel) { int r = (pixel >> 16) & 0xff; int g = (pixel >> 8) & 0xff; int b = (pixel >> 0) & 0xff; return QColor(r, g, b);}/** * Returns 'true' if dst is the current painting device. Otherwise, * return 'false'. */boolChameleonMScreen::isCurrentPaintDevice(QPaintDevice *dst) { return (gc->device() == dst) ? true : false;}/** * Set the drawing parameters in the QPainter */QPainter*ChameleonMScreen::setupGC(int pixel_pen, int pixel_brush, const jshort *clip, QPaintDevice *dst, int dotted) { painted = KNI_TRUE; QPaintDevice* dev = gc->device(); /* default destination is the back buffer */ if (dst == NULL) { dst = (QPaintDevice*)&qpixmap; } /* finish operation on old device, if changed */ if ((dev != dst) || force_refresh) { if (gc->isActive()) { gc->end(); } } /* start operation on new device, if needed */ if (!gc->isActive()) { gc->begin(dst); } /* check if pen parameters changed */ if (((dev != dst) || (last_pen != pixel_pen) || (last_dotted != dotted) || force_refresh)) { if (pixel_pen != -1) { QColor color = getColor(pixel_pen); QPen pen = QPen(color, 0, (dotted ? Qt::DotLine : Qt::SolidLine)); gc->setPen(pen); } else { gc->setPen(Qt::NoPen); } last_pen = pixel_pen; last_dotted = dotted; } /* check if pen parameters changed */ if (((dev != dst) || (last_brush != pixel_brush) || force_refresh)) { if (pixel_brush != -1) { gc->setBrush(getColor(pixel_brush)); } else { gc->setBrush(Qt::NoBrush); } last_brush = pixel_brush; } /* check if clipping region changed */ if (clip != NULL && ((dev != dst) || force_refresh || (clip[0] != last_clip.left()) || (clip[1] != last_clip.top()) || ((clip[2] - clip[0]) != last_clip.width()) || ((clip[3] - clip[1]) != last_clip.height()))) { QRect uclip(clip[0], clip[1], clip[2] - clip[0], clip[3] - clip[1]); last_clip = uclip; gc->setClipRect(uclip); } /* drop force_refresh flag after all */ force_refresh = false; return gc;}void ChameleonMScreen::setNextVMTimeSlice(int millis) { if (millis < 0) { /* A negative time means we should stop any active timer. */ if (vm_slicer.isActive()) { vm_slicer.stop(); } } else { if (vm_slicer.isActive()) { vm_slicer.changeInterval(millis); } else { vm_slicer.start(millis, TRUE); } }}void ChameleonMScreen::slotTimeout() { slotTimeoutImpl();}/** * Refresh the screen. * * @param x1 top x coordinate * @param y1 top y coordinate * @param x2 right hand size bottom x coordinate * @param y2 right hand size bottom y coordinate */void ChameleonMScreen::refresh(int x1, int y1, int x2, int y2) { if (painted) { if (gc->isActive()) { gc->end(); } /* Draw the MIDlets screen from the back buffer */ bitBlt((QPaintDevice*)this, x1 + SCREEN_X, y1 + SCREEN_Y, &qpixmap, x1, y1, (x2 - x1 + 1), (y2 - y1 + 1)); } force_refresh = true; last_pen = last_brush = -1;}/** * Resets native resources of the device when foreground is gained * by a new Display. */void ChameleonMScreen::gainedForeground() { force_refresh = KNI_TRUE; seen_key_press = KNI_FALSE; painted = KNI_FALSE;}/** * Width of a normal screen. */int ChameleonMScreen::getDisplayWidth() const { if (r_orientation) { return DISPLAY_HEIGHT; } else { return DISPLAY_WIDTH; }}/** * Height of a normal screen. */ int ChameleonMScreen::getDisplayHeight() const { if (r_orientation) { return DISPLAY_WIDTH; } else { return DISPLAY_HEIGHT; }}/** * Width of a full screen canvas. */int ChameleonMScreen::getDisplayFullWidth() const { if (r_orientation) { return DISPLAY_FULLHEIGHT; } else { return DISPLAY_FULLWIDTH; }}/** * Height of a full screen canvas. */int ChameleonMScreen::getDisplayFullHeight() const { if (r_orientation) { return DISPLAY_FULLWIDTH; } else { return DISPLAY_FULLHEIGHT; }}/** * Width available for laying out items in a Form. */int ChameleonMScreen::getScreenWidth() const { if (r_orientation) { return SCREEN_HEIGHT; } else { return SCREEN_WIDTH; }}/** * Hieght available for laying out items in a Form. */int ChameleonMScreen::getScreenHeight() const { if (r_orientation) { return SCREEN_WIDTH; } else { return SCREEN_HEIGHT; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?