File indexing completed on 2024-04-06 12:11:52
0001 #ifndef Fireworks_TableWidget_FWTextTreeCellRenderer_h
0002 #define Fireworks_TableWidget_FWTextTreeCellRenderer_h
0003
0004 #include <cassert>
0005 #include <iostream>
0006
0007 #include "Fireworks/TableWidget/interface/FWTextTableCellRenderer.h"
0008 #include "Fireworks/TableWidget/interface/GlobalContexts.h"
0009 #include "Fireworks/TableWidget/interface/FWTabularWidget.h"
0010
0011 #include "TGTextEntry.h"
0012 #include "TGPicture.h"
0013 #include "TSystem.h"
0014 #include "TGClient.h"
0015 #include "TVirtualX.h"
0016
0017 class FWTextTreeCellRenderer : public FWTextTableCellRenderer {
0018 protected:
0019 const static int s_iconOffset = 2;
0020
0021 public:
0022 FWTextTreeCellRenderer(const TGGC* iContext = &(getDefaultGC()),
0023 const TGGC* iHighlightContext = &(getDefaultHighlightGC()),
0024 Justify iJustify = kJustifyLeft)
0025 : FWTextTableCellRenderer(iContext, iHighlightContext, iJustify),
0026 m_indentation(0),
0027 m_editor(nullptr),
0028 m_showEditor(false),
0029 m_isParent(false),
0030 m_isOpen(false),
0031 m_blackIcon(true) {}
0032
0033
0034 static const TString& coreIcondir() {
0035 static TString path = Form("%s/src/Fireworks/Core/icons/", gSystem->Getenv("CMSSW_BASE"));
0036 if (gSystem->AccessPathName(path.Data())) {
0037 assert(gSystem->Getenv("CMSSW_RELEASE_BASE"));
0038 path = Form("%s/src/Fireworks/Core/icons/", gSystem->Getenv("CMSSW_RELEASE_BASE"));
0039 }
0040
0041 return path;
0042 }
0043
0044 static const TGPicture* closedImage(bool isBlack = true) {
0045 static const TGPicture* s_picture_white = gClient->GetPicture(coreIcondir() + "arrow-white-right-blackbg.png");
0046 static const TGPicture* s_picture_black = gClient->GetPicture(coreIcondir() + "arrow-black-right.png");
0047
0048 return isBlack ? s_picture_black : s_picture_white;
0049 }
0050
0051 static const TGPicture* openedImage(bool isBlack = true) {
0052 static const TGPicture* s_picture_white = gClient->GetPicture(coreIcondir() + "arrow-white-down-blackbg.png");
0053 static const TGPicture* s_picture_black = gClient->GetPicture(coreIcondir() + "arrow-black-down.png");
0054
0055 return isBlack ? s_picture_black : s_picture_white;
0056 }
0057
0058 static int iconWidth() { return openedImage(true)->GetWidth() + s_iconOffset; }
0059
0060 virtual void setIndentation(int indentation = 0) { m_indentation = indentation; }
0061 virtual void setCellEditor(TGTextEntry* editor) { m_editor = editor; }
0062 virtual void showEditor(bool value) { m_showEditor = value; }
0063
0064 void setIsParent(bool value) { m_isParent = value; }
0065 void setIsOpen(bool value) { m_isOpen = value; }
0066 void setBlackIcon(bool value) { m_blackIcon = value; }
0067
0068 UInt_t width() const override {
0069 int w = FWTextTableCellRenderer::width() + 15 + m_indentation;
0070 if (m_isParent)
0071 w += iconWidth();
0072 return w;
0073 }
0074
0075 void draw(Drawable_t iID, int iX, int iY, unsigned int iWidth, unsigned int iHeight) override {
0076 if (m_showEditor && m_editor) {
0077
0078
0079
0080 static TGGC editGC(FWTextTableCellRenderer::getDefaultGC());
0081 editGC.SetForeground(m_editor->GetBackground());
0082 gVirtualX->FillRectangle(iID,
0083 editGC(),
0084 iX - FWTabularWidget::kTextBuffer,
0085 iY - FWTabularWidget::kTextBuffer,
0086 iWidth + 2 * FWTabularWidget::kTextBuffer,
0087 iHeight + 2 * FWTabularWidget::kTextBuffer);
0088
0089 if (iY > -2) {
0090
0091 if (!m_editor->IsMapped()) {
0092 m_editor->MapWindow();
0093 m_editor->SetFocus();
0094 }
0095 m_editor->MoveResize(iX, iY, m_editor->GetWidth(), m_editor->GetHeight());
0096 m_editor->SetCursorPosition(data().size());
0097 gClient->NeedRedraw(m_editor);
0098
0099 return;
0100 } else {
0101
0102 if (m_editor->IsMapped())
0103 m_editor->UnmapWindow();
0104 }
0105 }
0106
0107 if (selected()) {
0108 GContext_t c = highlightContext()->GetGC();
0109 gVirtualX->FillRectangle(iID,
0110 c,
0111 iX - FWTabularWidget::kTextBuffer,
0112 iY - FWTabularWidget::kTextBuffer,
0113 iWidth + 2 * FWTabularWidget::kTextBuffer,
0114 iHeight + 2 * FWTabularWidget::kTextBuffer);
0115 }
0116 int xOffset = 0;
0117 if (m_isParent) {
0118 const TGPicture* img = m_isOpen ? openedImage(m_blackIcon) : closedImage(m_blackIcon);
0119 img->Draw(iID, graphicsContext()->GetGC(), m_indentation + iX, iY + 2);
0120 xOffset += img->GetWidth() + s_iconOffset;
0121 }
0122
0123 FontMetrics_t metrics;
0124 font()->GetFontMetrics(&metrics);
0125
0126 gVirtualX->DrawString(iID,
0127 graphicsContext()->GetGC(),
0128 iX + m_indentation + xOffset,
0129 iY + metrics.fAscent,
0130 data().c_str(),
0131 data().size());
0132 }
0133
0134 private:
0135 int m_indentation;
0136 TGTextEntry* m_editor;
0137 bool m_showEditor;
0138 bool m_isParent;
0139 bool m_isOpen;
0140 bool m_blackIcon;
0141 };
0142
0143 #endif