示例#1
0
// taken explicitly from Fl_Return_Button.cpp
static int flu_return_arrow(int x, int y, int w, int h)
{
  int size = w; if (h<size) size = h;
  int d = (size+2)/4; if (d<3) d = 3;
  int t = (size+9)/12; if (t<1) t = 1;
  int x0 = x+(w-2*d-2*t-1)/2;
  int x1 = x0+d;
  int y0 = y+h/2;
  fl_color(FL_LIGHT3);
  fl_line(x0, y0, x1, y0+d);
  fl_yxline(x1, y0+d, y0+t, x1+d+2*t, y0-d);
  fl_yxline(x1, y0-t, y0-d);
  fl_color(fl_gray_ramp(0));
  fl_line(x0, y0, x1, y0-d);
  fl_color(FL_DARK3);
  fl_xyline(x1+1, y0-t, x1+d, y0-d, x1+d+2*t);
  return 1;
}
示例#2
0
static void shade_frame(int x, int y, int w, int h, const char *c, Fl_Color bc)
{
    uchar *g = fl_gray_ramp();
    int b = strlen(c) / 4 + 1;

    for (x += b, y += b, w -= 2 * b + 1, h -= 2 * b + 1; b > 1; b --)
    {
        // Draw lines around the perimeter of the button, 4 colors per
        // circuit.
        fl_color(shade_color(*c++, bc));
        fl_line(x, y + h + b, x + w - 1, y + h + b, x + w + b - 1, y + h);
        fl_color(shade_color(*c++, bc));
        fl_line(x + w + b - 1, y + h, x + w + b - 1, y, x + w - 1, y - b);
        fl_color(shade_color(*c++, bc));
        fl_line(x + w - 1, y - b, x, y - b, x - b, y);
        fl_color(shade_color(*c++, bc));
        fl_line(x - b, y, x - b, y + h, x, y + h + b);
    }
}
示例#3
0
int start_media_monitor(void)
{
    char buf[132 + 1];
    float x;
    float y;
    int i;
    int len;
    
    len = 128;

    s->w = new Fl_Double_Window(465, 400, "IP streaming media monitor");

    s->c_right = new Fl_Group(0, 0, 465, 405);

    s->c_sent = new Fl_Group(0, 0, 465, 200);
    s->c_sent->box(FL_DOWN_BOX);
    s->c_sent->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    s->c_sent->current();

    s->canvas_sent = new Ca_Canvas(110, 35, 300, 100, "Packet delays");
    s->canvas_sent->box(FL_PLASTIC_DOWN_BOX);
    s->canvas_sent->color(7);
    s->canvas_sent->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(s->canvas_sent);
    s->canvas_sent->border(15);

    s->sent_x = new Ca_X_Axis(115, 135, 290, 30, "Packet");
    s->sent_x->align(FL_ALIGN_BOTTOM);
    s->sent_x->minimum(0.0);
    s->sent_x->maximum(500.0);
    s->sent_x->label_format("%g");
    s->sent_x->minor_grid_color(fl_gray_ramp(20));
    s->sent_x->major_grid_color(fl_gray_ramp(15));
    s->sent_x->label_grid_color(fl_gray_ramp(10));
    s->sent_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->sent_x->minor_grid_style(FL_DOT);
    s->sent_x->major_step(5);
    s->sent_x->label_step(1);
    s->sent_x->axis_align(CA_BOTTOM | CA_LINE);
    s->sent_x->axis_color(FL_BLACK);
    s->sent_x->current();

    s->sent_y = new Ca_Y_Axis(60, 40, 50, 90, "Delay\n(ms)");
    s->sent_y->align(FL_ALIGN_LEFT);
    s->sent_y->minimum(0.0);
    s->sent_y->maximum(2000.0);
    s->sent_y->minor_grid_color(fl_gray_ramp(20));
    s->sent_y->major_grid_color(fl_gray_ramp(15));
    s->sent_y->label_grid_color(fl_gray_ramp(10));
    s->sent_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->sent_y->minor_grid_style(FL_DOT);
    s->sent_y->major_step(5);
    s->sent_y->label_step(1);
    s->sent_y->axis_color(FL_BLACK);
    s->sent_y->current();

    s->c_sent->end();

    s->c_received = new Fl_Group(0, 200, 465, 200);
    s->c_received->box(FL_DOWN_BOX);
    s->c_received->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    s->c_received->current();

    s->canvas_received = new Ca_Canvas(110, 235, 300, 100, "Delay spread");
    s->canvas_received->box(FL_PLASTIC_DOWN_BOX);
    s->canvas_received->color(7);
    s->canvas_received->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(s->canvas_received);
    s->canvas_received->border(15);

    s->received_x = new Ca_X_Axis(115, 335, 290, 30, "Delay (ms)");
    s->received_x->align(FL_ALIGN_BOTTOM);
    s->received_x->minimum(0.0);
    s->received_x->maximum(2000.0);
    s->received_x->label_format("%g");
    s->received_x->minor_grid_color(fl_gray_ramp(20));
    s->received_x->major_grid_color(fl_gray_ramp(15));
    s->received_x->label_grid_color(fl_gray_ramp(10));
    s->received_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->received_x->minor_grid_style(FL_DOT);
    s->received_x->major_step(5);
    s->received_x->label_step(1);
    s->received_x->axis_align(CA_BOTTOM | CA_LINE);
    s->received_x->axis_color(FL_BLACK);
    s->received_x->current();

    s->received_y = new Ca_Y_Axis(60, 240, 50, 90, "Freq");
    s->received_y->align(FL_ALIGN_LEFT);
    s->received_y->minimum(0.0);
    s->received_y->maximum(50.0);
    s->received_y->minor_grid_color(fl_gray_ramp(20));
    s->received_y->major_grid_color(fl_gray_ramp(15));
    s->received_y->label_grid_color(fl_gray_ramp(10));
    s->received_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->received_y->minor_grid_style(FL_DOT);
    s->received_y->major_step(5);
    s->received_y->label_step(1);
    s->received_y->axis_color(FL_BLACK);
    s->received_y->current();

    for (i = 0;  i < 2000;  i++)
        s->received_delays_plot[2*i] = i;
    s->received_delays_plot_max = 0.0;
    s->min_diff = 2000;
    s->max_diff = 0;
    
    s->received_delays = NULL;
    s->highest_seq_no_seen = -1;

    for (i = 0;  i < 500;  i++)
        s->sent_re_plot[2*i] = i;
    s->sent_re_plot_min = 99999.0;
    s->sent_re_plot_max = 0.0;
    s->sent_re = NULL;

    s->c_received->end();

    s->c_right->end();

    Fl_Group::current()->resizable(s->c_right);
    s->w->end();
    s->w->show();

    Fl::check();
    return 0;
}
示例#4
0
 FL_EXPORT_C(Fl_Color, fl_gray_rampC)(int i){return fl_gray_ramp(i);}
