diff --git a/src/combo/combo.cxx b/src/combo/combo.cxx index ef68238b..ae36c809 100644 --- a/src/combo/combo.cxx +++ b/src/combo/combo.cxx @@ -1,30 +1,7 @@ -// ---------------------------------------------------------------------------- -// -// Digital Modem Program for the Fast Light Toolkit -// -// Copyright 2007-2008, Dave Freese, W1HKJ -// -// This file is part of fldigi. -// -// Fldigi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Fldigi 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with fldigi. If not, see . -// ---------------------------------------------------------------------------- - -#include - #include #include #include +#include #include "combo.h" #include "debug.h" @@ -34,16 +11,16 @@ void popbrwsr_cb (Fl_Widget *v, long d); Fl_PopBrowser::Fl_PopBrowser (int X, int Y, int W, int H, retvals R) : Fl_Window (X, Y, W, H, "") { - Rvals = R; - hRow = H; - wRow = W; - clear_border(); - box(FL_BORDER_BOX); - popbrwsr = new Fl_Select_Browser(0,0,wRow,hRow,0); - popbrwsr->callback ( (Fl_Callback*)popbrwsr_cb); - parent = 0; - end(); - set_modal(); + Rvals = R; + hRow = H; + wRow = W; + clear_border(); + box(FL_BORDER_BOX); + popbrwsr = new Fl_Select_Browser(0,0,wRow,hRow,0); + popbrwsr->callback ( (Fl_Callback*)popbrwsr_cb); + parent = 0; + end(); + set_modal(); } Fl_PopBrowser::~Fl_PopBrowser () @@ -61,134 +38,133 @@ int Fl_PopBrowser::handle(int event) void Fl_PopBrowser::add(char *s, void *d) { - popbrwsr->add(s,d); + popbrwsr->add(s,d); } void Fl_PopBrowser::clear() { - popbrwsr->clear(); + popbrwsr->clear(); } void Fl_PopBrowser::sort() { - return; + return; } void Fl_PopBrowser::popshow (int x, int y) { - int nRows = popbrwsr->size(); - int height = (nRows > 12 ? 12 : nRows)*hRow;// + 4; + int nRows = popbrwsr->size(); + int height = (nRows > 12 ? 12 : nRows) * fl_height() + 4; - if (nRows == 0) return; - popbrwsr->resize (0, 0, wRow, height); - resize (x, y, wRow, height); + if (nRows == 0) return; + popbrwsr->resize (0, 0, wRow, height); + resize (x, y, wRow, height); // locate first occurance of Output string value in the list // and display that if found - int i = parent->index(); - if (!(i >= 0 && i < parent->listsize)) { - for (i = 0; i < parent->listsize; i++) - if (!strcmp(parent->Output->value(), parent->datalist[i]->s)) - break; - if (i == parent->listsize) - i = 0; - } + int i = parent->index(); + if (!(i >= 0 && i < parent->listsize)) { + for (i = 0; i < parent->listsize; i++) + if (!strcmp(parent->Output->value(), parent->datalist[i]->s)) + break; + if (i == parent->listsize) + i = 0; + } - show (); - popbrwsr->topline (i+1); + show (); + popbrwsr->topline (i); - Fl::grab(this); + Fl::grab(this); } void Fl_PopBrowser::pophide () { - hide (); - Fl::release(); + hide (); + Fl::release(); } void Fl_PopBrowser::popbrwsr_cb_i (Fl_Widget *v, long d) { - Fl_PopBrowser *me = (Fl_PopBrowser *)(v->parent()); -// Fl_Output *tgt = me->Rvals.Inp; - Fl_Input *tgt = me->Rvals.Inp; + Fl_PopBrowser *me = (Fl_PopBrowser *)(v->parent()); + Fl_Input *tgt = me->Rvals.Inp; // update the return values - int row = (me->popbrwsr)->value(); - if (row == 0) return; - me->popbrwsr->deselect(); + int row = (me->popbrwsr)->value(); + if (row == 0) return; + me->popbrwsr->deselect(); - if (tgt) { - tgt->value ((me->popbrwsr)->text (row)); - me->Rvals.retval = (me->popbrwsr)->data (row); - *(me->Rvals.idx) = row - 1; - } - me->pophide(); + if (tgt) { + tgt->value ((me->popbrwsr)->text (row)); + me->Rvals.retval = (me->popbrwsr)->data (row); + *(me->Rvals.idx) = row - 1; + } + me->pophide(); // user selected an item from the browser list, so execute the // callback if one is registered. - if (me->parent) - (me->parent)->do_callback(); - return; + if (me->parent) + (me->parent)->do_callback(); + return; } void popbrwsr_cb (Fl_Widget *v, long d) { - ((Fl_PopBrowser *)(v))->popbrwsr_cb_i (v, d); - return; + ((Fl_PopBrowser *)(v))->popbrwsr_cb_i (v, d); + return; } void Fl_ComboBox::fl_popbrwsr(Fl_Widget *p) { - Fl_Widget *who = this, *parent; + Fl_Widget *who = this, *parent; // compute the x,y position for the pop-up browser window // x() and y() are locations relative to the current window // also need to know where the root window for the application // to compute the screen x,y position of the popup - int xpos = who->x(), ypos = who->h() + who->y(); - parent = who; - while (parent) { - who = parent; - parent = parent->parent(); - if (parent == 0) { - xpos += who->x(); - ypos += who->y(); - } - } - if (Brwsr == 0) { - Brwsr = new Fl_PopBrowser(xpos, ypos, width, height, R); - } + int xpos = who->x(), ypos = who->h() + who->y(); + parent = who; + while (parent) { + who = parent; + parent = parent->parent(); + if (parent == 0) { + xpos += who->x(); + ypos += who->y(); + } + } + if (Brwsr == 0) { + Brwsr = new Fl_PopBrowser(xpos, ypos, width, height, R); + } // pass the calling widget to the popup browser so that the // correct callback function can be called when the user selects an item // from the browser list - Brwsr->parent = (Fl_ComboBox *) p; - Brwsr->popshow(xpos, ypos); - return; + Brwsr->parent = (Fl_ComboBox *) p; + Brwsr->popshow(xpos, ypos); + return; } void btnComboBox_cb (Fl_Widget *v, void *d) { - Fl_Widget *p = v->parent(); - ((Fl_ComboBox *)p)->fl_popbrwsr (p); - return; + Fl_Widget *p = v->parent(); + ((Fl_ComboBox *)p)->fl_popbrwsr (p); + return; } Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *L) : Fl_Group (X, Y, W, H, L) { - width = W; height = H - 4; - Btn = new Fl_Button (X + W - 18, Y + 1, 18, H - 2, "@-12>"); - Btn->callback ((Fl_Callback *)btnComboBox_cb, 0); - Output = new Fl_Input (X, Y, W-18, H); + width = W; height = H - 4; + Btn = new Fl_Button (X + W - 18, Y + 1, 18, H - 2, "@#-32>"); + Btn->callback ((Fl_Callback *)btnComboBox_cb, 0); + Output = new Fl_Input (X, Y, W-18, H); - Brwsr = 0; - datalist = new datambr *[FL_COMBO_LIST_INCR]; - maxsize = FL_COMBO_LIST_INCR; - for (int i = 0; i < FL_COMBO_LIST_INCR; i++) datalist[i] = 0; - listsize = 0; - listtype = 0; - end(); - R.Inp = Output; - R.retval = retdata; - R.idx = &idx; + Brwsr = 0; + datalist = new datambr *[FL_COMBO_LIST_INCR]; + maxsize = FL_COMBO_LIST_INCR; + for (int i = 0; i < FL_COMBO_LIST_INCR; i++) datalist[i] = 0; + listsize = 0; + listtype = 0; + end(); + R.Inp = Output; + R.retval = retdata; + R.idx = &idx; } Fl_ComboBox::~Fl_ComboBox() @@ -205,12 +181,12 @@ Fl_ComboBox::~Fl_ComboBox() void Fl_ComboBox::type (int t) { - listtype = t; + listtype = t; } void Fl_ComboBox::readonly() { - Output->type(FL_NORMAL_OUTPUT); + Output->type(FL_NORMAL_OUTPUT); } // ComboBox value is contained in the Output widget @@ -223,14 +199,14 @@ void Fl_ComboBox::value( const char *s ) if (strcasecmp (s, datalist[i]->s) == 0) break; } - } else { + } else { for (i = 0; i < listsize; i++) { if (strcmp (s, datalist[i]->s) == 0) break; } - } + } if ( i < listsize) - Output->value(datalist[idx = i]->s); + Output->value(datalist[i]->s); } void Fl_ComboBox::put_value(const char *s) @@ -247,52 +223,52 @@ void Fl_ComboBox::index(int i) const char *Fl_ComboBox::value() { - return (Output->value ()); + return (Output->value ()); } int Fl_ComboBox::index() { - return idx; + return idx; } void * Fl_ComboBox::data() { - return retdata; + return retdata; } void Fl_ComboBox::add( const char *s, void * d) { - if (Brwsr == 0) { - Brwsr = new Fl_PopBrowser(0, 0, width, height, R); - } + if (Brwsr == 0) { + Brwsr = new Fl_PopBrowser(0, 0, width, height, R); + } // test for uniqueness of entry if required - if ((listtype & FL_COMBO_UNIQUE) == FL_COMBO_UNIQUE) { - if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { - for (int i = 0; i < listsize; i++) { - if (strcasecmp (s, datalist[i]->s) == 0) - return; - } - } else { - for (int i = 0; i < listsize; i++) { - if (strcmp (s, datalist[i]->s) == 0) - return; - } - } - } + if ((listtype & FL_COMBO_UNIQUE) == FL_COMBO_UNIQUE) { + if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { + for (int i = 0; i < listsize; i++) { + if (strcasecmp (s, datalist[i]->s) == 0) + return; + } + } else { + for (int i = 0; i < listsize; i++) { + if (strcmp (s, datalist[i]->s) == 0) + return; + } + } + } // not unique or not in list, so add this entry - datalist[listsize] = new datambr; - datalist[listsize]->s = new char [strlen(s) + 1]; - datalist[listsize]->s[0] = 0; - strcpy (datalist[listsize]->s, s); - datalist[listsize]->d = d; - Brwsr->add(datalist[listsize]->s,d); - listsize++; - if (listsize == maxsize) { - int nusize = maxsize + FL_COMBO_LIST_INCR; - datambr **temparray = new datambr *[nusize]; - for (int i = 0; i < listsize; i++) temparray[i] = datalist[i]; - delete [] datalist; - datalist = temparray; - maxsize = nusize; - } + datalist[listsize] = new datambr; + datalist[listsize]->s = new char [strlen(s) + 1]; + datalist[listsize]->s[0] = 0; + strcpy (datalist[listsize]->s, s); + datalist[listsize]->d = d; + Brwsr->add(datalist[listsize]->s,d); + listsize++; + if (listsize == maxsize) { + int nusize = maxsize + FL_COMBO_LIST_INCR; + datambr **temparray = new datambr *[nusize]; + for (int i = 0; i < listsize; i++) temparray[i] = datalist[i]; + delete [] datalist; + datalist = temparray; + maxsize = nusize; + } } void Fl_ComboBox::clear() @@ -312,39 +288,41 @@ void Fl_ComboBox::clear() int DataCompare( const void *x1, const void *x2 ) { - int cmp; - datambr *X1, *X2; - X1 = *(datambr **)(x1); - X2 = *(datambr **)(x2); - cmp = strcasecmp (X1->s, X2->s); - if (cmp < 0) - return -1; - if (cmp > 0) - return 1; - return 0; + int cmp; + datambr *X1, *X2; + X1 = *(datambr **)(x1); + X2 = *(datambr **)(x2); + cmp = strcasecmp (X1->s, X2->s); + if (cmp < 0) + return -1; + if (cmp > 0) + return 1; + return 0; } void Fl_ComboBox::sort() { - Brwsr->clear (); - qsort (&datalist[0], - listsize, - sizeof (datambr *), - DataCompare); - for (int i = 0; i < listsize; i++) - Brwsr->add (datalist[i]->s, datalist[i]->d); + Brwsr->clear (); + qsort (&datalist[0], + listsize, + sizeof (datambr *), + DataCompare); + for (int i = 0; i < listsize; i++) + Brwsr->add (datalist[i]->s, datalist[i]->d); } void Fl_ComboBox::textfont (int fnt) { - Output->textfont (fnt); + Output->textfont (fnt); } void Fl_ComboBox::textsize (uchar n) { - Output->textsize (n); + Output->textsize (n); } int Fl_ComboBox::size() { return listsize; } + +