Beispiel #1
0
void CursesWindow::setDefaultColor(int color_pair) 
{
  def_cp = color_pair;
  if (def_cp < 0) {
    CursesWindow *p;
    if (parent() && ( p = dynamic_cast<CursesWindow *>(parent())))
      def_cp = p->defaultColor();
  }
}
Beispiel #2
0
void CursesWindow::setBackgroundColor(int c) 
{ 
  bkgnd_cp = c; 
  if (bkgnd_cp < 0) {
    CursesWindow *p;
    if (parent() && ( p = dynamic_cast<CursesWindow *>(parent())))
      bkgnd_cp = p->backgroundColor();
  }
  if (bkgnd_cp > 0) wbkgd(m_win, COLOR_PAIR(bkgnd_cp));  
}
Beispiel #3
0
void CursesWindow::touch()
{
  // touch self first
  touchwin(m_win);
  // now, touch all children.. NEXT so they overwrite us
  std::list<Component *> chlds = children();
  for (std::list<Component *>::iterator it = chlds.begin(); it != chlds.end(); ++it)
    {
      CursesWindow *c = dynamic_cast<CursesWindow *>(*it);
      if (c)  c->touch();      
    }
}
Beispiel #4
0
bool edit_archivers() {
  arcrec arc[MAX_ARCS];

  File file(syscfg.datadir, ARCHIVER_DAT);
  if (!file.Open(File::modeReadWrite|File::modeBinary)) {
    if (!create_arcs(out->window())) {
      return false;
    }
    file.Open(File::modeReadWrite|File::modeBinary);
  }
  file.Read(&arc, MAX_ARCS * sizeof(arcrec));
  
  bool done = false;
  do {
    out->Cls(ACS_CKBOARD);
    vector<ListBoxItem> items;
    for (int i = 0; i < MAX_ARCS; i++) {
      items.emplace_back(StringPrintf("[%s] %s", arc[i].extension, arc[i].name));
    }
    CursesWindow* window = out->window();
    ListBox list(out, window, "Select Archiver",
        static_cast<int>(floor(window->GetMaxX() * 0.8)), 
        std::min<int>(10, static_cast<int>(floor(window->GetMaxY() * 0.8))),
        items, out->color_scheme());

    list.selection_returns_hotkey(true);
    list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"} });
    ListBoxResult result = list.Run();
    if (result.type == ListBoxResultType::HOTKEY) {
    } else if (result.type == ListBoxResultType::SELECTION) {
      edit_arc(result.selected + 1, &arc[result.selected]);
    } else if (result.type == ListBoxResultType::NO_SELECTION) {
      done = true;
    }
  } while (!done);

  // Copy first four new fomat archivers to oldarcsrec
  // This was the 4.24 and lower place for them.  4.31 introduced
  // the new archivers record.
  for (int j = 0; j < 4; j++) {
    strncpy(syscfg.arcs[j].extension, arc[j].extension, 4);
    strncpy(syscfg.arcs[j].arca, arc[j].arca     , 32);
    strncpy(syscfg.arcs[j].arce, arc[j].arce     , 32);
    strncpy(syscfg.arcs[j].arcl, arc[j].arcl     , 32);
  }

  // seek to beginning of file, write arcrecs, close file
  file.Seek(0, File::seekBegin);
  file.Write(arc, MAX_ARCS * sizeof(arcrec));
  return true;
}
Beispiel #5
0
void extrn_editors() {
  vector<editorrec> editors;
  DataFile<editorrec> file (syscfg.datadir, EDITORS_DAT);
  if (file) {
    file.ReadVector(editors, 10);
    file.Close();
  }

  bool done = false;
  do {
    out->Cls(ACS_CKBOARD);
    vector<ListBoxItem> items;
    for (size_t i = 0; i < editors.size(); i++) {
      items.emplace_back(StringPrintf("%d. %s", i + 1, editors[i].description));
    }
    CursesWindow* window = out->window();
    ListBox list(out, window, "Select Editor", static_cast<int>(floor(window->GetMaxX() * 0.8)), 
        static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme());

    list.selection_returns_hotkey(true);
    list.set_additional_hotkeys("DI");
    list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} });
    ListBoxResult result = list.Run();
    if (result.type == ListBoxResultType::HOTKEY) {
      switch (result.hotkey) {
        case 'D': {
          if (editors.size()) {
            string prompt = StringPrintf("Delete '%s'", items[result.selected].text().c_str());
            bool yn = dialog_yn(window, prompt);
            if (!yn) {
              break;
            }
            auto it = editors.begin();
            std::advance(it, result.selected);
            editors.erase(it);
          }
        } break;
        case 'I': {
          if (editors.size() >= 10) {
            messagebox(out->window(), "Too many editors.");
            break;
          }
          string prompt = StringPrintf("Insert before which (1-%d) : ", editors.size() + 1);
          size_t i = dialog_input_number(out->window(), prompt, 1, editors.size() + 1);
          editorrec e;
          memset(&e, 0, sizeof(editorrec));
          // N.B. i is one based, result.selected is 0 based.
          if (i <= 0 || i > editors.size() + 1) {
            break;
          } else if (i > editors.size()) {
            editors.push_back(e);
            edit_editor(editors.back());
          } else {
            auto it = editors.begin();
            std::advance(it, i - 1);
            auto new_editor_it = editors.insert(it, e);
            edit_editor(*new_editor_it);
          }
        } break;
      }
    } else if (result.type == ListBoxResultType::SELECTION) {
      edit_editor(editors[result.selected]);
    } else if (result.type == ListBoxResultType::NO_SELECTION) {
      done = true;
    }
  } while (!done);

  DataFile<editorrec> editors_dat(syscfg.datadir, EDITORS_DAT,
    File::modeReadWrite|File::modeBinary|File::modeCreateFile|File::modeTruncate,
    File::shareDenyReadWrite);
  if (editors_dat) {
    editors_dat.WriteVector(editors);
  }
}
Beispiel #6
0
void networks(wwiv::sdk::Config& config) {
  try {
    Networks networks(config);

    bool done = false;
    do {
      vector<ListBoxItem> items;
      for (const auto& n : networks.networks()) {
        items.emplace_back(StringPrintf("@%u %s", n.sysnum, n.name));
      }
      CursesWindow* window = out->window();
      ListBox list(out, window, "Select Network", static_cast<int>(floor(window->GetMaxX() * 0.8)), 
          static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme());

      list.selection_returns_hotkey(true);
      list.set_additional_hotkeys("DI");
      list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} });
      ListBoxResult result = list.Run();

      if (result.type == ListBoxResultType::SELECTION) {
        edit_net(config, networks, result.selected);
      } else if (result.type == ListBoxResultType::NO_SELECTION) {
        done = true;
      } else if (result.type == ListBoxResultType::HOTKEY) {
        switch (result.hotkey) {
        case 'D':
          if (!(syscfg.fnoffset && syscfg.fsoffset && syscfg.fuoffset)) {
            messagebox(window, { "You must run the BBS once", "to set up some variables before ", "deleting a network." });
            break;
          }
          if (networks.networks().size() > 1) {
            const string prompt = StringPrintf("Delete '%s'", networks.at(result.selected).name);
            bool yn = dialog_yn(window, prompt);
            if (yn) {
              yn = dialog_yn(window, "Are you REALLY sure? ");
              if (yn) {
                del_net(networks, result.selected);
              }
            }
          } else {
            messagebox(window, "You must leave at least one network.");
          }
          break;
        case 'I':
          if (!(syscfg.fnoffset && syscfg.fsoffset && syscfg.fuoffset)) {
            vector<string> lines{ "You must run the BBS once to set up ", "some variables before inserting a network." };
            messagebox(window, lines);
            break;
          }
          if (networks.networks().size() >= MAX_NETWORKS) {
            messagebox(window, "Too many networks.");
            break;
          }
          const string prompt = StringPrintf("Insert before which (1-%d) ? ", networks.networks().size() + 1);
          const size_t net_num = dialog_input_number(window, prompt, 1, networks.networks().size() + 1  );
          if (net_num > 0 && net_num <= networks.networks().size() + 1) {
            if (dialog_yn(window, "Are you sure? ")) {
              insert_net(config, networks, net_num - 1);
            }
          }
          break;
        }
      }
    } while (!done);
    networks.Save();
  } catch (const std::exception& e) {
    LOG(ERROR) << e.what();
  }
}
Beispiel #7
0
void edit_languages() {
  vector<languagerec> languages;
  {
    DataFile<languagerec> file(syscfg.datadir, LANGUAGE_DAT);
    if (file) {
      file.ReadVector(languages, MAX_LANGUAGES);
    }
  }

  bool done = false;
  do {
    out->Cls(ACS_CKBOARD);
    vector<ListBoxItem> items;
    for (std::size_t i = 0; i < languages.size(); i++) {
      items.emplace_back(StringPrintf("%d. %s (%s)", i + 1, languages[i].name, languages[i].dir));
    }
    CursesWindow* window = out->window();
    ListBox list(out, window, "Select Language", static_cast<int>(floor(window->GetMaxX() * 0.8)), 
        static_cast<int>(floor(window->GetMaxY() * 0.8)), items, out->color_scheme());

    list.selection_returns_hotkey(true);
    list.set_additional_hotkeys("DI");
    list.set_help_items({{"Esc", "Exit"}, {"Enter", "Edit"}, {"D", "Delete"}, {"I", "Insert"} });
    ListBoxResult result = list.Run();
    if (result.type == ListBoxResultType::HOTKEY) {
      switch (result.hotkey) {
      case 'D': {
        if (languages.size() > 1) {
          string prompt = StringPrintf("Delete '%s' ?", items[result.selected].text().c_str());
          bool yn = dialog_yn(window, prompt);
          if (!yn) {
            break;
          }
          auto it = languages.begin();
          std::advance(it, result.selected);
          languages.erase(it);
          if (languages.size() == 1) {
            languages[0].num = 0;
          }
        } else {
          messagebox(window, "You must leave at least one language.");
        }
      } break;
      case 'I':
        if (languages.size() >= MAX_LANGUAGES) {
          messagebox(window, "Too many languages.");
          break;
        }

        string prompt = StringPrintf("Insert before which (1-%d) : ", languages.size() + 1);
        size_t i = dialog_input_number(out->window(), prompt, 1, languages.size() + 1);
        // N.B. i is one based, result.selected is 0 based.
        if (i <= 0 || i > languages.size() + 1) {
          break;
        } 
        
        languagerec l;
        memset(&l, 0, sizeof(languagerec));
        strcpy(l.name, "English");
        strcpy(l.dir, syscfg.gfilesdir);
        strcpy(l.mdir, syscfg.gfilesdir);
        l.num = get_next_langauge_num(languages);

        if (i > languages.size()) {
          languages.push_back(l);
          edit_lang(languages.back());
        } else {
          auto it = languages.begin();
          std::advance(it, i - 1);
          auto new_lang = languages.insert(it, l);
          edit_lang(*new_lang);
        }
        break;
      }
    } else if (result.type == ListBoxResultType::SELECTION) {
      edit_lang(languages[result.selected]);
    } else if (result.type == ListBoxResultType::NO_SELECTION) {
      done = true;
    }
  } while (!done);

  {
    DataFile<languagerec> file(syscfg.datadir, LANGUAGE_DAT,
      File::modeWriteOnly | File::modeBinary | File::modeCreateFile | File::modeTruncate, File::shareDenyReadWrite);
    if (file) {
      file.WriteVector(languages, MAX_LANGUAGES);
    }
  }
}