home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_04 / welstead / uilstdlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-13  |  5.0 KB  |  156 lines

  1. Welstead: Listing 6
  2.  
  3. // File UILSTDLG.CPP  General list box dialog class
  4.  
  5. #ifndef UILSTDLG_CPP
  6. #define UILSTDLG_CPP
  7. #define Uses_TDialog
  8. #define Uses_TButton
  9. #define Uses_TLabel
  10. #define Uses_TScrollBar
  11.  
  12. #include "uilstobj.cpp"
  13.  
  14. const DISPLAY_WIDTH = 50;
  15.  
  16. TRect display_rect (int title_len,int descr_len,
  17.    tlist_box_data *the_data_rec,
  18.    int& no_of_display_items) {
  19.    no_of_display_items = 0;
  20.    int no_of_collection_items =
  21.     (the_data_rec->item_collection)->getCount() - 1;
  22.    for (int i = 0; i <= no_of_collection_items; i++) 
  23.      if (((ttyped_data_obj *)
  24.         (the_data_rec->item_collection->
  25.          at(i)))->enabled) no_of_display_items += 1;
  26.    return the_rect(no_of_display_items,DISPLAY_WIDTH,
  27.         title_len,descr_len);
  28.    }
  29.  
  30. class tlist_dialog:public TDialog {
  31.    public:
  32.    tlist_box_data display_data_rec;
  33.    tdata_list_box *data_list_box;
  34.    int no_of_display_items;
  35.    tlist_dialog (const char *the_title,
  36.       const char *the_descr, 
  37.       tlist_box_data  *the_data_rec, 
  38.       int max_no_of_items);
  39.    virtual void getData (void *rec);
  40.       };
  41.  
  42. tlist_dialog::tlist_dialog (const char *the_title,
  43.       const char *the_descr, 
  44.       tlist_box_data *the_data_rec, 
  45.       int max_no_of_items):
  46.       TDialog (display_rect(strlen(the_title),
  47.      strlen(the_descr),the_data_rec,
  48.            no_of_display_items),the_title),
  49.       TWindowInit (&tlist_dialog::initFrame)
  50.       {
  51.       const MAX_VIEW_LENGTH = 14;
  52.       int view_length;
  53.       ushort line;
  54.       line = 3;
  55.       view_length = no_of_display_items;
  56.       if (view_length > MAX_VIEW_LENGTH) 
  57.         view_length = MAX_VIEW_LENGTH;
  58.       display_data_rec.item_collection = 
  59.         new TDataCollection (
  60.      max_no_of_items,NO_GROWTH);
  61. // Insert the_data_rec collection into display_data_rec.
  62. // Display only the enabled items from the_data_rec.
  63.       int no_of_collection_items =
  64.     (the_data_rec->item_collection)->getCount() - 1;
  65.       for (int i = 0; i <= no_of_collection_items; i++) 
  66.         {
  67.       if (((ttyped_data_obj *)((the_data_rec->
  68.             item_collection)->at(i)))->enabled)
  69.           display_data_rec.item_collection->insert
  70.           ((ttyped_data_obj *)
  71.           ((the_data_rec->item_collection)->at(i)));
  72.       if (i == the_data_rec->focused_item)
  73.          display_data_rec.focused_item =
  74.          display_data_rec.item_collection->
  75.             getCount() - 1;
  76.       }  // end for i
  77.       display_data_rec.selected_item = -1;
  78.       int box_width = zoomRect.b.x - zoomRect.a.x;
  79.       int box_height = zoomRect.b.y - zoomRect.a.y;
  80.       TRect r = TRect(box_width - 3,line - 1,
  81.         box_width - 2,line + 1 + view_length);
  82.       TScrollBar *p_control = new TScrollBar (r);
  83.       insert(p_control);
  84.       r = TRect(2,line,box_width - 5,
  85.         line + view_length);
  86.       data_list_box = new tdata_list_box(r,p_control);
  87.       data_list_box->
  88.         setData((void *) &display_data_rec);
  89.       insert(data_list_box);
  90.       r = TRect (2,line - 1,box_width - 5,line);
  91.       const label_length = 80;
  92.       char the_label[label_length];
  93.       sprintf (the_label,"~S~elect (Enter) %s: ",
  94.         the_descr);
  95.       insert (new TLabel(r,the_label,data_list_box));
  96.       r = TRect (box_width/2 - 9,box_height - 3,
  97.         box_width/2 + 9,box_height - 1);
  98.       insert (new TButton(r,"E~x~it (Esc)",cmCancel,
  99.         bfNormal));
  100.       // Select the list box as the focused view:
  101.       data_list_box->select();
  102.       }  // End constructor
  103.  
  104. void tlist_dialog::getData (void *rec) {
  105.       data_list_box->getData (&display_data_rec);
  106.       ((tlist_box_data *) rec)->focused_item =
  107.       ((ttyped_data_obj *) 
  108.         (display_data_rec.item_collection)->
  109.     at(display_data_rec.focused_item))->item_no - 1;
  110.       ((tlist_box_data *) rec)->selected_item =
  111.       ((ttyped_data_obj *) 
  112.         (display_data_rec.item_collection)->
  113.     at(display_data_rec.selected_item))->item_no - 1;
  114.       }
  115.  
  116. void list_dialog (const char *the_title,const char 
  117.     *the_descr, tlist_box_data *the_data_rec,
  118.     int max_no_of_items,void (*special_processing)     (tlist_box_data*,int)) {
  119.    int control = cmCancel;
  120.    int item_no = 1;
  121.    do {
  122.    the_data_rec->focused_item = item_no - 1;
  123.    tlist_dialog *dialog = new tlist_dialog(the_title,
  124.     the_descr, the_data_rec,max_no_of_items);
  125.    TApplication *the_app = (TApplication *) 
  126.     dialog->owner;
  127.    the_app->validView (dialog);
  128.    if (dialog != 0) {
  129.       control = gdesk_top->execView(dialog);
  130.       if (control != cmCancel)
  131.      {
  132.      dialog->getData(the_data_rec);
  133.      item_no = the_data_rec->selected_item + 1;
  134.      (*special_processing) (the_data_rec,item_no);
  135.      }  //End if
  136.       TObject::destroy (dialog);
  137.       } // End if
  138.    } while (control != cmCancel);
  139.    return;
  140.    }  // End function
  141.  
  142.  void standard_processing 
  143.     (tlist_box_data *the_data_rec,int item_no) {
  144.    // This is the 'usual' processing for the function 
  145.    // parameter 'special_processing' above.  
  146.    // Applications can substitute their own special 
  147.    // processing requirements.
  148.    ((ttyped_data_obj *) (the_data_rec->
  149.       item_collection)->at(item_no - 1))->
  150.       get_new_value();
  151.    return;
  152.    }  // End function
  153.  
  154. #endif
  155.  
  156.