home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / peter / ER / v3dNumber.cxx < prev    next >
C/C++ Source or Header  |  1998-07-07  |  5KB  |  216 lines

  1. /*
  2.   v3dNumber.cxx
  3. */
  4.  
  5. #include "v3dNumber.h"
  6.  
  7. #include "_util.h"
  8.  
  9. ///////////////
  10. // CREATORS //
  11. /////////////
  12. // v3dNumber::v3dNumber
  13. //    Creates a new ECG driver and sets the data source to the ECG driver
  14. //    object specified.
  15. // Parameters:
  16. //    int        num_digits
  17. //        The maximum number of digits this number will show.
  18. //    v3dFont        the_font
  19. //        The font that will be used for the text.
  20. v3dNumber::v3dNumber (int num_digits, v3dFont *the_font) :
  21.     num_digits_ (num_digits)
  22. {
  23.     initialize(the_font);
  24. }
  25.  
  26. // v3dNumber::v3dNumber
  27. //    Creates a copy of the v3dNumber.
  28. v3dNumber::v3dNumber (const v3dNumber &number)
  29. {
  30.     imp_->CopyObject(number);
  31.  
  32.     num_digits_ = number.num_digits_;
  33.     the_number_ = number.the_number_;
  34.  
  35.     for (int j = 0; j < num_digits_; ++j) {
  36.         for (int i = 0; i < 10; ++i) {
  37.             the_digits_[j][i] = (v3dTextObject *)number.the_digits_[j][i]->Copy();
  38.             Add(the_digits_[j][i]);
  39.         }
  40.         display_digits_[j] = 0;
  41.     }
  42.  
  43.     text_width_ = number.text_width_;
  44.     text_height_ = number.text_height_;
  45.  
  46.     ShowNumber (the_number_);
  47. }
  48.  
  49. // v3dNumber::~v3dNumber
  50. v3dNumber::~v3dNumber()
  51. {
  52.     for (int j = 0; j < num_digits_; ++j)
  53.         for (int i = 0; i < 10; ++i)
  54.             delete the_digits_[j][i];
  55. }
  56.  
  57. // v3dNumber::initialize
  58. //    Initializes the v3dNumber object.  Loads in the font and creates
  59. //    the number objects.  Determines the size of the entire object based on
  60. //    the text size.
  61. void
  62. v3dNumber::initialize (v3dFont *the_font)
  63. {
  64.     upper_range_ = 10;
  65.     for (int i = 1; i < num_digits_; ++i)
  66.         upper_range_ *= 10;
  67.     --upper_range_;
  68.  
  69.     // The width of the characters is set to the spacing in the font.
  70.     text_width_ = the_font->GetWidth() / 1.1;
  71.     text_height_ = the_font->GetHeight();
  72.  
  73.     // Calculate the dimensions of the bounding box.
  74.     float    buffer = text_width_ - the_font->GetWidth(),
  75.         total_width = num_digits_ * text_width_ + 2 * buffer,
  76.         total_height = text_height_ + 2 * buffer,
  77.         total_depth = the_font->GetDepth() + 2 * buffer;
  78.  
  79.     // Create the bounding box that will be the v3dNumber's v3dObjectImp.
  80.     imp_->CreateBlock(total_width, total_height, total_depth, false);
  81.     imp_->HideObject();
  82.  
  83.     // Create all the digits.
  84.     char the_text[2];
  85.     for (int j = 0; j < num_digits_; ++j) {
  86.         DigitArray digit_ary;
  87.         for (int i = 0; i < 10; ++i) {
  88.             sprintf (the_text, "%d", i);
  89.             v3dTextObject *text_obj = new v3dTextObject (the_font, the_text);
  90.             text_obj->MoveAbsolute (v3dPos ((buffer +
  91.                 text_width_ / 2.0 + j * text_width_) -
  92.                 total_width / 2.0, 0, 0));
  93.             Add (text_obj);
  94.             text_obj->Hide();
  95.             digit_ary.push_back(text_obj);
  96.         }
  97.         the_digits_.push_back(digit_ary);
  98.         // No numbers are currently being displayed.
  99.         display_digits_.push_back((v3dTextObject *)0);
  100.     }
  101. }
  102.  
  103. ///////////////////
  104. // MANIPULATORS //
  105. /////////////////
  106.  
  107. void
  108. v3dNumber::Hide()
  109. {
  110.     for (int i = 0; i < num_digits_; ++i)
  111.         if (display_digits_[i])
  112.             display_digits_[i]->Hide();
  113.     hidden_ = true;
  114. }
  115.  
  116. void
  117. v3dNumber::Show()
  118. {
  119.     for (int i = 0; i < num_digits_; ++i)
  120.         if (display_digits_[i])
  121.             display_digits_[i]->Show();
  122.     hidden_ = false;
  123. }
  124.  
  125. void
  126. v3dNumber::Disable()
  127. {
  128.     for (int i = 0; i < num_digits_; ++i)
  129.         if (display_digits_[i])
  130.             display_digits_[i]->Disable();
  131.     disabled_ = true;
  132. }
  133.  
  134. void
  135. v3dNumber::Enable()
  136. {
  137.     for (int i = 0; i < num_digits_; ++i)
  138.         if (display_digits_[i])
  139.             display_digits_[i]->Enable();
  140.     disabled_ = false;
  141. }
  142.  
  143. // v3dNumber::SetColor
  144. //    Sets the color of the object.
  145. // Parameters:
  146. //    v3dColor    new_color
  147. //        New color for the object.
  148. void
  149. v3dNumber::SetColor (const v3dColor& new_color)
  150. {
  151.     for (int i = 0; i < num_digits_; ++i)
  152.         if (display_digits_[i])
  153.             display_digits_[i]->SetColor(new_color);
  154. }
  155.  
  156. // v3dNumber::Scale
  157. //    Stretch the numbers about the given point by the given factors.
  158. void
  159. v3dNumber::Scale (const v3dVector& factors, const v3dPos& point)
  160. {
  161.     v3dObject::Scale (factors, point);
  162.  
  163.     // Scale the numbers about the point.
  164.     for (int j = 0; j < num_digits_; ++j)
  165.         for (int i = 0; i < 10; ++i)
  166.             the_digits_[j][i]->Scale (factors, point);
  167. }
  168.  
  169.  
  170. // v3dNumber::ShowNumber
  171. //    Display the number specified
  172. // Parameters:
  173. //    int        the_number
  174. //        The number to display.
  175. // Returns:
  176. //    true    if the number is displayed
  177. //    false    if the number is out-of-range
  178. bool
  179. v3dNumber::ShowNumber (int the_number)
  180. {
  181.     bool ret_val = true;
  182.  
  183.     // If the number is out of range, then return an error.
  184.     if (the_number < 0) {
  185.         the_number = 0;
  186.         ret_val = false;
  187.     } else if (the_number > upper_range_) {
  188.         the_number = upper_range_;
  189.         ret_val = false;
  190.     }
  191.  
  192.     the_number_ = the_number;
  193.  
  194.     // Hide any previously-displayed numbers and show the new number.
  195.     bool leading_digit = false;
  196.     for (int i = 0; i < num_digits_; ++i) {
  197.         if (display_digits_[i])
  198.             display_digits_[i]->Hide();
  199.         int tdiv = 1;
  200.         for (int j = 0; j < num_digits_ - i - 1; ++j)
  201.             tdiv *= 10;
  202.         int dis_num = the_number / tdiv;
  203.         if ((dis_num != 0) || leading_digit || (i == num_digits_ - 1)) {
  204.             display_digits_[i] = the_digits_[i][the_number / tdiv];
  205.             display_digits_[i]->Show();
  206.             leading_digit = true;
  207.         } else {
  208.             display_digits_[i] = 0;
  209.         }
  210.         the_number = the_number % tdiv;
  211.     }
  212.  
  213.     return ret_val;
  214. }
  215.  
  216.