filter_dlg.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: filter_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:00:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: filter_dlg.cpp,v 1000.2 2004/06/01 21:00:39 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "filter_dlg.hpp"
  41. #include "feat_table.hpp"
  42. BEGIN_NCBI_SCOPE
  43. #include "filter_dlg_.cpp"
  44. CFilterDlg::CFilterDlg()
  45.     : m_Filters(NULL)
  46. {
  47.     m_Window.reset(x_CreateWindow());
  48.     // fill in our column types
  49.     m_Column->add("(column)", 0, NULL,
  50.                   reinterpret_cast<void*> (CFeatTable::eNone));
  51.     m_Column->add("Title", 0, NULL,
  52.                   reinterpret_cast<void*>(CFeatTable::eTitle));
  53.     m_Column->add("Type", 0, NULL,
  54.                   reinterpret_cast<void*>(CFeatTable::eType));
  55.     m_Column->add("From", 0, NULL,
  56.                   reinterpret_cast<void*>(CFeatTable::eFrom));
  57.     m_Column->add("To", 0, NULL,
  58.                   reinterpret_cast<void*>(CFeatTable::eTo));
  59.     /**
  60.     m_Column->add("Intervals", 0, NULL,
  61.                   reinterpret_cast<void*>(CFeatTable::eIntervals));
  62.     **/
  63.     m_Column->add("Strand", 0, NULL,
  64.                   reinterpret_cast<void*>(CFeatTable::eStrand));
  65.     m_Column->value(0);
  66.     // fill in the modes of operation
  67.     m_Mode->add("(mode)", 0, NULL,
  68.                 reinterpret_cast<void*>(CFilter::ePass));
  69.     m_Mode->add("contains", 0, NULL,
  70.                 reinterpret_cast<void*>(CFilter::eContains));
  71.     m_Mode->add("doesn't contain", 0, NULL,
  72.                 reinterpret_cast<void*>(CFilter::eDoesntContain));
  73.     m_Mode->add("equals", 0, NULL,
  74.                 reinterpret_cast<void*>(CFilter::eEquals));
  75.     m_Mode->add("doesn't equal", 0, NULL,
  76.                 reinterpret_cast<void*>(CFilter::eDoesntEqual));
  77.     m_Mode->add("is less than", 0, NULL,
  78.                 reinterpret_cast<void*>(CFilter::eLess));
  79.     m_Mode->add("is greater than", 0, NULL,
  80.                 reinterpret_cast<void*>(CFilter::eGreater));
  81.     m_Mode->add("is less than or equal to", 0, NULL,
  82.                 reinterpret_cast<void*>(CFilter::eLessEquals));
  83.     m_Mode->add("is greater than or equal to", 0, NULL,
  84.                 reinterpret_cast<void*>(CFilter::eGreaterEquals));
  85.     m_Mode->value(0);
  86. }
  87. EDialogReturnValue CFilterDlg::Show()
  88. {
  89.     if ( !m_Window.get() ) {
  90.         return eCancel;
  91.     }
  92.     
  93.     m_RetVal = eCancel;
  94.     m_Window->show();
  95.     while (m_Window->shown()) {
  96.         Fl::wait();
  97.     }
  98.     return m_RetVal;
  99. }
  100. void CFilterDlg::SetFilters(CFilterSet* filters)
  101. {
  102.     m_Filters = filters;
  103. }
  104. void CFilterDlg::x_OnOK()
  105. {
  106.     m_Window->hide();
  107.     m_RetVal = eOK;
  108. }
  109. void CFilterDlg::x_OnDeleteCurrent()
  110. {
  111.     // if no selections, bail
  112.     int pos = m_FilterList->value();
  113.     CFilter* filter = reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  114.     if (pos == 0  ||  !filter ) {
  115.         return;
  116.     }
  117.     m_Filters->Remove(filter);
  118.     m_FilterList->remove(pos);
  119.     x_UpdateSelected();
  120. }
  121. void CFilterDlg::x_OnEnableCurrent()
  122. {
  123. }
  124. void CFilterDlg::x_OnAdd()
  125. {
  126.     if ( !m_Filters ) {
  127.         return;
  128.     }
  129.     // create a new dummy filter
  130.     static int counter;
  131.     string name = "New Filter #" + NStr::IntToString(++counter);
  132.     CRef<CFilter> filter(new CFilter(name, -1, CFilter::ePass, ""));
  133.     m_Filters->Add(filter.Release());
  134.     x_Update();
  135. }
  136. void CFilterDlg::x_Update()
  137. {
  138.     x_UpdateList();
  139.     x_UpdateSelected();
  140. }
  141. void CFilterDlg::x_UpdateList()
  142. {
  143.     // reset the browser list
  144.     m_FilterList->clear();
  145.     if (m_Filters) {
  146.         ITERATE (CFilterSet::TFilters, iter, m_Filters->GetFilters()) {
  147.             const CFilter* filter = iter->GetPointer();
  148.             void* data =
  149.                 reinterpret_cast<void*> (const_cast<CFilter*>(filter));
  150.             m_FilterList->add((*iter)->GetName().c_str(), data);
  151.         }
  152.     }
  153.     m_FilterList->redraw();
  154. }
  155. void CFilterDlg::x_UpdateSelected()
  156. {
  157.     int pos = m_FilterList->value();
  158.     // reset all items to a known position
  159.     m_FilterName->value("");
  160.     m_FilterData->value("");
  161.     m_Column->value(0);
  162.     m_Mode->value(0);
  163.     // if no selections, continue
  164.     const CFilter* filter =
  165.         reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  166.     if (pos == 0  ||  !filter ) {
  167.         //m_Window->redraw();
  168.         return;
  169.     }
  170.     // fill the text components
  171.     m_FilterName->value(filter->GetName().c_str());
  172.     m_FilterData->value(filter->GetData().c_str());
  173.     // select the correct column
  174.     {
  175.         const Fl_Menu_Item* items = m_Column->menu();
  176.         for (int i = 0;  i < m_Column->size();  ++i) {
  177.             if (reinterpret_cast<size_t> (items[i].user_data()) ==
  178.                 filter->GetColumn()) {
  179.                 m_Column->value(i);
  180.                 break;
  181.             }
  182.         }
  183.     }
  184.     // select the correct filter mode
  185.     {
  186.         const Fl_Menu_Item* items = m_Mode->menu();
  187.         for (int i = 0;  i < m_Mode->size();  ++i) {
  188.             int mode = reinterpret_cast<size_t>(items[i].user_data());
  189.             if (mode == filter->GetMode()) {
  190.                 m_Mode->value(i);
  191.                 break;
  192.             }
  193.         }
  194.     }
  195. }
  196. void CFilterDlg::x_OnChangeColumn()
  197. {
  198.     // if no selections, bail
  199.     int pos = m_FilterList->value();
  200.     CFilter* filter = reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  201.     if (pos == 0  ||  !filter ) {
  202.         return;
  203.     }
  204.     int col = reinterpret_cast<size_t>(m_Column->mvalue()->user_data());
  205.     filter->SetColumn(col);
  206. }
  207. void CFilterDlg::x_OnChangeMode()
  208. {
  209.     // if no selections, bail
  210.     int pos = m_FilterList->value();
  211.     CFilter* filter = reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  212.     if (pos == 0  ||  !filter ) {
  213.         return;
  214.     }
  215.     CFilter::EMode mode = static_cast<CFilter::EMode>
  216.         (reinterpret_cast<size_t>(m_Mode->mvalue()->user_data()));
  217.     filter->SetMode(mode);
  218. }
  219. void CFilterDlg::x_OnChangeData()
  220. {
  221.     // if no selections, bail
  222.     int pos = m_FilterList->value();
  223.     CFilter* filter = reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  224.     if (pos == 0  ||  !filter ) {
  225.         return;
  226.     }
  227.     filter->SetData(m_FilterData->value());
  228. }
  229. void CFilterDlg::x_OnChangeName()
  230. {
  231.     // if no selections, bail
  232.     int pos = m_FilterList->value();
  233.     CFilter* filter = reinterpret_cast<CFilter*> (m_FilterList->data(pos));
  234.     if (pos == 0  ||  !filter ) {
  235.         return;
  236.     }
  237.     filter->SetName(m_FilterName->value());
  238.     if (filter->GetName().empty()) {
  239.         m_FilterList->text(pos, "(no name)");
  240.     } else {
  241.         m_FilterList->text(pos, m_FilterName->value());
  242.     }
  243. }
  244. END_NCBI_SCOPE
  245. /*
  246.  * ===========================================================================
  247.  * $Log: filter_dlg.cpp,v $
  248.  * Revision 1000.2  2004/06/01 21:00:39  gouriano
  249.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  250.  *
  251.  * Revision 1.9  2004/05/21 22:27:49  gorelenk
  252.  * Added PCH ncbi_pch.hpp
  253.  *
  254.  * Revision 1.8  2004/01/06 20:16:20  dicuccio
  255.  * Dropped intervals list (temporarily) - it crowds the view
  256.  *
  257.  * Revision 1.7  2003/04/29 14:56:16  dicuccio
  258.  * Reworked FLUID-generated code: better memory management, more explicit control
  259.  * over the constructor
  260.  *
  261.  * Revision 1.6  2003/03/11 15:23:30  kuznets
  262.  * iterate -> ITERATE
  263.  *
  264.  * Revision 1.5  2003/01/13 13:10:09  dicuccio
  265.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  266.  * Moved all FLUID-generated code into namespace ncbi.
  267.  *
  268.  * Revision 1.4  2003/01/10 20:57:08  ucko
  269.  * Adjusted casts to fix compilation under at least WorkShop in 64-bit mode.
  270.  * (int isn't always as wide as void*, but size_t should be.)
  271.  *
  272.  * Revision 1.3  2003/01/09 13:51:24  dicuccio
  273.  * Convert all explicit casts -> reinterpret_cast<> / const_cast<>
  274.  *
  275.  * Revision 1.2  2003/01/08 14:58:47  dicuccio
  276.  * Major overhaul.  Added column selection dialog to base class - moved out of
  277.  * this class.  Added ability to sort columns based on menu selections.  Added
  278.  * ability to filter features based on a wide range of criteria.
  279.  *
  280.  * Revision 1.1  2002/12/30 18:49:41  dicuccio
  281.  * Initial revision
  282.  *
  283.  * ===========================================================================
  284.  */