/**
 * Create a Canvas's native peer without showing yet.
 * Upon successful return, *canvasPtr will be filled properly.
 * Sound and abstract command buttons should not be handled in this
 * function. Separated function calls are used.
 *
 * @param canvasPtr pointer to MidpDisplayable structure to be filled in
 * @param title title string
 * @param tickerText ticker text
 * @param canvasType canvas type as defined in MidpComponentType
 * @return error code
 */
extern "C" MidpError
lfpport_canvas_create(MidpDisplayable* canvasPtr, const pcsl_string* title,
		      const pcsl_string* tickerText) {
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();

  /* Suppress unused-parameter warning */
  (void)tickerText;

    // Fill in MidpDisplayable structure
    canvasPtr->frame.widgetPtr	 = mscreen;
    canvasPtr->frame.show	 = canvas_show;
    canvasPtr->frame.hideAndDelete = canvas_hide_and_delete;
    canvasPtr->frame.handleEvent = canvas_handle_event;
    canvasPtr->setTitle		 = displayable_set_title;
    canvasPtr->setTicker	 = displayable_set_ticker;

    canvasPtr->setTitle(canvasPtr, title);
    /*canvasPtr->setTicker(canvasPtr, tickerText);*/

    // Give focus to mscreen so it can pass key/mouse events to Java
    mscreen->setFocus();

    // NOTE: if screen is in full mode different height will be set
    // later by MScreen::setFullScreenMode()
    mscreen->resizeContents(mscreen->getDisplayWidth(), 
                            mscreen->getScreenHeight());

    return KNI_OK;
}
/**
 * Override QMultiLineEdit to notify Java peer of traversal out.
 *
 * @param keyEvent key event to handle
 */
void TextFieldBody::keyReleaseEvent(QKeyEvent *key)
{
    int k = key->key();
    // always handle select event because it switches 
    // between the modal and non-modal modes
#ifdef QT_KEYPAD_MODE
    if (k == Qt::Key_Select) {
        QMultiLineEdit::keyReleaseEvent(key);
    } else if (isModalEditing()) {
#endif
        int line;
        int col;
        QMultiLineEdit::getCursorPosition(&line, &col);
        if (k == Qt::Key_Up && line == 0)  {
            PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
            mscreen->keyReleaseEvent(key);
        } else if (k == Qt::Key_Down && line == numLines() - 1) {
            PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
            mscreen->keyReleaseEvent(key);
        } else {
            QMultiLineEdit::keyReleaseEvent(key);
        }
#ifdef QT_KEYPAD_MODE
    } else {
        // not handle events while it's in not modal state
        key->ignore();
    }
#endif
}
/**
 * returns current viewport height
 * \param viewport height return value
 */
extern "C" MidpError
lfpport_form_get_viewport_height(int *height)
{
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  TRACE_CI(lfpport_form_get_viewport_height);
  *height = mscreen->visibleHeight();
 
  return KNI_OK;
}
/**
 * sets current scroll Y position
 */
extern "C" MidpError
lfpport_form_set_scroll_position(int pos)
{
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  TRACE_CI(pdMidpFormSetScrollPosition);
  mscreen->setScrollPosition(pos);
 
  return KNI_OK;
}
/**
 * Set current Item.
 */
extern "C" MidpError
lfpport_form_set_current_item(MidpItem* itemPtr, int yOffset) {
    PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
    QWidget* itemWidgetPtr = (QWidget *)itemPtr->widgetPtr;
    // Make it visible
    mscreen->ensureVisible(itemWidgetPtr->x(), itemWidgetPtr->y() + yOffset, 0, 0);
    // Give focus to it
    itemWidgetPtr->setFocus();

    return KNI_OK;
}
/**
 * Set content of the container window.
 */
extern "C" MidpError
lfpport_form_set_content_size(MidpDisplayable* dispPtr, int w, int h) {

  QWidget *container = (QWidget *)((MidpFrame *)dispPtr)->widgetPtr;
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();

  if (h <= mscreen->getDisplayHeight()) {
    w = mscreen->getDisplayWidth();
    h = mscreen->getDisplayHeight(); 
  }

  container->resize(w, h);
  mscreen->resizeContents(w, h);

  return KNI_OK;
}
/** 
 * Refresh the area specified.
 * @param x relative to drawable
 * @param y relative to drawable
 * @param width width of the area to be updated
 * @param height height of the area to be updated 
 */
MidpError
CustomItem::refresh(int x,
		    int y,
		    int width,
		    int height)
{
#if REPORT_LEVEL <= LOG_INFORMATION
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  reportToLog(LOG_INFORMATION, LC_HIGHUI, 
	      "+ CustomItem::refresh: (%d,%d) (%dx%d)\n",
	      x, y, width, height);
  
  reportToLog(LOG_INFORMATION, LC_HIGHUI, 
	      "+       QWidget::pos() = (%d,%d)  drawable->pos() = (%d,%d)\n",
	      QWidget::pos().x(), QWidget::pos().y(),
	      drawable->pos().x(), drawable->pos().y());
  
  reportToLog(LOG_INFORMATION, LC_HIGHUI, 
	      "+           scroll position = %d\n",
	      mscreen->scrollPosition());

  reportToLog(LOG_INFORMATION, LC_HIGHUI, 
	      "+\t\tbitBlt(\tdst, %d, %d,\n\t\t\tsrc, %d, %d, %d, %d); ",
	      x, // dx
	      y, // dy

	      QWidget::pos().x() + drawable->pos().x() + x,
	      QWidget::pos().y() + drawable->pos().y() + y -
	      mscreen->scrollPosition(),
	      
	      width,
	      height);
#endif
   
  drawable->refresh(x, y, width, height);

  REPORT_INFO(LC_HIGHUI, "bitBlt complete.\n\n");

  return KNI_OK;  
}
void DrawableArea::mouseReleaseEvent( QMouseEvent *mouse)
{
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  mouseIsPressed = FALSE;
  mscreen->viewportMouseReleaseEvent(mouse);
}
void DrawableArea::mouseMoveEvent( QMouseEvent *mouse)
{
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  if (mouseIsPressed)
    mscreen->viewportMouseMoveEvent(mouse);
}
void CustomItem::keyReleaseEvent(QKeyEvent *key)
{
  PlatformMScreen * mscreen = PlatformMScreen::getMScreen();
  mscreen->keyReleaseEvent(key);
}