int start_line_model_monitor(int len)
{
    char buf[132 + 1];
    float x;
    float y;
    int i;

    w = new Fl_Double_Window(850, 400, "Telephone line model monitor");

    c_spec = new Fl_Group(0, 0, 380, 400);
    c_spec->box(FL_DOWN_BOX);
    c_spec->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);

    canvas_spec = new Ca_Canvas(60, 30, 300, 300, "Spectrum");
    canvas_spec->box(FL_PLASTIC_DOWN_BOX);
    canvas_spec->color(7);
    canvas_spec->align(FL_ALIGN_TOP);
    canvas_spec->border(15);

    spec_freq = new Ca_X_Axis(65, 330, 290, 30, "Freq (Hz)");
    spec_freq->align(FL_ALIGN_BOTTOM);
    spec_freq->minimum(0);
    spec_freq->maximum(4000);
    spec_freq->label_format("%g");
    spec_freq->minor_grid_color(fl_gray_ramp(20));
    spec_freq->major_grid_color(fl_gray_ramp(15));
    spec_freq->label_grid_color(fl_gray_ramp(10));
    spec_freq->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    spec_freq->minor_grid_style(FL_DOT);
    spec_freq->major_step(5);
    spec_freq->label_step(1);
    spec_freq->axis_color(FL_BLACK);
    spec_freq->axis_align(CA_BOTTOM | CA_LINE);

    spec_amp = new Ca_Y_Axis(20, 35, 40, 290, "Amp (dBmO)");
    spec_amp->align(FL_ALIGN_LEFT);
    spec_amp->minimum(-80.0);
    spec_amp->maximum(10.0);
    spec_amp->minor_grid_color(fl_gray_ramp(20));
    spec_amp->major_grid_color(fl_gray_ramp(15));
    spec_amp->label_grid_color(fl_gray_ramp(10));
    //spec_amp->grid_visible(CA_MINOR_TICK | CA_MAJOR_TICK | CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    spec_amp->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    spec_amp->minor_grid_style(FL_DOT);
    spec_amp->major_step(5);
    spec_amp->label_step(1);
    spec_amp->axis_color(FL_BLACK);

    spec_amp->current();

    c_spec->end();

    c_right = new Fl_Group(440, 0, 465, 405);

    c_can = new Fl_Group(380, 0, 415, 200);
    c_can->box(FL_DOWN_BOX);
    c_can->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    c_can->current();

    canvas_can = new Ca_Canvas(460, 35, 300, 100, "??? coefficients");
    canvas_can->box(FL_PLASTIC_DOWN_BOX);
    canvas_can->color(7);
    canvas_can->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(canvas_can);
    canvas_can->border(15);

    can_x = new Ca_X_Axis(465, 135, 290, 30, "Tap");
    can_x->align(FL_ALIGN_BOTTOM);
    can_x->minimum(0.0);
    can_x->maximum((float) len);
    can_x->label_format("%g");
    can_x->minor_grid_color(fl_gray_ramp(20));
    can_x->major_grid_color(fl_gray_ramp(15));
    can_x->label_grid_color(fl_gray_ramp(10));
    can_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    can_x->minor_grid_style(FL_DOT);
    can_x->major_step(5);
    can_x->label_step(1);
    can_x->axis_align(CA_BOTTOM | CA_LINE);
    can_x->axis_color(FL_BLACK);
    can_x->current();

    can_y = new Ca_Y_Axis(420, 40, 40, 90, "Amp");
    can_y->align(FL_ALIGN_LEFT);
    can_y->minimum(-0.1);
    can_y->maximum(0.1);
    can_y->minor_grid_color(fl_gray_ramp(20));
    can_y->major_grid_color(fl_gray_ramp(15));
    can_y->label_grid_color(fl_gray_ramp(10));
    can_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    can_y->minor_grid_style(FL_DOT);
    can_y->major_step(5);
    can_y->label_step(1);
    can_y->axis_color(FL_BLACK);
    can_y->current();

    c_can->end();

    c_line_model = new Fl_Group(380, 200, 415, 200);
    c_line_model->box(FL_DOWN_BOX);
    c_line_model->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    c_line_model->current();

    canvas_line_model = new Ca_Canvas(460, 235, 300, 100, "Line impulse response model");
    canvas_line_model->box(FL_PLASTIC_DOWN_BOX);
    canvas_line_model->color(7);
    canvas_line_model->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(canvas_line_model);
    canvas_line_model->border(15);

    line_model_x = new Ca_X_Axis(465, 335, 290, 30, "Tap");
    line_model_x->align(FL_ALIGN_BOTTOM);
    line_model_x->minimum(0.0);
    line_model_x->maximum((float) len);
    line_model_x->label_format("%g");
    line_model_x->minor_grid_color(fl_gray_ramp(20));
    line_model_x->major_grid_color(fl_gray_ramp(15));
    line_model_x->label_grid_color(fl_gray_ramp(10));
    line_model_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    line_model_x->minor_grid_style(FL_DOT);
    line_model_x->major_step(5);
    line_model_x->label_step(1);
    line_model_x->axis_align(CA_BOTTOM | CA_LINE);
    line_model_x->axis_color(FL_BLACK);
    line_model_x->current();

    line_model_y = new Ca_Y_Axis(420, 240, 40, 90, "Amp");
    line_model_y->align(FL_ALIGN_LEFT);
    line_model_y->minimum(-0.1);
    line_model_y->maximum(0.1);
    line_model_y->minor_grid_color(fl_gray_ramp(20));
    line_model_y->major_grid_color(fl_gray_ramp(15));
    line_model_y->label_grid_color(fl_gray_ramp(10));
    line_model_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    line_model_y->minor_grid_style(FL_DOT);
    line_model_y->major_step(5);
    line_model_y->label_step(1);
    line_model_y->axis_color(FL_BLACK);
    line_model_y->current();

    c_line_model->end();

    audio_meter = new Fl_Audio_Meter(810, 40, 10, 250, "");
    audio_meter->box(FL_PLASTIC_UP_BOX);
    audio_meter->type(FL_VERT_AUDIO_METER);

    c_right->end();

    Fl_Group::current()->resizable(c_right);
    w->end();
    w->show();

