//===-- TVFrame.h - Main window class for llvm-tv ----------------*- C++ -*-==//
//
// The gui for llvm-tv.
//
//===----------------------------------------------------------------------===//

#ifndef LLVMTV_TVFRAME_H
#define LLVMTV_TVFRAME_H

#include "TVSnapshotList.h"
#include "TVWindowIDs.h"
#include "wx/wx.h"
#include "wx/listctrl.h"
#include "wx/splitter.h"
#include "wx/treectrl.h"
#include "wx/notebook.h"
#include "ItemDisplayer.h"
#include <string>
#include <vector>

class TVFrame;

/// TVTreeCtrl - A specialization of wxTreeCtrl that displays a list of LLVM
/// Modules and Functions from a snapshot
///
class TVTreeCtrl : public wxTreeCtrl {
  TVFrame *myFrame;
public:
  TVTreeCtrl(wxWindow *parent, TVFrame *frame, const wxWindowID id,
             const wxPoint& pos = wxDefaultPosition,
             const wxSize& size = wxDefaultSize,
             long style = wxTR_HIDE_ROOT | wxTR_DEFAULT_STYLE
                        | wxSUNKEN_BORDER);
  virtual ~TVTreeCtrl() { }
  void AddSnapshotsToTree(TVSnapshotList*);
  void updateSnapshotList(TVSnapshotList*);
  void OnSelChanged(wxTreeEvent &event);
  TVTreeItemData *GetSelectedItemData ();

  DECLARE_EVENT_TABLE()
};

///==---------------------------------------------------------------------==///

/// TVNotebook - The class which is responsible for the "tab view"
/// containing visualizers, which appears on the right-hand side
/// of the main LLVM-TV window.
///
class TVNotebook : public wxNotebook {
  std::vector<ItemDisplayer *> displayers;
  TVTreeItemData *selectedItem;

  void displaySelectedItemOnPage (int page);
public:
  TVNotebook (wxWindow *_parent)
    : wxNotebook (_parent, LLVM_TV_NOTEBOOK) { }
  void OnSelChanged (wxNotebookEvent &event);
  bool AddItemDisplayer (ItemDisplayer *displayWidget);
  void SetSelectedItem (TVTreeItemData *newSelectedItem);

  DECLARE_EVENT_TABLE()
};

///==---------------------------------------------------------------------==///

/// TVFrame - The main application window for LLVM-TV, which is responsible
/// for displaying the tree view, tab view, status bar, and menu bar.
///
class TVApplication;
class TVFrame : public wxFrame {
  TVApplication *myApp;

  wxSplitterWindow *splitterWindow; // divides this into left & right sides
  TVTreeCtrl *myTreeCtrl;           // left side - displays tree view of module
  TVNotebook *notebook;             // right side - tab views w/ item displayers

  void Resize();
 public:
  TVFrame (TVApplication *app, const char *title);
  void OnExit (wxCommandEvent &event);
  void CallGraphView (wxCommandEvent &event);
  void CFGView (wxCommandEvent &event);
  void BUDSView (wxCommandEvent &event);
  void TDDSView (wxCommandEvent &event);
  void LocalDSView (wxCommandEvent &event);
  void CodeView (wxCommandEvent &event);
  void OnAbout (wxCommandEvent &event);
  void OnHelp (wxCommandEvent &event);
  void OnOpen (wxCommandEvent &event);
  void OnRefresh (wxCommandEvent &event);
  void CreateTree(long style, std::vector<TVSnapshot>&);
  void refreshSnapshotList ();
  void initializeSnapshotListAndView ();
  void updateDisplayedItem (TVTreeItemData *newlyDisplayedItem);

  DECLARE_EVENT_TABLE()
};

#endif // LLVMTV_TVFRAME_H
