CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

FWPathsPopup Class Reference

#include <FWPathsPopup.h>

List of all members.

Public Member Functions

void applyEditor ()
void cellClicked (Int_t iRow, Int_t iColumn, Int_t iButton, Int_t iKeyMod, Int_t iGlobalX, Int_t iGlobalY)
 FWPathsPopup (FWFFLooper *, FWGUIManager *)
virtual Bool_t HandleKey (Event_t *event)
bool & hasChanges ()
void postModule (edm::ModuleDescription const &)
void postProcessEvent (edm::Event const &, edm::EventSetup const &)
void preModule (edm::ModuleDescription const &)
void scheduleReloadEvent ()
void setup (const edm::ScheduleInfo *info)
void updateFilterString (const char *str)
void windowIsClosing ()

Private Member Functions

 ClassDef (FWPathsPopup, 0)

Private Attributes

TGTextButton * m_apply
FWGUIManagerm_guiManager
bool m_hasChanges
const edm::ScheduleInfom_info
FWFFLooperm_looper
TGLabel * m_moduleLabel
TGLabel * m_moduleName
FWPSetTableManagerm_psTable
TGTextEntry * m_search
FWTableWidgetm_tableWidget

Detailed Description

Definition at line 26 of file FWPathsPopup.h.


Constructor & Destructor Documentation

FWPathsPopup::FWPathsPopup ( FWFFLooper looper,
FWGUIManager guiManager 
)

Definition at line 37 of file FWPathsPopup.cc.

References FWDialogBuilder::addLabel(), FWDialogBuilder::addTable(), FWDialogBuilder::addTextButton(), FWDialogBuilder::addTextEntry(), FWTableWidget::body(), FWTableWidget::disableGrowInWidth(), idDealer::editor, FWDialogBuilder::expand(), FWDialogBuilder::floatLeft(), FWDialogBuilder::indent(), m_apply, FWPSetTableManager::m_editor, m_psTable, m_search, m_tableWidget, FWTableWidget::SetBackgroundColor(), FWPSetTableManager::setCellValueEditor(), FWTableWidget::SetHeaderBackgroundColor(), FWTableWidget::SetLineSeparatorColor(), and FWDialogBuilder::spaceDown().

   : TGMainFrame(gClient->GetRoot(), 400, 600),
     m_info(0),
     m_looper(looper),
     m_hasChanges(false),
     m_moduleLabel(0),
     m_moduleName(0),
     m_apply(0),
     m_psTable(new FWPSetTableManager()),
     m_guiManager(guiManager)
{
   gVirtualX->SelectInput(GetId(), kKeyPressMask | kKeyReleaseMask | kExposureMask |
                          kPointerMotionMask | kStructureNotifyMask | kFocusChangeMask |
                          kEnterWindowMask | kLeaveWindowMask);
   this->Connect("CloseWindow()","FWPathsPopup",this,"windowIsClosing()");

   FWDialogBuilder builder(this);
   builder.indent(4)
      .spaceDown(10)
      .addLabel("Filter:").floatLeft(4).expand(false, false)
      .addTextEntry("", &m_search).expand(true, false)
      .spaceDown(10)
      .addTable(m_psTable, &m_tableWidget).expand(true, true)
      .addTextButton("Apply changes and reload", &m_apply);

   FWPSetCellEditor *editor = new  FWPSetCellEditor(m_tableWidget->body(), "");
   editor->SetBackgroundColor(gVirtualX->GetPixel(kYellow-7));
   editor->SetFrameDrawn(false);
   m_psTable->setCellValueEditor(editor);
   m_psTable->m_editor->Connect("ReturnPressed()", "FWPathsPopup", this, "applyEditor()");

   m_apply->Connect("Clicked()", "FWPathsPopup", this, "scheduleReloadEvent()");
   m_apply->SetEnabled(false);
   m_search->SetEnabled(true);
   m_search->Connect("TextChanged(const char *)", "FWPathsPopup",
                     this, "updateFilterString(const char *)");
   m_tableWidget->SetBackgroundColor(0xffffff);
   m_tableWidget->SetLineSeparatorColor(0x000000);
   m_tableWidget->SetHeaderBackgroundColor(0xececec);
   m_tableWidget->Connect("cellClicked(Int_t,Int_t,Int_t,Int_t,Int_t,Int_t)",
                          "FWPathsPopup",this,
                          "cellClicked(Int_t,Int_t,Int_t,Int_t,Int_t,Int_t)");
   m_tableWidget->disableGrowInWidth();

   SetWindowName("CMSSW Configuration Editor");
   MapSubwindows();
   editor->UnmapWindow();

   Layout();
}

Member Function Documentation

void FWPathsPopup::applyEditor ( )

