⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 varabled.cpp

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 CPP
字号:
/********************************************************************** * File:        varabled.cpp  (Formerly varedit.c) * Description: Variables Editor * Author:		Phil Cheatle * Created:		Mon Nov 11 09:51:58 GMT 1991 * * (C) Copyright 1991, Hewlett-Packard Ltd. ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** http://www.apache.org/licenses/LICENSE-2.0 ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. * **********************************************************************/#include "mfcpch.h"#include          <stdio.h>#include          "varable.h"#include          "varblmen.h"#include          "varblwin.h"#include          "varabled.h"#include          "cmndwin.h"#include          "mainblk.h"#define VARDIR        "configs/" /*variables files */const ERRCODE NO_VARIABLES_TO_EDIT = "No Variables defined to edit";/********************************************************************** * build_list_of_all_leaves() * * Generate a list of menu leaves for each of the variables. The list is * heterogeneous, different menu leaf types for each variable type. **********************************************************************/MENU_L_LIST *build_list_of_all_leaves() {  //find all variables  INT_VARIABLE_C_IT int_it (INT_VARIABLE::get_head ());  BOOL_VARIABLE_C_IT bool_it (BOOL_VARIABLE::get_head ());  STRING_VARIABLE_C_IT str_it (STRING_VARIABLE::get_head ());  double_VARIABLE_C_IT dbl_it (double_VARIABLE::get_head ());  MENU_L_LIST *all_leaves_list = new MENU_L_LIST;  MENU_L_IT it;  it.set_to_list (all_leaves_list);  for (int_it.mark_cycle_pt (); !int_it.cycled_list (); int_it.forward ())    it.add_to_end (new MENU_L (new INT_VAR_MENU_LEAF (int_it.data ())));  for (bool_it.mark_cycle_pt (); !bool_it.cycled_list (); bool_it.forward ())    it.add_to_end (new MENU_L (new BOOL_VAR_MENU_LEAF (bool_it.data ())));  for (str_it.mark_cycle_pt (); !str_it.cycled_list (); str_it.forward ())    it.add_to_end (new MENU_L (new STR_VAR_MENU_LEAF (str_it.data ())));  for (dbl_it.mark_cycle_pt (); !dbl_it.cycled_list (); dbl_it.forward ())    it.add_to_end (new MENU_L (new DBL_VAR_MENU_LEAF (dbl_it.data ())));  return all_leaves_list;}/********************************************************************** * build_main_var_menu() * * Extract each element from the sorted, non empty list of menu leaves. Add * each to the appropriate menu.  Note that ALL menus for ALL variable editor * windows are built at this stage.  The VAR_SUB_MENU menu leaves used in the * leaves of the top level window hold the root menus for the sub windows for * use if and when that window is created.  A little wastful on space perhaps, * but easier than reconstructing/sorting/etc the all_leaves_list. * **********************************************************************/MENU_ROOT *build_main_var_menu(  //build menus                               MENU_L_LIST *all_leaves_list) {  MENU_L_IT it;  MENU_L_LIST sub_window_list;  MENU_L_LIST sub_menu_list;  MENU_ROOT *main_root;  VAR_NON_RADIO_MENU *main_menu;  NON_RADIO_MENU *std_menu;  MENU_ROOT *main_misc_root = NULL;  VAR_NON_RADIO_MENU *main_misc_menu = NULL;  MENU_ROOT *sub_window_root;  VAR_NON_RADIO_MENU *current_sub_win_menu;  VAR_NON_RADIO_MENU *sub_window_misc_menu;  MENU_L *leaf;  const char *full_name;  char first_word[80];  char first_two_words[80];  int header_len;  STRING varfile;                //save config filename  main_root = new MENU_ROOT;  main_menu = new VAR_NON_RADIO_MENU ("SubMenus");  main_root->add_child (main_menu);  while (!all_leaves_list->empty ()) {                                 // Whatever is left    it.set_to_list (all_leaves_list);    full_name = (it.data ()->ptr)->cmp_str ();                                 // 1st word delim by _    get_first_words (full_name, 1, first_word);    extract_sublist(all_leaves_list, first_word, &sub_window_list);                                  //addto main misc menu    if (sub_window_list.singleton ()) {      if (main_misc_root == NULL) {        main_misc_root = new MENU_ROOT;        main_misc_menu = new VAR_NON_RADIO_MENU ("Miscellaneous");        main_misc_root->add_child (main_misc_menu);      }      it.set_to_list (&sub_window_list);      leaf = it.extract ();      leaf->ptr->new_label (full_name);      main_misc_menu->add_child (leaf);    }    else {                       //build subwindow menu      sub_window_root = new MENU_ROOT;      main_menu->add_child (new VAR_SUB_MENU (first_word,        sub_window_root));      sub_window_misc_menu = new VAR_NON_RADIO_MENU ("Miscellaneous");      sub_window_misc_menu->        add_child (new        SIMPLE_MENU_LEAF ("Kill Sub Window", KILL_WINDOW_CMD));      while (!sub_window_list.empty ()) {        it.set_to_list (&sub_window_list);        full_name = it.data ()->ptr->cmp_str ();        get_first_words (full_name, 2, first_two_words);        extract_sublist(&sub_window_list, first_two_words, &sub_menu_list);         it.set_to_list (&sub_menu_list);                                 //addto subwin misc        if (sub_menu_list.singleton ()) {          leaf = it.extract ();          leaf->ptr->new_label (full_name);          sub_window_misc_menu->add_child (leaf);        }        else {                                 //build sub menu          current_sub_win_menu =            new VAR_NON_RADIO_MENU(first_two_words);           sub_window_root->add_child (current_sub_win_menu);          header_len = strlen (first_two_words);          while (!sub_menu_list.empty ()) {            it.set_to_list (&sub_menu_list);            leaf = it.extract ();            leaf->ptr->new_label (leaf->ptr->cmp_str () +              header_len);            current_sub_win_menu->add_child (leaf);          }        }      }      sub_window_root->add_child (sub_window_misc_menu);    }  }  if (main_misc_root != NULL)    main_root->add_child (main_misc_root);  varfile = datadir;  varfile += VARDIR;             /*variables dir */  varfile += "edited";           /*actual name */  std_menu = new NON_RADIO_MENU ("Build Config File");  main_root->add_child (std_menu);  std_menu->add_child (new VARIABLE_MENU_LEAF ("All Variables",    WRITE_ALL_CMD,    varfile.string ()));  std_menu->add_child (new VARIABLE_MENU_LEAF ("Changed Variables Only",    WRITE_CHANGED_CMD,    varfile.string ()));  return main_root;}/********************************************************************** * extract_sublist() * * Extract a sublist containing elements whose name initially matches the * specified string * **********************************************************************/void extract_sublist(                             //remove initial items                     MENU_L_LIST *source_list,    //source list                     char *leading_str,           //string to match                     MENU_L_LIST *extracted_list  //extracted list                    ) {  MENU_L_IT start_it(source_list);   MENU_L_IT end_it(source_list);   int match_len = strlen (leading_str);  while (!end_it.at_last () &&    (strncmp (leading_str, end_it.data_relative (1)->ptr->cmp_str (),    match_len) == 0))    end_it.forward ();  extracted_list->assign_to_sublist (&start_it, &end_it);}/********************************************************************** * get_first_words() * * Copy the first N words from the source string to the target string. * Words are delimited by "_" * **********************************************************************/void get_first_words(                //copy first N words                     const char *s,  //source string                     int n,          //number of words                     char *t         //target string                    ) {  int full_length = strlen (s);  int reqd_len = 0;              //No. of chars requird  const char *next_word = s;  while ((n > 0) && reqd_len < full_length) {    reqd_len += strcspn (next_word, "_") + 1;    next_word += reqd_len;    n--;  }  strncpy(t, s, reqd_len);   t[reqd_len] = '\0';            //ensure null terminal}/********************************************************************** * menu_item_sorter()   LIST SORT COMPARATOR * * Given two MENU_L items, sort them on the basis of their cmp_str  s * **********************************************************************/int menu_item_sorter(  //sorter                     const void *item1,                     const void *item2) {  MENU_L *menu_l_1 = (*(MENU_L **) item1);  MENU_L *menu_l_2 = (*(MENU_L **) item2);  MENU_NODE *node1;  MENU_NODE *node2;  const char *str1;  const char *str2;  node1 = menu_l_1->ptr;  node2 = menu_l_2->ptr;  str1 = node1->cmp_str ();  str2 = node2->cmp_str ();  return strcmp (str1, str2);}/********************************************************************** * start_variables_editor() * * Create the top level variables editor window.  Build all the menus for all * the subwindows in the process. **********************************************************************/void start_variables_editor() {  //create top level win  MENU_L_LIST *all_leaves_list = new MENU_L_LIST;  MENU_L_IT it;  all_leaves_list = build_list_of_all_leaves ();  it.set_to_list (all_leaves_list);  if (it.empty ()) {    NO_VARIABLES_TO_EDIT.error ("start_variables_editor", LOG, NULL);  }  it.sort (&menu_item_sorter);  new VARIABLES_WINDOW ("VarEditorMAIN",    build_main_var_menu (all_leaves_list), NULL);}

⌨️ 快捷键说明

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