plugin_arg_form.cpp

来自「ncbi源码」· C++ 代码 · 共 1,188 行 · 第 1/3 页

CPP
1,188
字号
            return new CButtonFormatter(arg);        case CPluginArg::eDocument:        case CPluginArg::eObject:            return new CSingleObjFormatter(arg, objs);        default:            LOG_POST(Error << "unhandled argument type: " << (int)arg.GetType());            break;        }    } else {        switch (arg.GetType()) {        case CPluginArg::eString:        case CPluginArg::eInteger:        case CPluginArg::eDouble:            return new CMultiLineFormatter(arg);        case CPluginArg::eDocument:        case CPluginArg::eObject:            return new CMultiObjFormatter(arg, objs);        default:            LOG_POST(Error << "unhandled argument type: " << (int)arg.GetType());            break;        }    }    return NULL;}////// internal implementation//////// constants controlling layout//// default row height, in pixelsstatic const int sc_RowHeight = 25;// default row width, in pixelsstatic const int sc_RowWidth = 500;// default fraction of the width devoted to labelsstatic const float sc_LabelFrac = 0.33f;//// argument formatter for single-line input boxes//CSimpleFormatter::CSimpleFormatter(CPluginArg& arg)    : m_Group(NULL),      m_Input(NULL),      m_Arg(&arg){}void CSimpleFormatter::Process(void){    if ( !m_Input  ||  !m_Group  ||  !m_Arg.GetPointer() ) {        return;    }    string val(m_Input->value());    switch (m_Arg->GetType()) {    case CPluginArg::eInteger:        m_Arg->SetInteger(val);        break;    case CPluginArg::eDouble:        m_Arg->SetDouble(val);        break;    case CPluginArg::eString:        m_Arg->SetString(val);        break;    case CPluginArg::eFile:        m_Arg->SetFile(val);        break;    default:        LOG_POST(Error << "CSimpleFormatter: unhandled argument type");        break;    }}Fl_Widget* CSimpleFormatter::GetWidget(){    if ( !m_Group ) {        //        // create a new group for our argument        //        // default pieces of text        const char* label_text = m_Arg->GetDesc().c_str();        const char* initial_value = m_Arg->AsString().c_str();        const char* tooltip = NULL;        if (m_Arg->IsSetLong_desc()) {            tooltip = m_Arg->GetLong_desc().c_str();        }        // label and value sc_RowWidth        int label_width = int (sc_RowWidth * sc_LabelFrac);        int value_width = sc_RowWidth - label_width;        int label_y = 0;        int row_height = sc_RowHeight;        // create our input item        m_Input = NULL;        Fl_Button* button = NULL;        switch (m_Arg->GetType()) {        default:        case CPluginArg::eString:            m_Input = new Fl_Input(label_width, 0,                                   value_width, row_height);            break;        case CPluginArg::eInteger:            m_Input = new Fl_Int_Input(label_width, 0,                                     value_width, row_height);            break;        case CPluginArg::eDouble:            m_Input = new Fl_Float_Input(label_width, 0,                                       value_width, row_height);            break;        case CPluginArg::eFile:            label_y = 10;            row_height += label_y;            m_Input = new Fl_File_Input(label_width, 0,                                      value_width - 30, row_height);            // we also need a button...            button = new Fl_Button(label_width + value_width - 22, 13, 19, 19);            button->label("...");            button->callback((Fl_Callback*)&CSimpleFormatter::cb_FileOpen,                             (void*)m_Input);            break;        }        _ASSERT(m_Input);        m_Input->value(initial_value);        m_Input->color(FL_BACKGROUND2_COLOR);        m_Input->box(FL_DOWN_BOX);        m_Input->tooltip(tooltip);        m_Input->labelsize(12);        m_Input->textsize(12);        // create a label to go with this as well...        Fl_Box* label = new Fl_Box(0, 0, label_width, row_height);        label->label(label_text);        label->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT |                     FL_ALIGN_CLIP | FL_ALIGN_WRAP);        label->labelsize(12);        // create a group for this row        m_Group = new Fl_Group(0, 0, sc_RowWidth, row_height);        m_Group->add(label);        m_Group->add_resizable(*m_Input);        if (button) {            m_Group->add(button);        }        m_Group->end();    }    return m_Group;}void CSimpleFormatter::cb_FileOpen(Fl_Widget* w, void* data){    Fl_Input* input = static_cast<Fl_Input*>(data);    if (input) {        string str = NcbiFileBrowser("Select a file", "", input->value());        if ( !str.empty() ) {            input->value(str.c_str());        }    }}//// argument formatter for check-box arguments//CButtonFormatter::CButtonFormatter(CPluginArg& arg)    : m_Button(NULL),      m_Arg(&arg){}void CButtonFormatter::Process(void){    if ( !m_Button  ||  !m_Arg.GetPointer() ) {        return;    }    bool checked = m_Button->value() ? true : false;    m_Arg->SetBoolean(checked);}Fl_Widget* CButtonFormatter::GetWidget(){    if ( !m_Button ) {        //        // create a new group for our argument        //        // default pieces of text        const char* label_text = m_Arg->GetDesc().c_str();        bool        initial_value = m_Arg->AsBoolean();        const char* tooltip = NULL;        if (m_Arg->IsSetLong_desc()) {            tooltip = m_Arg->GetLong_desc().c_str();        }        m_Button = new Fl_Check_Button(0, 0, sc_RowWidth, sc_RowHeight,                                       label_text);        if (initial_value) {            m_Button->value(1);        }        if (tooltip) {            m_Button->tooltip(tooltip);        }    }    return m_Button;}//// argument formatter for multiline-line input boxes//CMultiLineFormatter::CMultiLineFormatter(CPluginArg& arg)    : m_Group(NULL),      m_Input(NULL),      m_Arg(&arg){}void CMultiLineFormatter::Process(void){    string val(m_Input->value());    vector<string> vals;    string::iterator start = val.begin();    string::iterator curr  = val.begin();    string::iterator end   = val.end();    for ( ;  curr != end;  ++curr) {        if (*curr == ','  ||  *curr == ';') {            // tokenize            if ( start != curr ) {                vals.push_back(string(start, curr));            }            for (++curr;  curr != end;  ++curr) {                // skip whitespace                if ( *curr != ','  &&                     *curr != ';'  &&                     *curr != ' '  &&                     *curr != '\t'  &&                     *curr != '\n'  &&                     *curr != '\r') {                    break;                }            }            start = curr;        } else if (*curr == '"') {            // balance double quotes            for (++curr;  curr != end  &&  *curr != '"';  ++curr) {            }        }    }    if ( start != curr ) {        vals.push_back(string(start, curr));    }    CPluginArg::TValues values;    switch (m_Arg->GetType()) {    case CPluginArg::eInteger:        ITERATE (vector<string>, iter, vals) {            CRef<CPluginValue> value(new CPluginValue());            value->SetInteger(*iter);            values.push_back(value);        }        break;    case CPluginArg::eDouble:        ITERATE (vector<string>, iter, vals) {            CRef<CPluginValue> value(new CPluginValue());            value->SetDouble(*iter);            values.push_back(value);        }        break;    case CPluginArg::eString:        ITERATE (vector<string>, iter, vals) {            CRef<CPluginValue> value(new CPluginValue());            value->SetString(*iter);            values.push_back(value);        }        break;    case CPluginArg::eFile:        ITERATE (vector<string>, iter, vals) {            CRef<CPluginValue> value(new CPluginValue());            value->SetFile(*iter);            values.push_back(value);        }        break;    default:        LOG_POST(Error << "CMultiLineFormatter: unhandled argument type");        break;    }    m_Arg->SetList(values);}Fl_Widget* CMultiLineFormatter::GetWidget(void){    if ( !m_Group ) {        //        // create a new group for our argument        //        // default pieces of text        const char* label_text = m_Arg->GetDesc().c_str();        string initial_value;        ITERATE (CPluginArg::TData::TArray, iter, m_Arg->GetData().GetArray()) {            if ( !initial_value.empty() ) {                initial_value += "\n";            }            initial_value += (*iter)->AsString();        }        const char* tooltip = NULL;        if (m_Arg->IsSetLong_desc()) {            tooltip = m_Arg->GetLong_desc().c_str();        }        // label and value sc_RowWidth        int label_width = int (sc_RowWidth * sc_LabelFrac);        int value_width = sc_RowWidth - label_width;        int label_y = 0;        int row_height = sc_RowHeight;// * 2;        // create our input item        m_Input = new Fl_Input(label_width, 0,                               value_width, row_height);        _ASSERT(m_Input);        m_Input->value(initial_value.c_str());        m_Input->box(FL_DOWN_BOX);        m_Input->color(FL_BACKGROUND2_COLOR);        m_Input->tooltip(tooltip);        m_Input->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_TOP);        m_Input->labelsize(12);        m_Input->textsize(12);        // create a label to go with this as well...        Fl_Box* label = new Fl_Box(0, 0, label_width, row_height);        label->label(label_text);        label->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT |                     FL_ALIGN_CLIP | FL_ALIGN_WRAP);        label->labelsize(12);        // create a group for this row        m_Group = new Fl_Group(0, 0, sc_RowWidth, row_height);        m_Group->add(label);        m_Group->add_resizable(*m_Input);        m_Group->end();    }    return m_Group;}//// CMenuFormatter handles items with 'set' constraints//CMenuFormatter::CMenuFormatter(CPluginArg& arg)    : m_Group(NULL),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?