#if defined(HAVE_FFTW3_H)    
    p = fftw_plan_dft_1d(1024, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
    for (i = 0;  i < 1024;  i++)
    {
        in[i][0] = 0.0;
        in[i][1] = 0.0;
    }
#else
    p = fftw_create_plan(1024, FFTW_BACKWARD, FFTW_ESTIMATE);
    for (i = 0;  i < 1024;  i++)
    {
        in[i].re = 0.0;
        in[i].im = 0.0;
    }
#endif
    in_ptr = 0;

    Fl::check();
    return 0;
}
示例#6
0
qam_monitor_t *qam_monitor_init(float constel_width, float constel_scaling, const char *tag)
{
    char buf[132 + 1];
    float x;
    float y;
    qam_monitor_t *s;

    if ((s = (qam_monitor_t *) malloc(sizeof(*s))) == NULL)
        return NULL;

    s->w = new Fl_Double_Window(905, 400, (tag)  ?  tag  :  "QAM monitor");

    s->constel_scaling = 1.0/constel_scaling;

    s->c_const = new Fl_Group(0, 0, 380, 400);
    s->c_const->box(FL_DOWN_BOX);
    s->c_const->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);

    s->canvas_const = new Ca_Canvas(60, 30, 300, 300, "Constellation");
    s->canvas_const->box(FL_PLASTIC_DOWN_BOX);
    s->canvas_const->color(7);
    s->canvas_const->align(FL_ALIGN_TOP);
    s->canvas_const->border(15);

    s->sig_i = new Ca_X_Axis(65, 330, 290, 30, "I");
    s->sig_i->align(FL_ALIGN_BOTTOM);
    s->sig_i->minimum(-constel_width);
    s->sig_i->maximum(constel_width);
    s->sig_i->label_format("%g");
    s->sig_i->minor_grid_color(fl_gray_ramp(20));
    s->sig_i->major_grid_color(fl_gray_ramp(15));
    s->sig_i->label_grid_color(fl_gray_ramp(10));
    s->sig_i->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->sig_i->minor_grid_style(FL_DOT);
    s->sig_i->major_step(5);
    s->sig_i->label_step(1);
    s->sig_i->axis_color(FL_BLACK);
    s->sig_i->axis_align(CA_BOTTOM | CA_LINE);

    s->sig_q = new Ca_Y_Axis(20, 35, 40, 290, "Q");
    s->sig_q->align(FL_ALIGN_LEFT);
    s->sig_q->minimum(-constel_width);
    s->sig_q->maximum(constel_width);
    s->sig_q->minor_grid_color(fl_gray_ramp(20));
    s->sig_q->major_grid_color(fl_gray_ramp(15));
    s->sig_q->label_grid_color(fl_gray_ramp(10));
    //s->sig_q->grid_visible(CA_MINOR_TICK | CA_MAJOR_TICK | CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->sig_q->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->sig_q->minor_grid_style(FL_DOT);
    s->sig_q->major_step(5);
    s->sig_q->label_step(1);
    s->sig_q->axis_color(FL_BLACK);

    s->sig_q->current();

    s->c_const->end();

    s->c_right = new Fl_Group(440, 0, 465, 405);

    s->c_eq = new Fl_Group(380, 0, 265, 200);
    s->c_eq->box(FL_DOWN_BOX);
    s->c_eq->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    s->c_eq->current();
    s->canvas_eq = new Ca_Canvas(460, 35, 150, 100, "Equalizer");
    s->canvas_eq->box(FL_PLASTIC_DOWN_BOX);
    s->canvas_eq->color(7);
    s->canvas_eq->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(s->canvas_eq);
    s->canvas_eq->border(15);

    s->eq_x = new Ca_X_Axis(465, 135, 140, 30, "Symbol");
    s->eq_x->align(FL_ALIGN_BOTTOM);
    s->eq_x->minimum(-8.0);
    s->eq_x->maximum(8.0);
    s->eq_x->label_format("%g");
    s->eq_x->minor_grid_color(fl_gray_ramp(20));
    s->eq_x->major_grid_color(fl_gray_ramp(15));
    s->eq_x->label_grid_color(fl_gray_ramp(10));
    s->eq_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->eq_x->minor_grid_style(FL_DOT);
    s->eq_x->major_step(5);
    s->eq_x->label_step(1);
    s->eq_x->axis_align(CA_BOTTOM | CA_LINE);
    s->eq_x->axis_color(FL_BLACK);
    s->eq_x->current();

    s->eq_y = new Ca_Y_Axis(420, 40, 40, 90, "Amp");
    s->eq_y->align(FL_ALIGN_LEFT);
    s->eq_y->minimum(-0.1);
    s->eq_y->maximum(0.1);
    s->eq_y->minor_grid_color(fl_gray_ramp(20));
    s->eq_y->major_grid_color(fl_gray_ramp(15));
    s->eq_y->label_grid_color(fl_gray_ramp(10));
    s->eq_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->eq_y->minor_grid_style(FL_DOT);
    s->eq_y->major_step(5);
    s->eq_y->label_step(1);
    s->eq_y->axis_color(FL_BLACK);
    s->eq_y->current();

    s->c_eq->end();

    s->c_symbol_track = new Fl_Group(380, 200, 525, 200);
    s->c_symbol_track->box(FL_DOWN_BOX);
    s->c_symbol_track->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE);
    s->c_symbol_track->current();

    s->canvas_track = new Ca_Canvas(490, 235, 300, 100, "Symbol and carrier tracking");
    s->canvas_track->box(FL_PLASTIC_DOWN_BOX);
    s->canvas_track->color(7);
    s->canvas_track->align(FL_ALIGN_TOP);
    Fl_Group::current()->resizable(s->canvas_track);
    s->canvas_track->border(15);

    s->track_x = new Ca_X_Axis(495, 335, 290, 30, "Time (symbols)");
    s->track_x->align(FL_ALIGN_BOTTOM);
    s->track_x->minimum(0.0);
    s->track_x->maximum(2400.0*5.0);
    s->track_x->label_format("%g");
    s->track_x->minor_grid_color(fl_gray_ramp(20));
    s->track_x->major_grid_color(fl_gray_ramp(15));
    s->track_x->label_grid_color(fl_gray_ramp(10));
    s->track_x->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->track_x->minor_grid_style(FL_DOT);
    s->track_x->major_step(5);
    s->track_x->label_step(1);
    s->track_x->axis_align(CA_BOTTOM | CA_LINE);
    s->track_x->axis_color(FL_BLACK);
    s->track_x->current();

    s->symbol_track_y = new Ca_Y_Axis(420, 240, 70, 90, "Cor");
    s->symbol_track_y->align(FL_ALIGN_LEFT);
    s->symbol_track_y->minimum(-0.1);
    s->symbol_track_y->maximum(0.1);
    s->symbol_track_y->minor_grid_color(fl_gray_ramp(20));
    s->symbol_track_y->major_grid_color(fl_gray_ramp(15));
    s->symbol_track_y->label_grid_color(fl_gray_ramp(10));
    s->symbol_track_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->symbol_track_y->minor_grid_style(FL_DOT);
    s->symbol_track_y->major_step(5);
    s->symbol_track_y->label_step(1);
    s->symbol_track_y->axis_color(FL_RED);
    s->symbol_track_y->current();

    s->carrier_y = new Ca_Y_Axis(790, 240, 70, 90, "Freq");
    s->carrier_y->align(FL_ALIGN_RIGHT);
    s->carrier_y->minimum(-0.1);
    s->carrier_y->maximum(0.1);
    s->carrier_y->minor_grid_color(fl_gray_ramp(20));
    s->carrier_y->major_grid_color(fl_gray_ramp(15));
    s->carrier_y->label_grid_color(fl_gray_ramp(10));
    s->carrier_y->grid_visible(CA_LABEL_GRID | CA_ALWAYS_VISIBLE);
    s->carrier_y->minor_grid_style(FL_DOT);
    s->carrier_y->major_step(5);
    s->carrier_y->label_step(1);
    s->carrier_y->axis_align(CA_RIGHT);
    s->carrier_y->axis_color(FL_BLUE);
    s->carrier_y->current();

    s->c_symbol_track->end();

    s->audio_meter = new Fl_Audio_Meter(672, 10, 16, 150, "");
    s->audio_meter->box(FL_PLASTIC_UP_BOX);
    s->audio_meter->type(FL_VERT_AUDIO_METER);

    s->audio_level = new Fl_Output(650, 170, 60, 20, "");
    s->audio_level->textsize(10);

    s->c_right->end();

    Fl_Group::current()->resizable(s->c_right);
    s->w->end();
    s->w->show();

    s->next_constel_point = 0;
    s->constel_window = 10000;

    s->carrier_points = 0;
    s->carrier_ptr = 0;
    s->carrier_window = 100;

    s->symbol_track_points = 0;
    s->symbol_track_window = 10000;
    Fl::check();
    return s;
}
示例#7
0
void Fl_Combo_Box_Panel::draw()
{
    bool selected = focused();

    int X=0, Y=0, W=w(), H=h();

    if(selected) {      
        // Draw using combo's focus_box
        m_comboBox->focus_box()->draw(X,Y,W,H, m_comboBox->selection_color(), FL_SELECTED);
    } else {
        // Draw using combo's BG
        fl_push_clip(X,Y,W,H);
        m_comboBox->draw_group_box();
        fl_pop_clip();
    }

    box()->inset(X,Y,W,H);  

    int dd = 2;

    Fl_ListView *lv = m_comboBox->listview();

    Fl_ListView_Item *item = lv->item();
    if (!item) return;

    Fl_ListView_ItemExt *item_ext = 0;
    if(item->type()==Fl_ListView_Item::EXT)
        item_ext = (Fl_ListView_ItemExt *)item;

    if (!item_ext) {
        fl_font(lv->text_font(), lv->text_size());
    }

    fl_push_clip(X,Y,W,H);

    Fl_Color text_color;
    for (unsigned c = 0; c < item->columns(); c++) {
        if (!lv->visible_col(c))
            continue;
        int ww = lv->column_width(c);
        fl_push_clip(X+dd, Y, ww-dd, H);
        if (item_ext) {
            fl_font(item_ext->label_font(c),item_ext->label_size(c));
            text_color = item_ext->label_color(c);
        } else
            text_color = m_comboBox->text_color();

        if(selected) {
            // set selection color for text
            text_color = m_comboBox->selection_text_color();
        }

        fl_color(text_color);
        fl_draw(item->label(c), X+dd, Y, ww-dd, H, FL_ALIGN_LEFT);

        fl_pop_clip();

        fl_color(fl_gray_ramp(20));
        fl_line(X + ww-1, Y, X + ww-1, H);
        fl_color(fl_gray_ramp(10));
        fl_line(X + ww, Y, X + ww, H);

        X += ww;
    }
    fl_pop_clip();
}