38ef30b9cc
Gregory Nutt is the copyright holder for those files and he has submitted the SGA as a result we can migrate the licenses to Apache. Signed-off-by: Alin Jerpelea <alin.jerpelea@sony.com>
518 lines
13 KiB
C++
518 lines
13 KiB
C++
/********************************************************************************************
|
|
* apps/graphics/nxwm/src/capplicationwindow.cxx
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
********************************************************************************************/
|
|
|
|
/********************************************************************************************
|
|
* Included Files
|
|
********************************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <nuttx/nx/nxglib.h>
|
|
|
|
#include "graphics/nxwidgets/nxconfig.hxx"
|
|
#include "graphics/nxwidgets/cwidgetcontrol.hxx"
|
|
#include "graphics/nxwidgets/cgraphicsport.hxx"
|
|
|
|
#include "graphics/nxglyphs.hxx"
|
|
#include "graphics/nxwm/nxwmconfig.hxx"
|
|
#include "graphics/nxwm/cwindowmessenger.hxx"
|
|
#include "graphics/nxwm/capplicationwindow.hxx"
|
|
|
|
/********************************************************************************************
|
|
* Pre-Processor Definitions
|
|
********************************************************************************************/
|
|
|
|
#ifdef CONFIG_NXWM_STOP_BITMAP
|
|
extern const struct NXWidgets::SRlePaletteBitmap CONFIG_NXWM_STOP_BITMAP;
|
|
#else
|
|
# define CONFIG_NXWM_STOP_BITMAP NXWidgets::g_stopBitmap
|
|
#endif
|
|
|
|
#ifdef CONFIG_NXWM_MINIMIZE_BITMAP
|
|
extern const struct NXWidgets::SRlePaletteBitmap CONFIG_NXWM_MINIMIZE_BITMAP;
|
|
#else
|
|
# define CONFIG_NXWM_MINIMIZE_BITMAP NXWidgets::g_minimizeBitmap
|
|
#endif
|
|
|
|
/********************************************************************************************
|
|
* CApplicationWindow Method Implementations
|
|
********************************************************************************************/
|
|
|
|
using namespace NxWM;
|
|
|
|
/**
|
|
* CApplicationWindow Constructor
|
|
*
|
|
* @param taskbar. A pointer to the parent task bar instance.
|
|
* @param flags. Optional flags to control the window configuration (See EWindowFlags).
|
|
*/
|
|
|
|
CApplicationWindow::CApplicationWindow(NXWidgets::CNxTkWindow *window, uint8_t flags)
|
|
{
|
|
// Save the window and window flags for later use
|
|
|
|
m_window = window;
|
|
m_flags = flags;
|
|
|
|
// These will be created with the open method is called
|
|
|
|
m_toolbar = (NXWidgets::CNxToolbar *)0;
|
|
|
|
m_minimizeImage = (NXWidgets::CImage *)0;
|
|
m_stopImage = (NXWidgets::CImage *)0;
|
|
m_windowLabel = (NXWidgets::CLabel *)0;
|
|
|
|
m_minimizeBitmap = (NXWidgets::CRlePaletteBitmap *)0;
|
|
m_stopBitmap = (NXWidgets::CRlePaletteBitmap *)0;
|
|
|
|
m_windowFont = (NXWidgets::CNxFont *)0;
|
|
|
|
// This will be initialized when the registerCallbacks() method is called
|
|
|
|
m_callback = (IApplicationCallback *)0;
|
|
}
|
|
|
|
/**
|
|
* CApplicationWindow Destructor
|
|
*/
|
|
|
|
CApplicationWindow::~CApplicationWindow(void)
|
|
{
|
|
// Free the resources that we are responsible for
|
|
|
|
if (m_minimizeImage)
|
|
{
|
|
delete m_minimizeImage;
|
|
}
|
|
|
|
if (m_stopImage)
|
|
{
|
|
delete m_stopImage;
|
|
}
|
|
|
|
if (m_windowLabel)
|
|
{
|
|
delete m_windowLabel;
|
|
}
|
|
|
|
if (m_minimizeBitmap)
|
|
{
|
|
delete m_minimizeBitmap;
|
|
}
|
|
|
|
if (m_stopBitmap)
|
|
{
|
|
delete m_stopBitmap;
|
|
}
|
|
|
|
if (m_windowFont)
|
|
{
|
|
delete m_windowFont;
|
|
}
|
|
|
|
if (m_toolbar)
|
|
{
|
|
delete m_toolbar;
|
|
}
|
|
|
|
// We didn't create the window. That was done by the task bar,
|
|
// But we will handle destruction of with window as a courtesy.
|
|
|
|
if (m_window)
|
|
{
|
|
delete m_window;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize window. Window initialization is separate from
|
|
* object instantiation so that failures can be reported.
|
|
*
|
|
* @return True if the window was successfully initialized.
|
|
*/
|
|
|
|
bool CApplicationWindow::open(void)
|
|
{
|
|
// Create the widget control (with the window messenger) using the default style
|
|
|
|
CWindowMessenger *control = new CWindowMessenger();
|
|
if (!control)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Open the toolbar using the widget control
|
|
|
|
m_toolbar = m_window->openToolbar(CONFIG_NXWM_TOOLBAR_HEIGHT, control);
|
|
if (!m_toolbar)
|
|
{
|
|
// We failed to open the toolbar
|
|
|
|
return false;
|
|
}
|
|
|
|
// Get the width of the display
|
|
|
|
struct nxgl_size_s windowSize;
|
|
if (!m_toolbar->getSize(&windowSize))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Start positioning icons from the right side of the tool bar
|
|
|
|
struct nxgl_point_s iconPos;
|
|
struct nxgl_size_s iconSize;
|
|
|
|
iconPos.x = windowSize.w;
|
|
|
|
// Create the STOP icon only if this is a non-persistent application
|
|
|
|
if (!isPersistent())
|
|
{
|
|
// Create STOP bitmap container
|
|
|
|
m_stopBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_STOP_BITMAP);
|
|
if (!m_stopBitmap)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Create the STOP application icon at the right of the toolbar
|
|
// Get the height and width of the stop bitmap
|
|
|
|
iconSize.w = m_stopBitmap->getWidth();
|
|
iconSize.h = m_stopBitmap->getHeight();
|
|
|
|
// The default CImage has borders enabled with thickness of the border
|
|
// width. Add twice the thickness of the border to the width and height.
|
|
// (We could let CImage do this for us by calling
|
|
// CImage::getPreferredDimensions())
|
|
|
|
iconSize.w += 2 * 1;
|
|
iconSize.h += 2 * 1;
|
|
|
|
// Pick an X/Y position such that the image will position at the right of
|
|
// the toolbar and centered vertically.
|
|
|
|
iconPos.x -= iconSize.w;
|
|
|
|
if (iconSize.h >= windowSize.h)
|
|
{
|
|
iconPos.y = 0;
|
|
}
|
|
else
|
|
{
|
|
iconPos.y = (windowSize.h - iconSize.h) >> 1;
|
|
}
|
|
|
|
// Now we have enough information to create the image
|
|
|
|
m_stopImage = new NXWidgets::CImage(control, iconPos.x, iconPos.y, iconSize.w,
|
|
iconSize.h, m_stopBitmap);
|
|
if (!m_stopImage)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Configure 'this' to receive mouse click inputs from the image
|
|
|
|
m_stopImage->setBorderless(true);
|
|
m_stopImage->addWidgetEventHandler(this);
|
|
}
|
|
|
|
#ifndef CONFIG_NXWM_DISABLE_MINIMIZE
|
|
// Create MINIMIZE application bitmap container
|
|
|
|
m_minimizeBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MINIMIZE_BITMAP);
|
|
if (!m_minimizeBitmap)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Get the height and width of the stop bitmap
|
|
|
|
iconSize.w = m_minimizeBitmap->getWidth();
|
|
iconSize.h = m_minimizeBitmap->getHeight();
|
|
|
|
// The default CImage has borders enabled with thickness of the border
|
|
// width. Add twice the thickness of the border to the width and height.
|
|
// (We could let CImage do this for us by calling
|
|
// CImage::getPreferredDimensions())
|
|
|
|
iconSize.w += 2 * 1;
|
|
iconSize.h += 2 * 1;
|
|
|
|
// Pick an X/Y position such that the image will position at the right of
|
|
// the toolbar and centered vertically.
|
|
|
|
iconPos.x -= iconSize.w;
|
|
|
|
if (iconSize.h >= windowSize.h)
|
|
{
|
|
iconPos.y = 0;
|
|
}
|
|
else
|
|
{
|
|
iconPos.y = (windowSize.h - iconSize.h) >> 1;
|
|
}
|
|
|
|
// Now we have enough information to create the image
|
|
|
|
m_minimizeImage = new NXWidgets::CImage(control, iconPos.x, iconPos.y, iconSize.w,
|
|
iconSize.h, m_minimizeBitmap);
|
|
if (!m_minimizeImage)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Configure 'this' to receive mouse click inputs from the image
|
|
|
|
m_minimizeImage->setBorderless(true);
|
|
m_minimizeImage->addWidgetEventHandler(this);
|
|
#endif
|
|
|
|
// The rest of the toolbar will hold the left-justified application label
|
|
// Create the default font instance
|
|
|
|
m_windowFont = new NXWidgets::CNxFont((nx_fontid_e)CONFIG_NXWM_TOOLBAR_FONTID,
|
|
CONFIG_NXWM_DEFAULT_FONTCOLOR,
|
|
CONFIG_NXWM_TRANSPARENT_COLOR);
|
|
if (!m_windowFont)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Get the height and width of the text display area
|
|
|
|
iconSize.w = iconPos.x;
|
|
iconSize.h = windowSize.h;
|
|
|
|
iconPos.x = 0;
|
|
iconPos.y = 0;
|
|
|
|
// Now we have enough information to create the label
|
|
|
|
m_windowLabel = new NXWidgets::CLabel(control, iconPos.x, iconPos.y,
|
|
iconSize.w, iconSize.h, "");
|
|
if (!m_windowLabel)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Configure the label
|
|
|
|
m_windowLabel->setFont(m_windowFont);
|
|
m_windowLabel->setBorderless(true);
|
|
m_windowLabel->setTextAlignmentHoriz(NXWidgets::CLabel::TEXT_ALIGNMENT_HORIZ_LEFT);
|
|
m_windowLabel->setTextAlignmentVert(NXWidgets::CLabel::TEXT_ALIGNMENT_VERT_CENTER);
|
|
m_windowLabel->setRaisesEvents(false);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Re-draw the application window
|
|
*/
|
|
|
|
void CApplicationWindow::redraw(void)
|
|
{
|
|
// Get the widget control from the task bar
|
|
|
|
NXWidgets::CWidgetControl *control = m_toolbar->getWidgetControl();
|
|
|
|
// Get the graphics port for drawing on the background window
|
|
|
|
NXWidgets::CGraphicsPort *port = control->getGraphicsPort();
|
|
|
|
// Get the size of the window
|
|
|
|
struct nxgl_size_s windowSize;
|
|
if (!m_toolbar->getSize(&windowSize))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Fill the entire tool bar with the non-shadowed border color
|
|
|
|
port->drawFilledRect(0, 0, windowSize.w, windowSize.h,
|
|
CONFIG_NXTK_BORDERCOLOR1);
|
|
|
|
// Then draw the stop image (which may not be present if this is a
|
|
// "persistent" application)
|
|
|
|
if (m_stopImage)
|
|
{
|
|
m_stopImage->enableDrawing();
|
|
m_stopImage->redraw();
|
|
m_stopImage->setRaisesEvents(true);
|
|
}
|
|
|
|
// Draw the minimize image (which may not be present if this is a
|
|
// mimimization is disabled)
|
|
|
|
if (m_minimizeImage)
|
|
{
|
|
m_minimizeImage->enableDrawing();
|
|
m_minimizeImage->redraw();
|
|
m_minimizeImage->setRaisesEvents(true);
|
|
}
|
|
|
|
// And finally draw the window label
|
|
|
|
m_windowLabel->enableDrawing();
|
|
m_windowLabel->redraw();
|
|
}
|
|
|
|
/**
|
|
* The application window is hidden (either it is minimized or it is
|
|
* maximized, but not at the top of the hierarchy)
|
|
*/
|
|
|
|
void CApplicationWindow::hide(void)
|
|
{
|
|
// Disable the stop image (which may not be present if this is a
|
|
// "persistent" application)
|
|
|
|
if (m_stopImage)
|
|
{
|
|
m_stopImage->disableDrawing();
|
|
m_stopImage->setRaisesEvents(false);
|
|
}
|
|
|
|
// Disable the minimize image(which may not be present if this is a
|
|
// mimimization is disabled)
|
|
|
|
if (m_minimizeImage)
|
|
{
|
|
m_minimizeImage->disableDrawing();
|
|
m_minimizeImage->setRaisesEvents(false);
|
|
}
|
|
|
|
// Disable the window label
|
|
|
|
m_windowLabel->disableDrawing();
|
|
}
|
|
|
|
/**
|
|
* Recover the contained NXTK window instance
|
|
*
|
|
* @return. The window used by this application
|
|
*/
|
|
|
|
NXWidgets::INxWindow *CApplicationWindow::getWindow(void) const
|
|
{
|
|
return static_cast<NXWidgets::INxWindow*>(m_window);
|
|
}
|
|
|
|
/**
|
|
* Recover the contained widget control
|
|
*
|
|
* @return. The widget control used by this application
|
|
*/
|
|
|
|
NXWidgets::CWidgetControl *CApplicationWindow::getWidgetControl(void) const
|
|
{
|
|
return m_window->getWidgetControl();
|
|
}
|
|
|
|
/**
|
|
* Block further activity on this window in preparation for window
|
|
* shutdown.
|
|
*
|
|
* @param app. The application to be blocked
|
|
*/
|
|
|
|
void CApplicationWindow::block(IApplication *app)
|
|
{
|
|
// Get the widget control from the NXWidgets::CNxWindow instance
|
|
|
|
NXWidgets::CWidgetControl *control = m_window->getWidgetControl();
|
|
|
|
// And then block further reporting activity on the underlying
|
|
// NX framed window
|
|
|
|
nxtk_block(control->getWindowHandle(), (FAR void *)app);
|
|
}
|
|
|
|
/**
|
|
* Set the window label
|
|
*
|
|
* @param appname. The name of the application to place on the window
|
|
*/
|
|
|
|
void CApplicationWindow::setWindowLabel(NXWidgets::CNxString &appname)
|
|
{
|
|
m_windowLabel->setText(appname);
|
|
}
|
|
|
|
/**
|
|
* Report of this is a "normal" window or a full screen window. The
|
|
* primary purpose of this method is so that window manager will know
|
|
* whether or not it show draw the task bar.
|
|
*
|
|
* @return True if this is a full screen window.
|
|
*/
|
|
|
|
bool CApplicationWindow::isFullScreen(void) const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Register to receive callbacks when toolbar icons are selected
|
|
*/
|
|
|
|
void CApplicationWindow::registerCallbacks(IApplicationCallback *callback)
|
|
{
|
|
m_callback = callback;
|
|
}
|
|
|
|
/**
|
|
* Handle a widget action event. For CImage, this is a mouse button pre-release event.
|
|
*
|
|
* @param e The event data.
|
|
*/
|
|
|
|
void CApplicationWindow::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
|
|
{
|
|
// Ignore the event if no callback is registered
|
|
|
|
if (m_callback)
|
|
{
|
|
// Check the stop application image
|
|
|
|
if (m_stopImage && m_stopImage->isClicked())
|
|
{
|
|
// Notify the controlling logic that the application should be stopped
|
|
|
|
m_callback->close();
|
|
}
|
|
|
|
// Check the minimize image (only if the stop application image is not pressed)
|
|
|
|
else if (m_minimizeImage && m_minimizeImage->isClicked())
|
|
{
|
|
// Notify the controlling logic that the application should be miminsed
|
|
|
|
m_callback->minimize();
|
|
}
|
|
}
|
|
}
|