varabled.cpp

来自「一个google的OCR源码」· C++ 代码 · 共 347 行

CPP
347
字号
///////////////////////////////////////////////////////////////////////// File:        varabled.cpp// Description: Variables Editor// Author:      Joern Wanke// Created:     Wed Jul 18 10:05:01 PDT 2007//// (C) Copyright 2007, Google Inc.// 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.///////////////////////////////////////////////////////////////////////////// The variables editor is used to edit all the variables used within// tesseract from the ui.#ifndef GRAPHICS_DISABLED#include "varabled.h"#ifdef WIN32#else#include <stdlib.h>#include <stdio.h>#endif#include <map>#include "scrollview.h"#include "svmnode.h"#include "varable.h"#include "mainblk.h"#define VARDIR        "configs/" /*variables files */#define MAX_ITEMS_IN_SUBMENU 30const ERRCODE NO_VARIABLES_TO_EDIT = "No Variables defined to edit";// Contains the mappings from unique VC ids to their actual pointers.static std::map<int, VariableContent*> vcMap;static int nrVariables = 0;static int writeCommands[2];ELISTIZE(VariableContent)// Constructors for the various VarTypes.VariableContent::VariableContent(STRING_VARIABLE* it) {  my_id_ = nrVariables;  nrVariables++;  var_type_ = VT_STRING;  sIt = it;  vcMap[my_id_] = this;}// Constructors for the various VarTypes.VariableContent::VariableContent(INT_VARIABLE* it) {  my_id_ = nrVariables;  nrVariables++;  var_type_ = VT_INTEGER;  iIt = it;  vcMap[my_id_] = this;}// Constructors for the various VarTypes.VariableContent::VariableContent(BOOL_VARIABLE* it) {  my_id_ = nrVariables;  nrVariables++;  var_type_ = VT_BOOLEAN;  bIt = it;  vcMap[my_id_] = this;}// Constructors for the various VarTypes.VariableContent::VariableContent(double_VARIABLE* it) {  my_id_ = nrVariables;  nrVariables++;  var_type_ = VT_DOUBLE;  dIt = it;  vcMap[my_id_] = this;}// Gets a VC object identified by its ID.VariableContent* VariableContent::GetVariableContentById(int id) {  return vcMap[id];}// Copy the first N words from the source string to the target string.// Words are delimited by "_".void VariablesEditor::GetFirstWords(                     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}// Getter for the name.const char* VariableContent::GetName() const {  if (var_type_ == VT_INTEGER) { return iIt->name_str(); }  else if (var_type_ == VT_BOOLEAN) { return bIt->name_str(); }  else if (var_type_ == VT_DOUBLE) { return dIt->name_str(); }  else if (var_type_ == VT_STRING) { return sIt->name_str(); }  else    return "ERROR: VariableContent::GetName()";}// Getter for the description.const char* VariableContent::GetDescription() const {  if (var_type_ == VT_INTEGER) { return iIt->info_str(); }  else if (var_type_ == VT_BOOLEAN) { return bIt->info_str(); }  else if (var_type_ == VT_DOUBLE) { return dIt->info_str(); }  else if (var_type_ == VT_STRING) { return sIt->info_str(); }  else return NULL;}// Getter for the value.const char* VariableContent::GetValue() const {char* msg = new char[1024];  if (var_type_ == VT_INTEGER) {    sprintf(msg, "%d", ((inT32) *(iIt)));  } else if (var_type_ == VT_BOOLEAN) {    sprintf(msg, "%d", ((BOOL8) * (bIt)));  } else if (var_type_ == VT_DOUBLE) {    sprintf(msg, "%g", ((double) * (dIt)));  } else if (var_type_ == VT_STRING) {    if (((STRING) * (sIt)).string() != NULL) {      sprintf(msg, "%s", ((STRING) * (sIt)).string());    } else {      return "Null";    }  }  return msg;}// Setter for the value.void VariableContent::SetValue(const char* val) {// TODO (wanke) Test if the values actually are properly converted.// (Quickly visible impacts?)  changed_ = TRUE;  if (var_type_ == VT_INTEGER) {    iIt->set_value(atoi(val));  } else if (var_type_ == VT_BOOLEAN) {    bIt->set_value(atoi(val));  } else if (var_type_ == VT_DOUBLE) {    dIt->set_value(strtod(val, NULL));  } else if (var_type_ == VT_STRING) {    sIt->set_value(val);  }}// Gets the up to the first 3 prefixes from s (split by _).// For example, tesseract_foo_bar will be split into tesseract,foo and bar.void VariablesEditor::GetPrefixes(const char* s, STRING* level_one,                                                 STRING* level_two,                                                 STRING* level_three) {  char* p = new char[1024];  GetFirstWords(s, 1, p);  *level_one = p;  GetFirstWords(s, 2, p);  *level_two = p;  GetFirstWords(s, 3, p);  *level_three = p;  delete[] p;}// Compare two VC objects by their name.int VariableContent::Compare(const void* v1, const void* v2) {  const VariableContent* one = *reinterpret_cast<const VariableContent* const *>(v1);  const VariableContent* two = *reinterpret_cast<const VariableContent* const *>(v2);  return strcmp(one->GetName(), two->GetName());}// Find all editable variables used within tesseract and create a// SVMenuNode tree from it.// TODO (wanke): This is actually sort of hackish.SVMenuNode* VariablesEditor::BuildListOfAllLeaves() {  // find all variables.  SVMenuNode* mr = new SVMenuNode();  VariableContent_LIST vclist;  VariableContent_IT vc_it(&vclist);  std::map<const char*, int> amount;  //to count the # of entries for a specifc char*.  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());  // Add all variables to a list.  for (int_it.mark_cycle_pt(); !int_it.cycled_list(); int_it.forward()) {    vc_it.add_after_then_move(new VariableContent(int_it.data()));  }  for (bool_it.mark_cycle_pt(); !bool_it.cycled_list(); bool_it.forward()) {    vc_it.add_after_then_move(new VariableContent(bool_it.data()));  }  for (str_it.mark_cycle_pt(); !str_it.cycled_list(); str_it.forward()) {    vc_it.add_after_then_move(new VariableContent(str_it.data()));  }  for (dbl_it.mark_cycle_pt(); !dbl_it.cycled_list(); dbl_it.forward()) {    vc_it.add_after_then_move(new VariableContent(dbl_it.data()));  }  // Count the # of entries starting with a specific prefix.  for (vc_it.mark_cycle_pt(); !vc_it.cycled_list(); vc_it.forward()) {    VariableContent* vc = vc_it.data();    STRING tag;    STRING tag2;    STRING tag3;    GetPrefixes(vc->GetName(), &tag, &tag2, &tag3);    amount[tag.string()]++;    amount[tag2.string()]++;    amount[tag3.string()]++;  }  vclist.sort(VariableContent::Compare);  // Sort the list alphabetically.  SVMenuNode* other = mr->AddChild("OTHER");  // go through the list again and this time create the menu structure.  vc_it.move_to_first();  for (vc_it.mark_cycle_pt(); !vc_it.cycled_list(); vc_it.forward()) {    VariableContent* vc = vc_it.data();    STRING tag;    STRING tag2;    STRING tag3;    GetPrefixes(vc->GetName(), &tag, &tag2, &tag3);    if (amount[tag.string()] == 1) { other->AddChild(vc->GetName(), vc->GetId(),                                            vc->GetValue(),                                            vc->GetDescription());    } else {  // More than one would use this submenu -> create submenu.      SVMenuNode* sv = mr->AddChild(tag.string());      if ((amount[tag.string()] <= MAX_ITEMS_IN_SUBMENU) || (amount[tag2.string()] <= 1)) {        sv->AddChild(vc->GetName(), vc->GetId(),                     vc->GetValue(), vc->GetDescription());      } else {  // Make subsubmenus.        SVMenuNode* sv2 = sv->AddChild(tag2.string());        sv2->AddChild(vc->GetName(), vc->GetId(),                      vc->GetValue(), vc->GetDescription());      }    }  }  return mr;}// Event listener. Waits for SVET_POPUP events and processes them.void VariablesEditor::Notify(const SVEvent* sve) {  if (sve->type == SVET_POPUP) {  // only catch SVET_POPUP!    char* param = sve->parameter;    if (sve->command_id == writeCommands[0]) {      WriteVars(param, false);    } else if (sve->command_id == writeCommands[1]) {      WriteVars(param, true);    } else {      VariableContent* vc = VariableContent::GetVariableContentById(          sve->command_id);      vc->SetValue(param);      sv_window_->AddMessage("Setting %s to %s",                             vc->GetName(), vc->GetValue());    }  }}// Integrate the variables editor as popupmenu into the existing scrollview// window (usually the pg editor). If sv == null, create a new empty// empty window and attach the variables editor to that window (ugly).VariablesEditor::VariablesEditor(ScrollView* sv) {  if (sv == NULL) {    const char* name = "VarEditorMAIN";    sv = new ScrollView(name, 1, 1, 200, 200, 300, 200);  }  sv_window_ = sv;  //Only one event handler per window.  //sv->AddEventHandler((SVEventHandler*) this);  SVMenuNode* svMenuRoot = BuildListOfAllLeaves();  STRING varfile;  varfile = datadir;  varfile += VARDIR;             // variables dir  varfile += "edited";           // actual name  SVMenuNode* std_menu = svMenuRoot->AddChild ("Build Config File");  writeCommands[0] = nrVariables+1;  std_menu->AddChild("All Variables", writeCommands[0],                     varfile.string(), "Config file name?");  writeCommands[1] = nrVariables+2;  std_menu->AddChild ("changed_ Variables Only", writeCommands[1],                      varfile.string(), "Config file name?");  svMenuRoot->BuildMenu(sv, false);}// Write all (changed_) variables to a config file.void VariablesEditor::WriteVars(char *filename,    // in this file                                bool changes_only  // changed_ vars only?                               ) {  FILE *fp;                      // input file  char msg_str[255];                                 // if file exists  if ((fp = fopen (filename, "r")) != NULL) {    fclose(fp);    sprintf (msg_str, "Overwrite file " "%s" "? (Y/N)", filename);    int a = sv_window_->ShowYesNoDialog(msg_str);    if (a == 'n') { return; }  // dont write  }  fp = fopen (filename, "w");  // can we write to it?  if (fp == NULL) {    sv_window_->AddMessage("Cant write to file " "%s" "", filename);    return;  }  for (std::map<int, VariableContent*>::iterator iter = vcMap.begin();                                          iter != vcMap.end();                                          ++iter) {    VariableContent* cur = iter->second;    if (!changes_only || cur->HasChanged()) {      fprintf (fp, "%-25s   %-12s   # %s\n",               cur->GetName(), cur->GetValue(), cur->GetDescription());    }  }  fclose(fp);}#endif

⌨️ 快捷键说明

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