Proxies the applyEditor() method in the model so that it can be connected to GUI, signals.

Definition at line 107 of file FWPathsPopup.cc.

References FWPSetTableManager::applyEditor(), m_apply, and m_psTable.

Referenced by cellClicked(), and scheduleReloadEvent().

{
   bool applied = m_psTable->applyEditor();
   if (applied)
      m_apply->SetEnabled(true);
}
void FWPathsPopup::cellClicked ( Int_t  iRow,
Int_t  iColumn,
Int_t  iButton,
Int_t  iKeyMod,
Int_t  iGlobalX,
Int_t  iGlobalY 
)

Handles clicking on the table cells.

Clicking on a cell in the first column opens / closes a given node. Clicking on a cell in the second column moves the editor to that cell.

Definition at line 121 of file FWPathsPopup.cc.

References applyEditor(), FWPSetTableManager::data(), FWPSetTableManager::PSetData::editable, m_psTable, FWPSetTableManager::rowToIndex(), FWPSetTableManager::selectedColumn(), FWPSetTableManager::selectedRow(), FWPSetTableManager::setExpanded(), and FWPSetTableManager::setSelection().

{
   if (iButton != kButton1)
      return;
   

   if (iColumn == 0 || iColumn == 1)
   {
      // Save and close the previous editor, if required.
      if (m_psTable->selectedColumn() == 1
          && m_psTable->selectedRow() != -1)
      {
         int oldIndex = m_psTable->rowToIndex()[m_psTable->selectedRow()];
         FWPSetTableManager::PSetData& oldData = m_psTable->data()[oldIndex];

         if (oldData.editable)
            applyEditor();
      }

      m_psTable->setSelection(iRow, iColumn, iKeyMod);

      if (iColumn == 0)
         m_psTable->setExpanded(iRow);
   }
}
FWPathsPopup::ClassDef ( FWPathsPopup  ,
 
) [private]
Bool_t FWPathsPopup::HandleKey ( Event_t *  event) [virtual]

Handle pressing of esc.

Definition at line 91 of file FWPathsPopup.cc.

References FWPSetTableManager::cancelEditor(), m_psTable, and FWPSetTableManager::setSelection().

{
   UInt_t keysym = event->fCode;

   if (keysym == (UInt_t) gVirtualX->KeysymToKeycode(kKey_Escape))
   {
      // called from FWPSetCellEditor
      m_psTable->cancelEditor();
      m_psTable->setSelection(-1, -1, 0);
   }
   return TGMainFrame::HandleKey(event);
}
bool& FWPathsPopup::hasChanges ( ) [inline]

Definition at line 35 of file FWPathsPopup.h.

References m_hasChanges.

Referenced by FWFFLooper::duringLoop().

{ return m_hasChanges; }
void FWPathsPopup::postModule ( edm::ModuleDescription const &  description)

Gets called by CMSSW as modules are about to be processed.

Definition at line 165 of file FWPathsPopup.cc.

References m_guiManager, edm::ModuleDescription::moduleName(), and FWGUIManager::updateStatus().

Referenced by FWFFLooper::attachTo().

{
   m_guiManager->updateStatus((description.moduleName() + " processed.").c_str());
   gSystem->ProcessEvents();
}
void FWPathsPopup::postProcessEvent ( edm::Event const &  event,
edm::EventSetup const &  eventSetup 
)

Definition at line 181 of file FWPathsPopup.cc.

References FWTableWidget::body(), FWPSetTableManager::PathUpdate::choiceMaker, FWTableManagerBase::dataChanged(), FWTabularWidget::DoRedraw(), alignCSCRings::e, fwLog, i, edm::HandleBase::isValid(), fwlog::kInfo, m_guiManager, m_info, m_psTable, m_tableWidget, FWPSetTableManager::PathUpdate::passed, FWPSetTableManager::PathUpdate::pathName, pi, edm::Event::processHistory(), GlobalPosition_Frontier_DevDB_cff::tag, edm::TriggerNames::triggerName(), edm::TriggerNames::triggerNames(), patRefSel_triggerSelection_cff::triggerResults, FWPSetTableManager::update(), update, FWPSetTableManager::updateSchedule(), and FWGUIManager::updateStatus().

Referenced by FWFFLooper::attachTo().

