From 966fe28c59f59fc8be795c8215b9352435982445 Mon Sep 17 00:00:00 2001 From: Aki Date: Thu, 30 Sep 2021 16:46:36 +0200 Subject: Merged nGenEx and Parser into Stars45 --- nGenEx/ActiveWindow.cpp | 1026 ----------------------------------------------- 1 file changed, 1026 deletions(-) delete mode 100644 nGenEx/ActiveWindow.cpp (limited to 'nGenEx/ActiveWindow.cpp') diff --git a/nGenEx/ActiveWindow.cpp b/nGenEx/ActiveWindow.cpp deleted file mode 100644 index 4d78b72..0000000 --- a/nGenEx/ActiveWindow.cpp +++ /dev/null @@ -1,1026 +0,0 @@ -/* Starshatter OpenSource Distribution - Copyright (c) 1997-2004, Destroyer Studios LLC. - All Rights Reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name "Destroyer Studios" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - SUBSYSTEM: nGenEx.lib - FILE: ActiveWindow.cpp - AUTHOR: John DiCamillo - - - OVERVIEW - ======== - Window class -*/ - -#include -#include "MemDebug.h" -#include "ActiveWindow.h" -#include "EventDispatch.h" -#include "Color.h" -#include "Bitmap.h" -#include "Font.h" -#include "FontMgr.h" -#include "Layout.h" -#include "Polygon.h" -#include "Screen.h" -#include "View.h" -#include "Video.h" - -// +--------------------------------------------------------------------+ - -Font* ActiveWindow::sys_font = 0; -Color ActiveWindow::sys_back_color = Color(128,128,128); -Color ActiveWindow::sys_fore_color = Color( 0, 0, 0); - -void ActiveWindow::SetSystemFont(Font* f) { sys_font = f; } -void ActiveWindow::SetSystemBackColor(Color c) { sys_back_color = c; } -void ActiveWindow::SetSystemForeColor(Color c) { sys_fore_color = c; } - -// +--------------------------------------------------------------------+ - -ActiveWindow::ActiveWindow(Screen* screen, int ax, int ay, int aw, int ah, - DWORD aid, DWORD s, ActiveWindow* pParent) - : Window(screen, ax, ay, aw, ah), id(aid), style(s), focus(false), - enabled(true), text_align(DT_CENTER), single_line(false), alpha(1), - texture(0), back_color(sys_back_color), fore_color(sys_fore_color), - parent(pParent), form(0), transparent(false), topmost(true), - layout(0), rows(1), cols(1), polys(0), vset(0), mtl(0), - fixed_width(0), fixed_height(0), hide_partial(true) -{ - ZeroMemory(tab, sizeof(tab)); - - font = sys_font; - - if (parent) { - parent->AddChild(this); - } - else { - screen->AddWindow(this); - } - - shown = false; - Show(); - - char buf[32]; - sprintf_s(buf, "ActiveWindow %d", id); //-V576 - desc = buf; -} - -// +--------------------------------------------------------------------+ - -ActiveWindow::~ActiveWindow() -{ - if (layout) delete layout; - - screen->DelWindow(this); - Hide(); - clients.destroy(); - children.destroy(); - - if (polys) delete [] polys; - if (vset) delete vset; - if (mtl) delete mtl; -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::Show() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - dispatch->Register(this); - - ListIter v_iter = view_list; - while (++v_iter) { - View* view = v_iter.value(); - view->OnShow(); - } - - ListIter c_iter = children; - while (++c_iter) { - ActiveWindow* child = c_iter.value(); - child->Show(); - } - - shown = true; -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::Hide() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) { - dispatch->Unregister(this); - focus = false; - } - - ListIter v_iter = view_list; - while (++v_iter) { - View* view = v_iter.value(); - view->OnHide(); - } - - ListIter c_iter = children; - while (++c_iter) { - ActiveWindow* child = c_iter.value(); - child->Hide(); - } - - shown = false; -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::MoveTo(const Rect& r) -{ - if (rect.x == r.x && - rect.y == r.y && - rect.w == r.w && - rect.h == r.h) - return; - - rect = r; - CalcGrid(); - - ListIter v = view_list; - while (++v) - v->OnWindowMove(); - - if (layout) - layout->DoLayout(this); -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::AddChild(ActiveWindow* child) -{ - if (child) - children.append(child); -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::DoLayout() -{ - if (layout) - layout->DoLayout(this); -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::UseLayout(const std::vector& min_x, -const std::vector& min_y, -const std::vector& weight_x, -const std::vector& weight_y) -{ - if (!layout) - layout = new(__FILE__,__LINE__) Layout; - - if (layout) - layout->SetConstraints(min_x, min_y, weight_x, weight_y); -} - -void -ActiveWindow::UseLayout(const std::vector& min_x, -const std::vector& min_y, -const std::vector& weight_x, -const std::vector& weight_y) -{ - if (!layout) - layout = new(__FILE__,__LINE__) Layout; - - if (layout) - layout->SetConstraints(min_x, min_y, weight_x, weight_y); -} - -void -ActiveWindow::UseLayout(int nrows, -int ncols, -int* min_x, -int* min_y, -float* weight_x, -float* weight_y) -{ - if (!layout) - layout = new(__FILE__,__LINE__) Layout; - - if (layout) - layout->SetConstraints(nrows, ncols, min_x, min_y, weight_x, weight_y); -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::Paint() -{ - Draw(); -} - -// +--------------------------------------------------------------------+ - -Color -ActiveWindow::ShadeColor(Color c, double shade) -{ - int ishade = (int) (shade * Color::SHADE_LEVELS); - return c.ShadeColor(ishade); -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::Draw() -{ - int w = rect.w; - int h = rect.h; - - if (w < 1 || h < 1 || !shown) - return; - - float old_alpha = alpha; - - if (!enabled) - SetAlpha(0.5); - - if (!transparent) { - if (texture && texture->Width()) { - DrawTextureGrid(); - } - else { - FillRect(0, 0, w, h, ShadeColor(back_color, 1.0)); - } - } - - if (enabled && view_list.size()) { - ListIter v = view_list; - while (++v) - v->Refresh(); - } - - if (!transparent) { - DrawStyleRect(0, 0, w, h, style); - } - - // draw text here: - DrawTabbedText(); - - if (!enabled) - SetAlpha(old_alpha); - - // update children windows: - ListIter iter = children; - while (++iter) { - ActiveWindow* child = iter.value(); - child->Draw(); - } -} - -void -ActiveWindow::CalcGrid() -{ - if (polys) delete [] polys; - if (vset) delete vset; - if (mtl) delete mtl; - - rows = 1; - cols = 1; - - if (!texture || texture->Width() < 1) - return; - - if (margins.left > 0) cols++; - if (margins.right > 0) cols++; - if (margins.top > 0) rows++; - if (margins.bottom > 0) rows++; - - int npolys = rows*cols; - int nverts = (rows+1) * (cols+1); - - if (style & WIN_FRAME_ONLY && npolys == 9) - npolys = 8; // skip the center poly - - if (npolys > 0) { - int i, j; - int x_offsets[4]; - int y_offsets[4]; - float u_offsets[4]; - float v_offsets[4]; - - x_offsets[0] = 0; - x_offsets[1] = margins.left ? margins.left : rect.w - margins.right; - x_offsets[2] = cols==2 ? rect.w : rect.w - margins.right; - x_offsets[3] = rect.w; - - y_offsets[0] = 0; - y_offsets[1] = margins.top ? margins.top : rect.h - margins.bottom; - y_offsets[2] = rows==2 ? rect.h : rect.h - margins.bottom; - y_offsets[3] = rect.h; - - float tex_w = (float) texture->Width(); - float tex_h = (float) texture->Height(); - - if (tex_w > rect.w) tex_w = (float) rect.w; - if (tex_h > rect.h) tex_h = (float) rect.h; - - u_offsets[0] = 0.0f; - u_offsets[1] = margins.left ? (float) margins.left : tex_w - (float) margins.right; - u_offsets[2] = cols==2 ? tex_w : tex_w - (float) margins.right; - u_offsets[3] = tex_w; - - v_offsets[0] = 0.0f; - v_offsets[1] = margins.top ? (float) margins.top : tex_h - (float) margins.bottom; - v_offsets[2] = rows==2 ? tex_h : tex_h - (float) margins.bottom; - v_offsets[3] = tex_h; - - tex_w = (float) texture->Width(); - tex_h = (float) texture->Height(); - - vset = new(__FILE__,__LINE__) VertexSet(nverts); - - int v = 0; - - Color c = Color::White; - c.SetAlpha((BYTE) (alpha*255)); - - vset->space = VertexSet::SCREEN_SPACE; - - for (i = 0; i <= rows; i++) { - for (j = 0; j <= cols; j++) { - vset->diffuse[v] = c.Value(); - - vset->s_loc[v].x = (float) (rect.x + x_offsets[j]) - 0.5f; - vset->s_loc[v].y = (float) (rect.y + y_offsets[i]) - 0.5f; - vset->s_loc[v].z = 0.0f; - vset->rw[v] = 1.0f; - - vset->tu[v] = u_offsets[j] / tex_w; - vset->tv[v] = v_offsets[i] / tex_h; - - v++; - } - } - - mtl = new(__FILE__,__LINE__) Material; - mtl->tex_diffuse = texture; - - polys = new(__FILE__,__LINE__) Poly[npolys]; - - Poly* p = polys; - - ZeroMemory(polys, npolys*sizeof(Poly)); - - for (i = 0; i < rows; i++) { - for (j = 0; j < cols; j++) { - if (style & WIN_FRAME_ONLY) { - if (i == 1 && j == 1) - continue; - } - - p->nverts = 4; - p->vertex_set = vset; - p->material = mtl; - - p->verts[0] = (i+0)*(cols+1) + j; - p->verts[1] = (i+0)*(cols+1) + j + 1; - p->verts[2] = (i+1)*(cols+1) + j + 1; - p->verts[3] = (i+1)*(cols+1) + j; - - p++; - } - } - } -} - -void -ActiveWindow::DrawTextureGrid() -{ - int npolys = rows*cols; - - if (style & WIN_FRAME_ONLY && npolys == 9) - npolys = 8; // skip the center poly - - if (mtl) { - mtl->tex_diffuse = texture; - } - - int blend = Video::BLEND_SOLID; - - if (alpha < 1) - blend = Video::BLEND_ALPHA; - - Video* video = screen->GetVideo(); - video->SetRenderState(Video::TEXTURE_WRAP, 0); - video->DrawScreenPolys(npolys, polys, blend); - video->SetRenderState(Video::TEXTURE_WRAP, 1); -} - -void -ActiveWindow::DrawStyleRect(const Rect& r, int style) -{ - DrawStyleRect(r.x, r.y, r.x+r.w, r.y+r.h, style); -} - -void -ActiveWindow::DrawStyleRect(int x1, int y1, int x2, int y2, int style) -{ - if (style & WIN_THIN_FRAME) { - DrawRect(x1,y1,x2-1,y2-1, ShadeColor(fore_color, 1.0)); - } - else if (style & WIN_THICK_FRAME) { - DrawRect(x1+0,y1+0,x2-1,y2-1, ShadeColor(fore_color, 1.0)); - DrawRect(x1+1,y1+1,x2-2,y2-2, ShadeColor(fore_color, 1.0)); - DrawRect(x1+2,y1+2,x2-3,y2-3, ShadeColor(fore_color, 1.0)); - } - else { - // draw bevel: - if ((style & WIN_RAISED_FRAME) && (style & WIN_SUNK_FRAME)) { - Color c = ShadeColor(back_color, 1.6); // full highlight - DrawLine(x1, y1, x2-1, y1, c); - DrawLine(x1, y1, x1, y2-1, c); - - c = ShadeColor(back_color, 1.3); // soft highlight - DrawLine(x1+1,y1+1, x2-2, y1+1, c); - DrawLine(x1+1,y1+1, x1+1, y2-2, c); - - c = ShadeColor(back_color, 0.6); // soft shadow - DrawLine(x2-2,y1+1, x2-2,y2-1, c); - DrawLine(x1+1,y2-2, x2-1,y2-2, c); - - c = ShadeColor(back_color, 0.3); // full shadow - DrawLine(x2-1,y1, x2-1,y2, c); - DrawLine(x1 ,y2-1, x2,y2-1, c); - - DrawRect(x1+4,y1+4, x2-5,y2-5, ShadeColor(back_color, 0.6)); // soft shadow - DrawRect(x1+5,y1+5, x2-6,y2-6, ShadeColor(back_color, 0.3)); // full shadow - DrawLine(x1+5,y2-6, x2-5,y2-6, ShadeColor(back_color, 1.3)); // soft highlight (bottom) - DrawLine(x2-6,y1+5, x2-6,y2-6, ShadeColor(back_color, 1.3)); // soft highlight (side) - DrawLine(x1+4,y2-5, x2-4,y2-5, ShadeColor(back_color, 1.6)); // soft highlight (bottom) - DrawLine(x2-5,y1+4, x2-5,y2-5, ShadeColor(back_color, 1.6)); // soft highlight (side) - } - - else if (style & WIN_RAISED_FRAME) { - Color c = ShadeColor(back_color, 1.6); // full highlight - DrawLine(x1, y1, x2-1, y1, c); - DrawLine(x1, y1, x1, y2-1, c); - - c = ShadeColor(back_color, 1.3); // soft highlight - DrawLine(x1+1,y1+1, x2-2, y1+1, c); - DrawLine(x1+1,y1+1, x1+1, y2-2, c); - - c = ShadeColor(back_color, 0.6); // soft shadow - DrawLine(x2-2,y1+1, x2-2,y2-1, c); - DrawLine(x1+1,y2-2, x2-1,y2-2, c); - - c = ShadeColor(back_color, 0.3); // full shadow - DrawLine(x2-1,y1, x2-1,y2, c); - DrawLine(x1 ,y2-1, x2,y2-1, c); - } - - else if (style & WIN_SUNK_FRAME) { - Color c = ShadeColor(back_color, 0.3); // full shadow - DrawLine(x1+1,y1+1, x1+1, y2, c); - DrawLine(x1+1,y1+1, x2, y1+1, c); - - c = ShadeColor(back_color, 0.6); // soft shadow - DrawLine(x1, y1, x1, y2, c); - DrawLine(x1, y1, x2, y1, c); - - c = ShadeColor(back_color, 1.3); // soft highlight - DrawLine(x2-2,y1+1, x2-2,y2-1, c); - DrawLine(x1+1,y2-2, x2-1,y2-2, c); - - c = ShadeColor(back_color, 1.6); // full highlight - DrawLine(x2-1,y1+1, x2-1,y2, c); - DrawLine(x1 ,y2-1, x2,y2-1, c); - } - - // draw frame: - if (style & WIN_BLACK_FRAME) - DrawRect(x1,y1,x2-1,y2-1, ShadeColor(Color::Black, 1.0)); - else if (style & WIN_WHITE_FRAME) - DrawRect(x1,y1,x2-1,y2-1, ShadeColor(Color::White, 1.0)); - } -} - -void -ActiveWindow::DrawTabbedText() -{ - if (shown && font && text.length()) { - Rect label_rect; - - if (text_insets.left) { - label_rect.w = rect.w; - label_rect.h = rect.h; - - label_rect.Inset(text_insets.left, - text_insets.right, - text_insets.top, - text_insets.bottom); - } - else { - int border_size = 4; - - if (style & WIN_RAISED_FRAME && style & WIN_SUNK_FRAME) - border_size = 8; - - label_rect.x = border_size; - label_rect.y = border_size; - label_rect.w = rect.w - border_size * 2; - label_rect.h = rect.h - border_size * 2; - } - - font->SetAlpha(alpha); - - // no tabs set: - if (tab[0] == 0) { - DWORD text_flags = DT_WORDBREAK | text_align; - - if (single_line) - text_flags = text_flags | DT_SINGLELINE; - - if (style & WIN_TEXT_SHADOW) { - label_rect.x++; - label_rect.y++; - - if (transparent) { - font->SetColor(back_color); - DrawText(text.data(), 0, label_rect, text_flags); - } - - else { - Color shadow = ShadeColor(back_color, 1.6); - font->SetColor(shadow); - DrawText(text.data(), 0, label_rect, text_flags); - } - - label_rect.x--; - label_rect.y--; - } - - Color fore = ShadeColor(fore_color, 1); - font->SetColor(fore); - DrawText(text.data(), 0, label_rect, text_flags); - } - - // use tabs: - else { - } - - font->SetAlpha(1); - } -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::SetTabStop(int n, int x) -{ - if (n >= 0 && n < 10) - tab[n] = x; -} - -int -ActiveWindow::GetTabStop(int n) const -{ - if (n >= 0 && n < 10) - return tab[n]; - - return 0; -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::SetText(const char* t) -{ - if (t && text != t) { - int len = strlen(t); - - if (len > 0) { - char* buf = new(__FILE__,__LINE__) char[2*len]; - - if (buf != 0) { - const char* src = t; - char* dst = buf; - - while (*src) { - if (*src != '\\') { - *dst++ = *src++; - } - else { - src++; - - switch (*src) { - case 'n': *dst++ = '\n'; break; - case 't': *dst++ = '\t'; break; - default: *dst++ = *src; break; - } - - src++; - } - } - - *dst = 0; - - if (text != buf) { - text = buf; - } - - delete [] buf; - } - } - else { - text = t; - } - } -} - -void -ActiveWindow::SetText(const Text& t) -{ - if (t && text != t) { - int len = t.length(); - - if (len > 0 && t.contains('\\')) { - char* buf = new(__FILE__,__LINE__) char[2*len]; - - if (buf != 0) { - const char* src = t; - char* dst = buf; - - while (*src) { - if (*src != '\\') { - *dst++ = *src++; - } - else { - src++; - - switch (*src) { - case 'n': *dst++ = '\n'; break; - case 't': *dst++ = '\t'; break; - default: *dst++ = *src; break; - } - - src++; - } - } - - *dst = 0; - - if (text != buf) { - text = buf; - } - - delete [] buf; - } - } - else { - text = t; - } - } -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::AddText(const char* t) -{ - if (t) { - text += t; - } -} - -void -ActiveWindow::AddText(const Text& t) -{ - if (t) { - text += t; - } -} - -void -ActiveWindow::SetTextAlign(DWORD a) -{ - if (a == DT_LEFT || a == DT_RIGHT || a == DT_CENTER) - text_align = a; -} - -void -ActiveWindow::SetMargins(const Insets& m) -{ - margins = m; - CalcGrid(); -} - -void -ActiveWindow::SetTextInsets(const Insets& t) -{ - text_insets = t; -} - -void -ActiveWindow::SetCellInsets(const Insets& c) -{ - cell_insets = c; -} - -void -ActiveWindow::SetCells(int cx, int cy, int cw, int ch) -{ - cells.x = cx; - cells.y = cy; - cells.w = cw; - cells.h = ch; - - if (cells.w < 1) - cells.w = 1; - - if (cells.h < 1) - cells.h = 1; -} - -void -ActiveWindow::SetAlpha(double a) -{ - if (alpha != a) { - alpha = (float) a; - - Color c = Color::White; - c.SetAlpha((BYTE) (alpha*255)); - - if (vset && vset->nverts) { - for (int i = 0; i < vset->nverts; i++) { - vset->diffuse[i] = c.Value(); - } - } - } -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::DrawText(const char* txt, int count, Rect& txt_rect, DWORD flags) -{ - if (font) { - font->SetAlpha(alpha); - Window::DrawText(txt, count, txt_rect, flags); - } -} - -// +--------------------------------------------------------------------+ - -void -ActiveWindow::RegisterClient(int eid, ActiveWindow* client, PFVAWE callback) -{ - AWMap* map = new(__FILE__,__LINE__) AWMap(eid, client, callback); - - if (map != 0) - clients.append(map); -} - -void -ActiveWindow::UnregisterClient(int eid, ActiveWindow* client) -{ - AWMap test(eid, client, 0); - int index = clients.index(&test); - - if (index >= 0) - delete clients.removeIndex(index); -} - -void -ActiveWindow::ClientEvent(int eid, int x, int y) -{ - event.window = this; - event.eid = eid; - event.x = x; - event.y = y; - - ListIter map = clients; - while (++map) { - if (map->eid == eid) - map->func(map->client, &event); - } -} - -// +--------------------------------------------------------------------+ - -int ActiveWindow::OnMouseEnter(int x, int y) -{ - ClientEvent(EID_MOUSE_ENTER, x, y); - return 0; -} - -int ActiveWindow::OnMouseExit(int x, int y) -{ - ClientEvent(EID_MOUSE_EXIT, x, y); - return 0; -} - -int ActiveWindow::OnMouseMove(int x, int y) -{ - ClientEvent(EID_MOUSE_MOVE, x, y); - return 0; -} - -int ActiveWindow::OnMouseWheel(int wheel) -{ - ClientEvent(EID_MOUSE_WHEEL, wheel, 0); - return 0; -} - -int ActiveWindow::OnLButtonDown(int x, int y) -{ - ClientEvent(EID_LBUTTON_DOWN, x, y); - return 0; -} - -int ActiveWindow::OnLButtonUp(int x, int y) -{ - ClientEvent(EID_LBUTTON_UP, x, y); - return 0; -} - -int ActiveWindow::OnClick() -{ - ClientEvent(EID_CLICK); - return 0; -} - -int ActiveWindow::OnSelect() -{ - ClientEvent(EID_SELECT); - return 0; -} - -int ActiveWindow::OnRButtonDown(int x, int y) -{ - ClientEvent(EID_RBUTTON_DOWN, x, y); - return 0; -} - -int ActiveWindow::OnRButtonUp(int x, int y) -{ - ClientEvent(EID_RBUTTON_UP, x, y); - return 0; -} - -int ActiveWindow::OnKeyDown(int vk, int flags) -{ - ClientEvent(EID_KEY_DOWN, vk, flags); - return 0; -} - -int ActiveWindow::OnDragStart(int x, int y) -{ - ClientEvent(EID_DRAG_START, x, y); - return 0; -} - -int ActiveWindow::OnDragDrop(int x, int y, ActiveWindow* source) -{ - ClientEvent(EID_DRAG_DROP, x, y); - return 0; -} - -Rect ActiveWindow::TargetRect() const -{ - return rect; -} - -// +--------------------------------------------------------------------+ - -void ActiveWindow::SetFocus() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - dispatch->SetFocus(this); - - focus = true; - ClientEvent(EID_SET_FOCUS); -} - -void ActiveWindow::KillFocus() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - dispatch->KillFocus(this); - - focus = false; - ClientEvent(EID_KILL_FOCUS); -} - -// +--------------------------------------------------------------------+ - -ActiveWindow* -ActiveWindow::GetCapture() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - return (ActiveWindow*) dispatch->GetCapture(); - - return 0; -} - -// +--------------------------------------------------------------------+ - -bool -ActiveWindow::SetCapture() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - return dispatch->CaptureMouse(this) == 1; - - return false; -} - -// +--------------------------------------------------------------------+ - -int -ActiveWindow::ReleaseCapture() -{ - EventDispatch* dispatch = EventDispatch::GetInstance(); - if (dispatch) - return dispatch->ReleaseMouse(this); - - return 0; -} - -// +--------------------------------------------------------------------+ - -bool -ActiveWindow::IsFormActive() const -{ - if (form) - return form->IsTopMost(); - - return true; -} - -// +--------------------------------------------------------------------+ - -ActiveWindow* -ActiveWindow::FindChild(DWORD id) -{ - ListIter iter = children; - while (++iter) { - ActiveWindow* w = iter.value(); - if (w->GetID() == id) - return w; - - ActiveWindow* w2 = w->FindChild(id); - - if (w2) - return w2; - } - - return 0; -} - - -// +--------------------------------------------------------------------+ - -ActiveWindow* -ActiveWindow::FindChild(int x, int y) -{ - ActiveWindow* mouse_tgt = 0; - - ListIter iter = children; - while (++iter) { - ActiveWindow* test = iter.value(); - if (test->TargetRect().Contains(x,y)) - mouse_tgt = test; - } - - return mouse_tgt; -} -- cgit v1.1