This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gcui/gwinmnub.cpp

324 lines
7.3 KiB
C++

// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// GCUI: Golded+ Character-oriented User Interface.
// Menu class.
// ------------------------------------------------------------------
#include <cstdlib>
#include <cstring>
#include <gmnubase.h>
// ------------------------------------------------------------------
void GMnu::Init() {
bordertype = 0;
bordercolor = BLACK_|_BLACK;
textcolor = BLACK_|_BLACK;
quickcolor = BLACK_|_BLACK;
noselcolor = BLACK_|_BLACK;
barcolor = BLACK_|_BLACK;
shadowcolor = DEFATTR;
title = NULL;
titlepos = TCENTER;
titlecolor = BLACK_|_BLACK;
deschdl = -1;
descrow = 0;
desccolumn = 0;
desccolor = BLACK_|_BLACK;
helpnumber = -1;
beginrow = 0;
begincolumn = 0;
menuopen = NULL;
itemmask = 0;
escape = YES;
finaltag = -1;
status = W_NOERROR;
depth = -1;
memset(stack, 0, sizeof(stack));
}
// ------------------------------------------------------------------
void GMnu::SetBorder(int type, vattr color) {
bordertype = type;
bordercolor = color;
}
// ------------------------------------------------------------------
void GMnu::SetColor(vattr text, vattr quick, vattr nosel, vattr bar, vattr shadow) {
textcolor = text;
quickcolor = quick;
noselcolor = nosel;
barcolor = bar;
shadowcolor = shadow;
}
// ------------------------------------------------------------------
void GMnu::SetTitle(const char* text, vattr color, int pos) {
title = text;
titlepos = pos;
titlecolor = color;
}
// ------------------------------------------------------------------
void GMnu::SetTitle(const char* text) {
title = text;
}
// ------------------------------------------------------------------
void GMnu::SetDesc(int hdl, int row, int col, vattr color) {
deschdl = hdl;
descrow = row;
desccolumn = col;
desccolor = color;
}
// ------------------------------------------------------------------
void GMnu::SetPos(int row, int col, int width, int height) {
beginrow = row;
begincolumn = col;
beginwidth = width;
beginheight = height;
}
// ------------------------------------------------------------------
void GMnu::SetEsc(int option) {
escape = option;
}
// ------------------------------------------------------------------
void GMnu::SetHelp(int help) {
helpnumber = help;
}
// ------------------------------------------------------------------
void GMnu::SetMask(int mask) {
itemmask = mask;
}
// ------------------------------------------------------------------
void GMnu::SetTag(int tag) {
stack[depth].tag = tag;
}
// ------------------------------------------------------------------
void GMnu::Begin(int type) {
bool was_horz = make_bool(stack[depth].type & M_HORZ);
depth++;
stack[depth].tag = -1;
stack[depth].type = type | M_SAVE;
stack[depth].winrow = (beginrow != -1) ? beginrow : (was_horz ? stack[depth-1].winrow+1 : stack[depth-1].winrow+stack[depth-1].itemrow);
stack[depth].wincolumn = (begincolumn != -1) ? begincolumn : (stack[depth-1].wincolumn+(was_horz?0:1));
stack[depth].itemrow = stack[depth].itemcolumn = 0;
status = wmenubeg_(
stack[depth].winrow,
stack[depth].wincolumn,
beginheight,
beginwidth,
bordertype,
bordercolor,
textcolor,
menuopen,
stack[depth].type
);
wmenutitshad(title, titlepos, titlecolor, shadowcolor);
beginwidth = beginheight = 0;
beginrow = begincolumn = -1;
}
// ------------------------------------------------------------------
void GMnu::End() {
status = wmenuend(stack[depth].tag, stack[depth].type, (stack[depth].type&M_VERT)?255:0, 0, textcolor, quickcolor, noselcolor, barcolor);
depth--;
if((depth >= 0) and (stack[depth].type & M_HORZ))
stack[depth].wincolumn += stack[depth].winwidth;
title = NULL;
}
// ------------------------------------------------------------------
extern int _overtagid;
extern int _finaltagid;
void GMnu::Start() {
int _prev_escape = wsetesc(escape);
wmenuget();
finaltag = _finaltagid;
overtag = _overtagid;
wsetesc(_prev_escape);
}
// ------------------------------------------------------------------
void GMnu::Item(int tag, const char* text) {
Item(tag, text, itemmask, NULL, 0);
}
// ------------------------------------------------------------------
void GMnu::Item(int tag, const char* text, int fmask) {
Item(tag, text, fmask, NULL, 0);
}
// ------------------------------------------------------------------
void GMnu::Item(int tag, const char* text, VfvCP select, int fmask) {
Item(tag, text, fmask, select, 0);
}
// ------------------------------------------------------------------
void GMnu::Item(int tag, const char* text, int fmask, VfvCP select, gkey hotkey) {
if(stack[depth].tag == -1)
stack[depth].tag = tag;
char shortcut = *text;
for(_item_t* p = gwin.cmenu->item; p; p = p->prev) {
if(p->schar == shortcut)
shortcut = NUL;
}
status = wmenuitem(stack[depth].itemrow, stack[depth].itemcolumn, text+1, shortcut, tag, fmask, select, hotkey, helpnumber);
stack[depth].winwidth = strlen(text+1);
if(stack[depth].type & M_HORZ)
stack[depth].itemcolumn += stack[depth].winwidth;
else
stack[depth].itemrow++;
}
// ------------------------------------------------------------------
void GMnu::ItemDesc(const char* text) {
status = wmenuitxt(deschdl, descrow, desccolumn, desccolor, text);
}
// ------------------------------------------------------------------
void GMnu::ItemSep()
{
Item(-1, " ", M_SEPAR, NULL, 0);
}
// ------------------------------------------------------------------
void GMnu::ItemFuncs(VfvCP before, VfvCP after) {
status = wmenuiba(before, after);
}
// ------------------------------------------------------------------
void GMnu::SetNextItem(int tag) {
status = wmenuinext(tag);
}
// ------------------------------------------------------------------
void GMnu::DisableItem(int tag) {
status = wmenuidsab(tag);
}
// ------------------------------------------------------------------
void GMnu::EnableItem(int tag) {
status = wmenuienab(tag);
}
// ------------------------------------------------------------------
GMnuItm* GMnu::FindItem(int tag) {
return wmenuifind(tag);
}
// ------------------------------------------------------------------