system/lib/lcd/gui/Widget/FRAMEWIN_MinMaxRest.c

180 lines
5.5 KiB
C

/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : FRAMEWIN_MinMaxRest.c
Purpose : Add. framewin routines
---------------------------END-OF-HEADER------------------------------
*/
#include <stdlib.h>
#include <string.h>
#include "FRAMEWIN_Private.h"
#include "WIDGET.h"
#include "GUI_Protected.h"
#include "WM_Intern.h"
#if GUI_WINSUPPORT
/*********************************************************************
*
* Static routines
*
**********************************************************************
*/
/*********************************************************************
*
* _InvalidateButton
*/
static void _InvalidateButton(FRAMEWIN_Obj* pObj, int Id) {
WM_HWIN hChild;
WM_Obj* pChild;
for (hChild = pObj->Widget.Win.hFirstChild; hChild; hChild = pChild->hNext) {
pChild = WM_H2P(hChild);
if (WM_GetId(hChild) == Id) {
WM_InvalidateWindow(hChild);
}
}
}
/*********************************************************************
*
* _RestoreMinimized
*/
static void _RestoreMinimized(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) {
/* When window was minimized, restore it */
if (pObj->Flags & FRAMEWIN_SF_MINIMIZED) {
int OldHeight = 1 + pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0;
int NewHeight = 1 + pObj->rRestore.y1 - pObj->rRestore.y0;
WM_ResizeWindow(hObj, 0, NewHeight - OldHeight);
WM_ShowWindow(pObj->hClient);
WM_ShowWindow(pObj->hMenu);
FRAMEWIN__UpdatePositions(pObj);
pObj->Flags &= ~FRAMEWIN_SF_MINIMIZED;
_InvalidateButton(pObj, GUI_ID_MINIMIZE);
}
}
/*********************************************************************
*
* _RestoreMaximized
*/
static void _RestoreMaximized(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) {
/* When window was maximized, restore it */
if (pObj->Flags & FRAMEWIN_SF_MAXIMIZED) {
GUI_RECT r = pObj->rRestore;
WM_MoveTo(hObj, r.x0, r.y0);
WM_SetSize(hObj, r.x1 - r.x0 + 1, r.y1 - r.y0 + 1);
FRAMEWIN__UpdatePositions(pObj);
pObj->Flags &= ~FRAMEWIN_SF_MAXIMIZED;
_InvalidateButton(pObj, GUI_ID_MAXIMIZE);
}
}
/*********************************************************************
*
* _MinimizeFramewin
*/
static void _MinimizeFramewin(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) {
_RestoreMaximized(hObj, pObj);
/* When window is not minimized, minimize it */
if ((pObj->Flags & FRAMEWIN_SF_MINIMIZED) == 0) {
int OldHeight = pObj->Widget.Win.Rect.y1 - pObj->Widget.Win.Rect.y0 + 1;
int NewHeight = FRAMEWIN__CalcTitleHeight(pObj) + pObj->Widget.pEffect->EffectSize * 2 + 2;
pObj->rRestore = pObj->Widget.Win.Rect;
WM_HideWindow(pObj->hClient);
WM_HideWindow(pObj->hMenu);
WM_ResizeWindow(hObj, 0, NewHeight - OldHeight);
FRAMEWIN__UpdatePositions(pObj);
pObj->Flags |= FRAMEWIN_SF_MINIMIZED;
_InvalidateButton(pObj, GUI_ID_MINIMIZE);
}
}
/*********************************************************************
*
* _MaximizeFramewin
*/
static void _MaximizeFramewin(FRAMEWIN_Handle hObj, FRAMEWIN_Obj* pObj) {
_RestoreMinimized(hObj, pObj);
/* When window is not maximized, maximize it */
if ((pObj->Flags & FRAMEWIN_SF_MAXIMIZED) == 0) {
WM_HWIN hParent = pObj->Widget.Win.hParent;
WM_Obj* pParent = WM_H2P(hParent);
GUI_RECT r = pParent->Rect;
if (pParent->hParent == 0) {
r.x1 = LCD_GetXSize();
r.y1 = LCD_GetYSize();
}
pObj->rRestore = pObj->Widget.Win.Rect;
WM_MoveTo(hObj, r.x0, r.y0);
WM_SetSize(hObj, r.x1 - r.x0 + 1, r.y1 - r.y0 + 1);
FRAMEWIN__UpdatePositions(pObj);
pObj->Flags |= FRAMEWIN_SF_MAXIMIZED;
_InvalidateButton(pObj, GUI_ID_MAXIMIZE);
}
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* FRAMEWIN_Minimize
*/
void FRAMEWIN_Minimize(FRAMEWIN_Handle hObj) {
if (hObj) {
FRAMEWIN_Obj* pObj;
WM_LOCK();
pObj = FRAMEWIN_H2P(hObj);
_MinimizeFramewin(hObj, pObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* FRAMEWIN_Maximize
*/
void FRAMEWIN_Maximize(FRAMEWIN_Handle hObj) {
if (hObj) {
FRAMEWIN_Obj* pObj;
WM_LOCK();
pObj = FRAMEWIN_H2P(hObj);
_MaximizeFramewin(hObj, pObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* FRAMEWIN_Restore
*/
void FRAMEWIN_Restore(FRAMEWIN_Handle hObj) {
if (hObj) {
FRAMEWIN_Obj* pObj;
WM_LOCK();
pObj = FRAMEWIN_H2P(hObj);
_RestoreMinimized(hObj, pObj);
_RestoreMaximized(hObj, pObj);
WM_UNLOCK();
}
}
#else
void FRAMEWIN_MinMaxRest_c(void) {} /* avoid empty object files */
#endif /* GUI_WINSUPPORT */