diff options
Diffstat (limited to 'nGenEx/ComboList.cpp')
-rw-r--r-- | nGenEx/ComboList.cpp | 892 |
1 files changed, 458 insertions, 434 deletions
diff --git a/nGenEx/ComboList.cpp b/nGenEx/ComboList.cpp index 962b1bb..4bf35cc 100644 --- a/nGenEx/ComboList.cpp +++ b/nGenEx/ComboList.cpp @@ -1,434 +1,458 @@ -/* Project nGenEx
- Destroyer Studios LLC
- Copyright © 1997-2004. All Rights Reserved.
-
- SUBSYSTEM: nGenEx.lib
- FILE: ComboList.cpp
- AUTHOR: John DiCamillo
-
-
- OVERVIEW
- ========
- Drop-down list of Buttons class
-*/
-
-#include "MemDebug.h"
-#include "ComboList.h"
-#include "ComboBox.h"
-#include "Button.h"
-#include "Video.h"
-#include "Bitmap.h"
-#include "Font.h"
-#include "Screen.h"
-
-// +--------------------------------------------------------------------+
-
-ComboList::ComboList(ComboBox* ctrl, ActiveWindow* p, int ax, int ay, int aw, int ah, int maxentries)
-: ScrollWindow(p, ax, ay, aw, ah + (ah-2)*maxentries + 2, 0, 0, p), combo_box(ctrl)
-{
- button_state = 0;
- button_height = ah;
- captured = 0;
- seln = -1;
- max_entries = maxentries;
- scroll = 0;
- scrolling = false;
- border = true;
- animated = true;
- bevel_width = 5;
-
- if (ctrl)
- CopyStyle(*ctrl);
-
- rect.h = (ah-2)*maxentries + 2;
-
- int screen_height = Video::GetInstance()->Height();
-
- if (rect.h > screen_height) {
- rect.y = 0;
- rect.h = screen_height;
- }
-
- else if (rect.y + rect.h > screen_height) {
- rect.y = screen_height - rect.h;
- }
-}
-
-ComboList::ComboList(ComboBox* ctrl, Screen* s, int ax, int ay, int aw, int ah, int maxentries)
-: ScrollWindow(s, ax, ay, aw, ah + (ah-2)*maxentries + 2, 0), combo_box(ctrl)
-{
- button_state = 0;
- button_height = ah;
- captured = 0;
- seln = -1;
- max_entries = maxentries;
- scroll = 0;
- scrolling = false;
- border = true;
- animated = true;
- bevel_width = 5;
-
- if (ctrl)
- CopyStyle(*ctrl);
-
- rect.h = (ah-2)*maxentries + 2;
-
- int screen_height = Video::GetInstance()->Height();
-
- if (rect.h > screen_height) {
- rect.y = 0;
- rect.h = screen_height;
- }
-
- else if (rect.y + rect.h > screen_height) {
- rect.y = screen_height - rect.h;
- }
-
- screen->AddWindow(this); // just in case the base ctor couldn't do this
-}
-
-// +--------------------------------------------------------------------+
-
-ComboList::~ComboList()
-{
- items.destroy();
-}
-
-// +--------------------------------------------------------------------+
-
-void
-ComboList::CopyStyle(const ComboBox& ctrl)
-{
- active_color = ctrl.GetActiveColor();
- border_color = ctrl.GetBorderColor();
- fore_color = ctrl.GetForeColor();
- back_color = ctrl.GetBackColor();
-
- animated = ctrl.GetAnimated();
- bevel_width = ctrl.GetBevelWidth();
- border = ctrl.GetBorder();
-}
-
-// +--------------------------------------------------------------------+
-
-void
-ComboList::Show()
-{
- if (!scrolling) {
- scrolling = 1;
- scroll = 0;
- }
-
- ScrollWindow::Show();
-}
-
-void
-ComboList::Hide()
-{
- scrolling = 0;
- scroll = 0;
- ScrollWindow::Hide();
-}
-
-// +--------------------------------------------------------------------+
-
-void
-ComboList::Draw()
-{
- int x = 0;
- int y = 0;
- int w = rect.w;
- int h = button_height;
-
- int index = 0;
-
- // opening:
- if (scrolling > 0) {
- int limit = min(items.size(), max_entries);
-
- if (scroll < limit) {
- if (limit > 6)
- scroll += 4;
-
- else if (limit > 4)
- scroll += 2;
-
- else
- scroll += 1;
- }
-
- if (scroll >= limit) {
- scroll = limit;
- scrolling = 0;
- }
- }
-
- // closing:
- else if (scrolling < 0) {
- if (scroll > 0)
- scroll--;
- else
- scrolling = 0;
- }
-
- if (items.size() < 1) {
- Rect btn_rect(x,y,w,h);
- DrawItem(" ", btn_rect, 0);
- }
- else {
- ListIter<Text> item = items;
- while (++item && index < max_entries) {
- Rect btn_rect(x,y,w,h);
- int sub_state = (index == seln) ? button_state : 0;
-
- DrawItem(*item, btn_rect, sub_state);
-
- y += button_height-2;
- index++;
- }
- }
-
- DrawRect(0,0,rect.w-1,rect.h-1,fore_color);
-}
-
-// +--------------------------------------------------------------------+
-
-void
-ComboList::DrawRectSimple(Rect& rect, int state)
-{
- if (state && active_color != Color::Black)
- FillRect(rect, active_color);
- else
- FillRect(rect, back_color);
-}
-
-void
-ComboList::DrawItem(Text label, Rect& btn_rect, int state)
-{
- int x = btn_rect.x;
- int y = btn_rect.y;
- int w = btn_rect.w;
- int h = btn_rect.h;
-
- // draw the bevel:
- DrawRectSimple(btn_rect, state);
-
- // draw text here:
- if (font && label.length()) {
- int border_size = 4;
-
- if (style & WIN_RAISED_FRAME && style & WIN_SUNK_FRAME)
- border_size = 8;
-
- Rect label_rect = CalcLabelRect(btn_rect);
- int vert_space = label_rect.h;
- int horz_space = label_rect.w;
-
- DrawText(label.data(), 0, label_rect, DT_CALCRECT | DT_WORDBREAK | text_align);
- vert_space = (vert_space - label_rect.h)/2;
-
- label_rect.w = horz_space;
-
- if (vert_space > 0)
- label_rect.y += vert_space;
-
- if (animated && state > 0) {
- label_rect.x += state;
- label_rect.y += state;
- }
-
- font->SetColor(fore_color);
- DrawText(label.data(), 0, label_rect, DT_WORDBREAK | text_align);
- }
-}
-
-Rect ComboList::CalcLabelRect(const Rect& btn_rect)
-{
- // fit the text in the bevel:
- Rect label_rect = btn_rect;
- label_rect.Deflate(bevel_width, bevel_width);
-
- return label_rect;
-}
-
-int ComboList::CalcSeln(int x, int y)
-{
- y -= rect.y;
-
- if (button_height < 1)
- return 0;
-
- return (int) (y / (button_height-2));
-}
-
-// +--------------------------------------------------------------------+
-
-int ComboList::OnMouseMove(int x, int y)
-{
- if (captured)
- {
- ActiveWindow* test = GetCapture();
-
- if (test != this)
- {
- captured = false;
- button_state = -1;
- }
- }
-
- int new_seln = CalcSeln(x,y);
-
- if (new_seln != seln) {
- seln = new_seln;
- Button::PlaySound(Button::SND_COMBO_HILITE);
- }
-
- return ActiveWindow::OnMouseMove(x,y);
-}
-
-int ComboList::OnLButtonDown(int x, int y)
-{
- if (!captured)
- captured = SetCapture();
-
- seln = CalcSeln(x,y);
- button_state = 1;
-
- return ActiveWindow::OnLButtonDown(x,y);
-}
-
-int ComboList::OnLButtonUp(int x, int y)
-{
- if (captured) {
- ReleaseCapture();
- captured = 0;
- }
-
- seln = CalcSeln(x,y);
- button_state = -1;
- return ActiveWindow::OnLButtonUp(x,y);
-}
-
-int ComboList::OnClick()
-{
- return ActiveWindow::OnClick();
-}
-
-int ComboList::OnMouseEnter(int mx, int my)
-{
- if (button_state == 0)
- button_state = -1;
-
- return ActiveWindow::OnMouseEnter(mx, my);
-}
-
-int ComboList::OnMouseExit(int mx, int my)
-{
- if (button_state == -1)
- button_state = 0;
-
- return ActiveWindow::OnMouseExit(mx, my);
-}
-
-void ComboList::KillFocus()
-{
- if (combo_box)
- combo_box->HideList();
-}
-
-// +--------------------------------------------------------------------+
-
-void ComboList::ClearItems()
-{
- items.destroy();
-}
-
-// +--------------------------------------------------------------------+
-
-void ComboList::AddItem(const char* item)
-{
- items.append(new(__FILE__,__LINE__) Text(item));
-}
-
-void ComboList::AddItems(ListIter<Text> item)
-{
- while (++item)
- items.append(new(__FILE__,__LINE__) Text(*item));
-}
-
-void ComboList::SetItems(ListIter<Text> item)
-{
- items.destroy();
- while (++item)
- items.append(new(__FILE__,__LINE__) Text(*item));
-
- // Resize window:
-
- int ah = button_height;
- max_entries = items.size();
- Rect r = rect;
- r.y = combo_box->Y();
- int length = max_entries;
-
- if (length < 1)
- length = 1;
-
- r.h = (ah-2)*length + 2;
-
- int screen_height = Video::GetInstance()->Height();
-
- if (r.h > screen_height) {
- r.y = 0;
- r.h = screen_height;
- }
-
- else if (r.y + r.h > screen_height) {
- r.y = screen_height - r.h;
- }
-
- MoveTo(r);
-}
-
-const char* ComboList::GetItem(int index)
-{
- if (index >= 0 && index < items.size())
- return items[index]->data();
- else
- return 0;
-}
-
-void ComboList::SetItem(int index, const char* item)
-{
- if (index >= 0 && index < items.size())
- *items[index] = item;
- else
- items.append(new(__FILE__,__LINE__) Text(item));
-}
-
-int ComboList::GetCount()
-{
- return items.size();
-}
-
-const char* ComboList::GetSelectedItem()
-{
- if (seln >= 0 && seln < items.size())
- return items[seln]->data();
- else
- return 0;
-}
-
-int ComboList::GetSelectedIndex()
-{
- if (seln >= 0 && seln < items.size())
- return seln;
- else
- return -1;
-}
-
-void ComboList::SetSelection(int index)
-{
- if (index >= 0 && index < items.size())
- seln = index;
-}
-
+/* 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: ComboList.cpp + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Drop-down list of Buttons class +*/ + +#include "MemDebug.h" +#include "ComboList.h" +#include "ComboBox.h" +#include "Button.h" +#include "Video.h" +#include "Bitmap.h" +#include "Font.h" +#include "Screen.h" + +// +--------------------------------------------------------------------+ + +ComboList::ComboList(ComboBox* ctrl, ActiveWindow* p, int ax, int ay, int aw, int ah, int maxentries) + : ScrollWindow(p, ax, ay, aw, ah + (ah-2)*maxentries + 2, 0, 0, p), combo_box(ctrl) +{ + button_state = 0; + button_height = ah; + captured = 0; + seln = -1; + max_entries = maxentries; + scroll = 0; + scrolling = false; + border = true; + animated = true; + bevel_width = 5; + + if (ctrl) + CopyStyle(*ctrl); + + rect.h = (ah-2)*maxentries + 2; + + int screen_height = Video::GetInstance()->Height(); + + if (rect.h > screen_height) { + rect.y = 0; + rect.h = screen_height; + } + + else if (rect.y + rect.h > screen_height) { + rect.y = screen_height - rect.h; + } +} + +ComboList::ComboList(ComboBox* ctrl, Screen* s, int ax, int ay, int aw, int ah, int maxentries) + : ScrollWindow(s, ax, ay, aw, ah + (ah-2)*maxentries + 2, 0), combo_box(ctrl) +{ + button_state = 0; + button_height = ah; + captured = 0; + seln = -1; + max_entries = maxentries; + scroll = 0; + scrolling = false; + border = true; + animated = true; + bevel_width = 5; + + if (ctrl) + CopyStyle(*ctrl); + + rect.h = (ah-2)*maxentries + 2; + + int screen_height = Video::GetInstance()->Height(); + + if (rect.h > screen_height) { + rect.y = 0; + rect.h = screen_height; + } + + else if (rect.y + rect.h > screen_height) { + rect.y = screen_height - rect.h; + } + + screen->AddWindow(this); // just in case the base ctor couldn't do this +} + +// +--------------------------------------------------------------------+ + +ComboList::~ComboList() +{ + items.destroy(); +} + +// +--------------------------------------------------------------------+ + +void +ComboList::CopyStyle(const ComboBox& ctrl) +{ + active_color = ctrl.GetActiveColor(); + border_color = ctrl.GetBorderColor(); + fore_color = ctrl.GetForeColor(); + back_color = ctrl.GetBackColor(); + + animated = ctrl.GetAnimated(); + bevel_width = ctrl.GetBevelWidth(); + border = ctrl.GetBorder(); +} + +// +--------------------------------------------------------------------+ + +void +ComboList::Show() +{ + if (!scrolling) { + scrolling = 1; + scroll = 0; + } + + ScrollWindow::Show(); +} + +void +ComboList::Hide() +{ + scrolling = 0; + scroll = 0; + ScrollWindow::Hide(); +} + +// +--------------------------------------------------------------------+ + +void +ComboList::Draw() +{ + int x = 0; + int y = 0; + int w = rect.w; + int h = button_height; + + int index = 0; + + // opening: + if (scrolling > 0) { + int limit = min(items.size(), max_entries); + + if (scroll < limit) { + if (limit > 6) + scroll += 4; + + else if (limit > 4) + scroll += 2; + + else + scroll += 1; + } + + if (scroll >= limit) { + scroll = limit; + scrolling = 0; + } + } + + // closing: + else if (scrolling < 0) { + if (scroll > 0) + scroll--; + else + scrolling = 0; + } + + if (items.size() < 1) { + Rect btn_rect(x,y,w,h); + DrawItem(" ", btn_rect, 0); + } + else { + ListIter<Text> item = items; + while (++item && index < max_entries) { + Rect btn_rect(x,y,w,h); + int sub_state = (index == seln) ? button_state : 0; + + DrawItem(*item, btn_rect, sub_state); + + y += button_height-2; + index++; + } + } + + DrawRect(0,0,rect.w-1,rect.h-1,fore_color); +} + +// +--------------------------------------------------------------------+ + +void +ComboList::DrawRectSimple(Rect& rect, int state) +{ + if (state && active_color != Color::Black) + FillRect(rect, active_color); + else + FillRect(rect, back_color); +} + +void +ComboList::DrawItem(Text label, Rect& btn_rect, int state) +{ + int x = btn_rect.x; + int y = btn_rect.y; + int w = btn_rect.w; + int h = btn_rect.h; + + // draw the bevel: + DrawRectSimple(btn_rect, state); + + // draw text here: + if (font && label.length()) { + int border_size = 4; + + if (style & WIN_RAISED_FRAME && style & WIN_SUNK_FRAME) + border_size = 8; + + Rect label_rect = CalcLabelRect(btn_rect); + int vert_space = label_rect.h; + int horz_space = label_rect.w; + + DrawText(label.data(), 0, label_rect, DT_CALCRECT | DT_WORDBREAK | text_align); + vert_space = (vert_space - label_rect.h)/2; + + label_rect.w = horz_space; + + if (vert_space > 0) + label_rect.y += vert_space; + + if (animated && state > 0) { + label_rect.x += state; + label_rect.y += state; + } + + font->SetColor(fore_color); + DrawText(label.data(), 0, label_rect, DT_WORDBREAK | text_align); + } +} + +Rect ComboList::CalcLabelRect(const Rect& btn_rect) +{ + // fit the text in the bevel: + Rect label_rect = btn_rect; + label_rect.Deflate(bevel_width, bevel_width); + + return label_rect; +} + +int ComboList::CalcSeln(int x, int y) +{ + y -= rect.y; + + if (button_height < 1) + return 0; + + return (int) (y / (button_height-2)); +} + +// +--------------------------------------------------------------------+ + +int ComboList::OnMouseMove(int x, int y) +{ + if (captured) + { + ActiveWindow* test = GetCapture(); + + if (test != this) + { + captured = false; + button_state = -1; + } + } + + int new_seln = CalcSeln(x,y); + + if (new_seln != seln) { + seln = new_seln; + Button::PlaySound(Button::SND_COMBO_HILITE); + } + + return ActiveWindow::OnMouseMove(x,y); +} + +int ComboList::OnLButtonDown(int x, int y) +{ + if (!captured) + captured = SetCapture(); + + seln = CalcSeln(x,y); + button_state = 1; + + return ActiveWindow::OnLButtonDown(x,y); +} + +int ComboList::OnLButtonUp(int x, int y) +{ + if (captured) { + ReleaseCapture(); + captured = 0; + } + + seln = CalcSeln(x,y); + button_state = -1; + return ActiveWindow::OnLButtonUp(x,y); +} + +int ComboList::OnClick() +{ + return ActiveWindow::OnClick(); +} + +int ComboList::OnMouseEnter(int mx, int my) +{ + if (button_state == 0) + button_state = -1; + + return ActiveWindow::OnMouseEnter(mx, my); +} + +int ComboList::OnMouseExit(int mx, int my) +{ + if (button_state == -1) + button_state = 0; + + return ActiveWindow::OnMouseExit(mx, my); +} + +void ComboList::KillFocus() +{ + if (combo_box) + combo_box->HideList(); +} + +// +--------------------------------------------------------------------+ + +void ComboList::ClearItems() +{ + items.destroy(); +} + +// +--------------------------------------------------------------------+ + +void ComboList::AddItem(const char* item) +{ + items.append(new(__FILE__,__LINE__) Text(item)); +} + +void ComboList::AddItems(ListIter<Text> item) +{ + while (++item) + items.append(new(__FILE__,__LINE__) Text(*item)); +} + +void ComboList::SetItems(ListIter<Text> item) +{ + items.destroy(); + while (++item) + items.append(new(__FILE__,__LINE__) Text(*item)); + + // Resize window: + + int ah = button_height; + max_entries = items.size(); + Rect r = rect; + r.y = combo_box->Y(); + int length = max_entries; + + if (length < 1) + length = 1; + + r.h = (ah-2)*length + 2; + + int screen_height = Video::GetInstance()->Height(); + + if (r.h > screen_height) { + r.y = 0; + r.h = screen_height; + } + + else if (r.y + r.h > screen_height) { + r.y = screen_height - r.h; + } + + MoveTo(r); +} + +const char* ComboList::GetItem(int index) +{ + if (index >= 0 && index < items.size()) + return items[index]->data(); + else + return 0; +} + +void ComboList::SetItem(int index, const char* item) +{ + if (index >= 0 && index < items.size()) + *items[index] = item; + else + items.append(new(__FILE__,__LINE__) Text(item)); +} + +int ComboList::GetCount() +{ + return items.size(); +} + +const char* ComboList::GetSelectedItem() +{ + if (seln >= 0 && seln < items.size()) + return items[seln]->data(); + else + return 0; +} + +int ComboList::GetSelectedIndex() +{ + if (seln >= 0 && seln < items.size()) + return seln; + else + return -1; +} + +void ComboList::SetSelection(int index) +{ + if (index >= 0 && index < items.size()) + seln = index; +} + |