{
   m_guiManager->updateStatus("Done processing.");
   gSystem->ProcessEvents();

   // Get the last process name from the process history:
   // this should be the one specified in the cfg file
 
   if (event.processHistory().empty()) {
      fwLog(fwlog::kInfo) << "Path GUI:: no process history available.\n";
      return;
   }
   edm::ProcessHistory::const_iterator pi = event.processHistory().end() - 1;
   std::string processName = pi->processName();
   
   // It's called TriggerResults but actually contains info on all paths
   edm::InputTag tag("TriggerResults", "", processName);
   edm::Handle<edm::TriggerResults> triggerResults;
   event.getByLabel(tag, triggerResults);

   std::vector<FWPSetTableManager::PathUpdate> pathUpdates;

   if (triggerResults.isValid())
   {
      edm::TriggerNames triggerNames = event.triggerNames(*triggerResults);
     
      for (size_t i = 0, e = triggerResults->size(); i != e; ++i)
      {
         FWPSetTableManager::PathUpdate update;
         update.pathName = triggerNames.triggerName(i);
         update.passed = triggerResults->accept(i);
         update.choiceMaker = triggerResults->index(i);
         pathUpdates.push_back(update);
      }
   }
   m_psTable->updateSchedule(m_info);
   m_psTable->update(pathUpdates);
   m_psTable->dataChanged();
   m_tableWidget->body()->DoRedraw();
}
void FWPathsPopup::preModule ( edm::ModuleDescription const &  description)

Gets called by CMSSW as we process modules.

Definition at line 173 of file FWPathsPopup.cc.

References m_guiManager, edm::ModuleDescription::moduleName(), and FWGUIManager::updateStatus().

Referenced by FWFFLooper::attachTo().

{
   m_guiManager->updateStatus(("Processing " + description.moduleName() + "...").c_str());
   gSystem->ProcessEvents();
}
void FWPathsPopup::scheduleReloadEvent ( )

Modifies the module and asks the looper to reload the event.

1. Read the configuration snippet from the GUI, 2. Use the python interpreter to parse it and get the new parameter set. 3. Notify the looper about the changes.

FIXME: implement 2 and 3.

Definition at line 234 of file FWPathsPopup.cc.

References applyEditor(), gather_cfg::cout, data, FWPSetTableManager::ModuleInfo::dirty, FWPSetTableManager::entries(), FWPSetTableManager::ModuleInfo::entry, exception, FWPSetTableManager::PSetData::label, m_apply, m_hasChanges, m_looper, m_psTable, FWPSetTableManager::modules(), FWPSetTableManager::PSetData::pset, pythonToCppException(), FWFFLooper::requestChanges(), and cms::Exception::what().

{
   applyEditor();
   try
   {
      for (size_t mni = 0, mne = m_psTable->modules().size(); mni != mne; ++mni)
      {
         FWPSetTableManager::ModuleInfo &module = m_psTable->modules()[mni];
         if (module.dirty == false)
            continue;
         FWPSetTableManager::PSetData &data = m_psTable->entries()[module.entry];
         m_looper->requestChanges(data.label, data.pset);
      }
      m_hasChanges = true;
      m_apply->SetEnabled(false);
      gSystem->ExitLoop();
   }
   catch (boost::python::error_already_set)
   {
      edm::pythonToCppException("Configuration");
      Py_Finalize();
   }
   catch (cms::Exception &exception)
   {
      std::cout << exception.what() << std::endl;
   }
   // Return control to the FWFFLooper so that it can decide what to do next.
}
void FWPathsPopup::setup ( const edm::ScheduleInfo info)

Finish the setup of the GUI

Definition at line 157 of file FWPathsPopup.cc.

References info, and m_info.

Referenced by FWFFLooper::startingNewLoop().

{
   assert(info);
   m_info = info;
}
void FWPathsPopup::updateFilterString ( const char *  str)
void FWPathsPopup::windowIsClosing ( )

Definition at line 31 of file FWPathsPopup.cc.

{
   UnmapWindow();
   DontCallClose();
}

Member Data Documentation

TGTextButton* FWPathsPopup::m_apply [private]

Definition at line 55 of file FWPathsPopup.h.

Referenced by applyEditor(), FWPathsPopup(), and scheduleReloadEvent().

Definition at line 59 of file FWPathsPopup.h.

Referenced by postModule(), postProcessEvent(), and preModule().

Definition at line 50 of file FWPathsPopup.h.

Referenced by hasChanges(), and scheduleReloadEvent().

Definition at line 45 of file FWPathsPopup.h.

Referenced by postProcessEvent(), and setup().

Definition at line 48 of file FWPathsPopup.h.

Referenced by scheduleReloadEvent().

TGLabel* FWPathsPopup::m_moduleLabel [private]

Definition at line 52 of file FWPathsPopup.h.

TGLabel* FWPathsPopup::m_moduleName [private]

Definition at line 53 of file FWPathsPopup.h.

TGTextEntry* FWPathsPopup::m_search [private]

Definition at line 58 of file FWPathsPopup.h.

Referenced by FWPathsPopup().

Definition at line 57 of file FWPathsPopup.h.

Referenced by FWPathsPopup(), and postProcessEvent().