diff options
author | Olivier Gayot <duskcoder@gmail.com> | 2014-06-18 15:45:45 +0200 |
---|---|---|
committer | Olivier Gayot <duskcoder@gmail.com> | 2014-06-18 15:49:38 +0200 |
commit | 0e03940802cebefdf6b0597a154bd9395e1af4d2 (patch) | |
tree | 409a58499128227dd57943515d003074190551f5 /src/form_field.cpp |
Add the vanilla version of the project
This version can still be found here:
http://www.roland-riegel.de/nload/index.html
Diffstat (limited to 'src/form_field.cpp')
-rw-r--r-- | src/form_field.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/src/form_field.cpp b/src/form_field.cpp new file mode 100644 index 0000000..03b70f7 --- /dev/null +++ b/src/form_field.cpp @@ -0,0 +1,237 @@ +/*************************************************************************** + form_field.cpp + ------------------- + begin : Tue Jul 30 2002 + copyright : (C) 2002 - 2012 by Roland Riegel + email : feedback@roland-riegel.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program 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 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "form_field.h" +#include "window.h" + +using namespace std; + +Field::Field(int x, int y, int width, int height) : m_field(0) +{ + m_field = new_field(height, width, y, x, 0, 0); + set_field_opts(m_field, field_opts(m_field) | O_BLANK | O_PASSOK); + + m_enumElementsArray = 0; +} + +Field::~Field() +{ + setEnumField(vector<string>()); + free_field(m_field); +} + +void Field::setText(const string& text) +{ + set_field_buffer(m_field, 0, text.c_str()); +} + +string Field::getText() +{ + return field_buffer(m_field, 0); +} + +void Field::move(int x, int y) +{ + move_field(m_field, y, x); +} + +void Field::setVisible(bool new_visible) +{ + set_field_opts(m_field, new_visible ? field_opts(m_field) | O_VISIBLE : field_opts(m_field) & ~O_VISIBLE); +} + +bool Field::isVisible() +{ + return (field_opts(m_field) & O_VISIBLE) == O_VISIBLE; +} + +void Field::setEnabled(bool new_enabled) +{ + set_field_opts(m_field, new_enabled ? field_opts(m_field) | O_ACTIVE : field_opts(m_field) & ~O_ACTIVE); +} + +bool Field::isEnabled() +{ + return (field_opts(m_field) & O_ACTIVE) == O_ACTIVE; +} + +void Field::setIntegerField(int min, int max) +{ + set_field_type(m_field, TYPE_INTEGER, 0, min, max); +} + +void Field::setEnumField(const vector<string>& elements) +{ + if(elements.empty()) + { + set_field_type(m_field, TYPE_ALNUM, 0); + + if(m_enumElementsArray) + delete[] m_enumElementsArray; + m_enumElementsArray = 0; + + m_enumElements.clear(); + + return; + } + + m_enumElements = elements; + + if(m_enumElementsArray) + delete[] m_enumElementsArray; + m_enumElementsArray = new const char*[m_enumElements.size() + 1]; + + for(vector<string>::const_iterator itElement = m_enumElements.begin(); itElement != m_enumElements.end(); ++itElement) + m_enumElementsArray[itElement - m_enumElements.begin()] = itElement->c_str(); + m_enumElementsArray[elements.size()] = 0; + + set_field_type(m_field, TYPE_ENUM, m_enumElementsArray, 0, 0); +} + +void Field::setFixed(bool new_fixed) +{ + set_field_opts(m_field, new_fixed ? field_opts(m_field) & ~O_EDIT : field_opts(m_field) | O_EDIT); +} + +bool Field::isFixed() +{ + return (field_opts(m_field) & O_EDIT) != O_EDIT; +} + +void Field::setFirstOnPage(bool new_newpage) +{ + set_new_page(m_field, new_newpage); +} + +bool Field::isFirstOnPage() +{ + return new_page(m_field); +} + +bool operator==(const Field& field1, const Field& field2) +{ + return field1.m_field == field2.m_field; +} + +bool operator==(const Field& field1, const FIELD* field2) +{ + return field1.m_field == field2; +} + + +Form::Form(Slots* slots) + : m_slots(slots), m_form(0), m_visible(false) +{ +} + +Form::~Form() +{ +} + +vector<Field*>& Form::fields() +{ + return m_fields; +} + +void Form::show(Window* main_window, SubWindow* sub_window) +{ + if(m_form) + return; + + m_curses_fields = new FIELD* [ m_fields.size() ]; + vector<Field*>::const_iterator r = m_fields.begin(); + int i = 0; + while(r != m_fields.end()) + { + m_curses_fields[i] = (*r)->m_field; + r++; i++; + } + + m_curses_fields[m_fields.size()] = 0; + m_form = new_form(m_curses_fields); + + if(!m_form) + return; + + set_form_userptr(m_form, this); + set_form_win(m_form, main_window->m_window); + set_form_sub(m_form, sub_window->m_window); + set_field_term(m_form, fieldChanged); + + post_form(m_form); + + m_visible = true; +} + +void Form::hide() +{ + if(!m_form) + return; + + unpost_form(m_form); + free_form(m_form); + m_form = 0; + + delete[] m_curses_fields; + m_curses_fields = 0; + + m_visible = false; +} + +bool Form::isVisible() +{ + return m_visible; +} + +void Form::processKey(int key) +{ + if(m_form) + form_driver(m_form, key); +} + +int Form::getPage() +{ + if(!m_form) + return 0; + return form_page(m_form); +} + +int Form::getPageCount() +{ + int pages = 0; + for(vector<Field*>::const_iterator i = m_fields.begin(); i != m_fields.end(); i++) + { + if((*i)->isFirstOnPage()) + pages++; + } + return pages; +} + +void Form::fieldChanged(FORM* form) +{ + Form* f = (Form*) form_userptr(form); + if(!f) + return; + + if(f->m_slots) + { + for(vector<Field*>::const_iterator i = f->m_fields.begin(); i != f->m_fields.end(); ++i) + if((*i)->m_field == current_field(form)) + f->m_slots->slot_fieldChanged(*i); + } +} + |