EmbeddedArtists AB / ewgui

Dependents:   app_emwin1 app_emwin2_pos lpc4088_ebb_gui_emwin

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EwWindow.cpp Source File

EwWindow.cpp

00001 #include "mbed.h"
00002 
00003 #include "EwWindow.h"
00004 
00005 #include "GUI.h"
00006 #include "WM.h"
00007 
00008 static void _callback(WM_MESSAGE* pMsg);
00009 static void _register(GUI_HWIN hWin, EwWindow* win, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w));
00010 static void _deregister(GUI_HWIN hWin);
00011 
00012 #define EW_MAX_NUM_WINDOWS (100)
00013 
00014 typedef void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w);
00015 
00016 static GUI_HWIN _regHandles[EW_MAX_NUM_WINDOWS] = {0};
00017 static EwWindow* _regWindows[EW_MAX_NUM_WINDOWS] = {0};
00018 static callbackFunc _regCallbacks[EW_MAX_NUM_WINDOWS] = {0};
00019 
00020 
00021 int EwWindow::_guiWidgetId = GUI_ID_USER;
00022 
00023 EwWindow::EwWindow(EwWindow* parent) {
00024     init(0, 0, 0, 0, parent);
00025 }
00026 
00027 EwWindow::EwWindow(int x, int y, int width, int height, EwWindow* parent) {
00028     init(x, y, width, height, parent);
00029 }
00030 
00031 EwWindow::~EwWindow() {
00032 
00033     _deregister(_hWnd);
00034 
00035     WM_DeleteWindow(_hWnd);
00036 }
00037 
00038 void EwWindow::setParent(EwWindow* parent) {
00039     WM_HWIN hParent = 0;
00040     if (parent != NULL) {
00041         hParent = parent->_hWnd;
00042     }
00043 
00044     WM_AttachWindow(_hWnd, hParent);
00045 }
00046 
00047 void EwWindow::bringToBottom() {
00048     WM_BringToBottom(_hWnd);
00049 }
00050 
00051 void EwWindow::bringToTop() {
00052     WM_BringToTop(_hWnd);
00053 }
00054 
00055 void EwWindow::disable() {
00056     WM_DisableWindow(_hWnd);
00057 }
00058 
00059 void EwWindow::enable() {
00060     WM_EnableWindow(_hWnd);
00061 }
00062 
00063 bool EwWindow::hasTransparency() {
00064     return (WM_GetHasTrans(_hWnd) == 1);
00065 }
00066 
00067 int EwWindow::getX() {
00068     return WM_GetWindowOrgX(_hWnd);
00069 }
00070 
00071 int EwWindow::getY() {
00072     return WM_GetWindowOrgY(_hWnd);
00073 }
00074 
00075 int EwWindow::getWidth() {
00076     return WM_GetWindowSizeX(_hWnd);
00077 }
00078 
00079 int EwWindow::getHeight() {
00080     return WM_GetWindowSizeY(_hWnd);
00081 }
00082 
00083 bool EwWindow::hasInput() {
00084     return (WM_HasCaptured(_hWnd) == 1);
00085 }
00086 
00087 bool EwWindow::hasFocus() {
00088     return (WM_HasFocus(_hWnd) == 1);
00089 }
00090 
00091 bool EwWindow::getStayOnTop() {
00092     return (WM_GetStayOnTop(_hWnd) == 1);
00093 }
00094 
00095 void EwWindow::hide() {
00096     WM_HideWindow(_hWnd);
00097 }
00098 
00099 void EwWindow::invalidate() {
00100     WM_InvalidateWindow(_hWnd);
00101 }
00102 
00103 bool EwWindow::isCompletelyCovered() {
00104     return (WM_IsCompletelyCovered(_hWnd) == 1);
00105 }
00106 
00107 bool EwWindow::isCompletelyVisible() {
00108     return (WM_IsCompletelyVisible(_hWnd) == 1);
00109 }
00110 
00111 bool EwWindow::isEnabled() {
00112     return (WM_IsEnabled(_hWnd) == 1);
00113 }
00114 
00115 bool EwWindow::isVisible() {
00116     return (WM_IsVisible(_hWnd) == 1);
00117 }
00118 
00119 void EwWindow::makeModal() {
00120     WM_MakeModal(_hWnd);
00121 }
00122 
00123 void EwWindow::moveTo(int x, int y) {
00124     WM_MoveChildTo(_hWnd, x, y);
00125 }
00126 
00127 void EwWindow::moveToAbs(int x, int y) {
00128     WM_MoveTo(_hWnd, x, y);
00129 }
00130 
00131 void EwWindow::move(int dx, int dy) {
00132     WM_MoveWindow(_hWnd, dx, dy);
00133 }
00134 
00135 void EwWindow::repaint() {
00136     WM_Paint(_hWnd);
00137 }
00138 
00139 void EwWindow::repaintAll() {
00140     WM_PaintWindowAndDescs(_hWnd);
00141 }
00142 
00143 void EwWindow::resize(int dx, int dy) {
00144     WM_ResizeWindow(_hWnd, dx, dy);
00145 }
00146 
00147 void EwWindow::resizeTo(int width, int height) {
00148     WM_SetSize(_hWnd, width, height);
00149 }
00150 
00151 void EwWindow::setHasTransparency(bool has) {
00152     if (has) {
00153         WM_SetHasTrans(_hWnd);
00154     } else {
00155         WM_ClrHasTrans(_hWnd);
00156     }
00157 }
00158 
00159 void EwWindow::setStayOnTop(bool onTop) {
00160     WM_SetStayOnTop(_hWnd, (onTop ? 1 : 0));
00161 }
00162 
00163 void EwWindow::show() {
00164     WM_ShowWindow(_hWnd);
00165 }
00166 
00167 void EwWindow::setFocus() {
00168     WM_SetFocus(_hWnd);
00169 }
00170 
00171 void EwWindow::update() {
00172     WM_Update(_hWnd);
00173 }
00174 
00175 void EwWindow::updateAll() {
00176     WM_UpdateWindowAndDescs(_hWnd);
00177 }
00178 
00179 ewColor_t EwWindow::setDesktopColor(ewColor_t c) {
00180     return WM_SetDesktopColor(c);
00181 }
00182 
00183 bool EwWindow::paintEvent() {
00184     return false;
00185 }
00186 
00187 bool EwWindow::touchEvent(int x, int y, EwTouchState_t state) {
00188     return false;
00189 }
00190 
00191 bool EwWindow::focusEvent(bool gotFocus) {
00192     return false;
00193 }
00194 
00195 bool EwWindow::resizedEvent() {
00196     return false;
00197 }
00198 
00199 void EwWindow::_setNewHandle(GUI_HWIN hWnd, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w)) {
00200     _deregister(_hWnd);
00201     WM_DeleteWindow(_hWnd);
00202 
00203     _hWnd = hWnd;
00204     _register(_hWnd, this, callbackFunc);
00205 }
00206 
00207 GUI_HWIN EwWindow::_getHandle(EwWindow* w) {
00208     GUI_HWIN h = 0;
00209     WM_CALLBACK *pCb;
00210 
00211     if (w) {
00212         h = w->_hWnd;
00213         pCb = WM_GetCallback(h);
00214 
00215         // If the windows is a frame window return its client window instead
00216         // since the main window handle shouldn't be used when adding child
00217         // windows
00218         if (pCb == FRAMEWIN_Callback) {
00219             h = WM_GetClientWindow(h);
00220         }
00221 
00222     }
00223 
00224     return h;
00225 }
00226 
00227 void EwWindow::init(int x, int y, int width, int height, EwWindow* parent) {
00228 
00229     // TODO: flags
00230 
00231     if (parent) {
00232         _hWnd = WM_CreateWindowAsChild(x, y, width, height, _getHandle(parent),
00233                 (WM_CF_SHOW | WM_CF_MEMDEV), _callback, 0);
00234     } else {
00235         _hWnd = WM_CreateWindow(x, y, width, height, (WM_CF_SHOW | WM_CF_MEMDEV),
00236                 _callback, 0);
00237     }
00238 
00239     _register(_hWnd, this, NULL);
00240 }
00241 
00242 static void _callback(WM_MESSAGE* pMsg) {
00243 
00244     GUI_PID_STATE* pState;
00245     EwTouchState_t touchState;
00246 
00247     bool msgHandled = false;
00248 
00249 
00250     for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) {
00251         if (_regHandles[i] == pMsg->hWin) {
00252 
00253             // callback is overriden
00254             if (_regCallbacks[i] != NULL) {
00255                 _regCallbacks[i](pMsg, _regWindows[i]);
00256 
00257                 // it is the responsibility of the overriden callback function
00258                 // to handle all messages or forward those that aren't handled
00259                 // to default handler.
00260                 msgHandled = false;
00261             }
00262 
00263             else {
00264 
00265                 switch (pMsg->MsgId) {
00266                 case WM_PAINT:
00267                     msgHandled = _regWindows[i]->paintEvent();
00268                     break;
00269                 case WM_TOUCH:
00270                     pState = (GUI_PID_STATE*)pMsg->Data.p;
00271                     if (pState->Pressed == 1) {
00272                         touchState = TouchStatePressed;
00273                     }
00274                     else if (pState->Pressed == 0) {
00275                         touchState = TouchStateReleased;
00276                     }
00277                     else {
00278                         touchState = TouchStateReleasedOutside;
00279                     }
00280 
00281                     msgHandled = _regWindows[i]->touchEvent(pState->x, pState->y, touchState);
00282 
00283                     break;
00284                 case WM_SET_FOCUS:
00285                     msgHandled = _regWindows[i]->focusEvent(pMsg->Data.v == 1);
00286                     break;
00287                 case WM_SIZE:
00288                     msgHandled = _regWindows[i]->resizedEvent();
00289                     break;
00290 
00291                 default:
00292                     msgHandled = false;
00293                 }
00294 
00295 
00296             }
00297 
00298 
00299 
00300             break;
00301         }
00302     }
00303 
00304     if (!msgHandled) {
00305         WM_DefaultProc(pMsg);
00306     }
00307 }
00308 
00309 static void _register(GUI_HWIN hWin, EwWindow* win, void (*callbackFunc)(WM_MESSAGE* pMsg, EwWindow* w)) {
00310     for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) {
00311         if (_regWindows[i] == NULL) {
00312             _regWindows[i] = win;
00313             _regHandles[i] = hWin;
00314             _regCallbacks[i] = callbackFunc;
00315 
00316             if (callbackFunc != NULL) {
00317                 WM_SetCallback(hWin, _callback);
00318             }
00319 
00320             break;
00321         }
00322     }
00323 }
00324 
00325 static void _deregister(GUI_HWIN hWin) {
00326 
00327     for (int i = 0; i < EW_MAX_NUM_WINDOWS; i++) {
00328         if (_regHandles[i] == hWin) {
00329             _regWindows[i] = NULL;
00330             _regHandles[i] = 0;
00331             _regCallbacks[i] = NULL;
00332             break;
00333         }
00334     }
00335 }
00336