#pragma implementation

// -----------------------------------------------------------------------------

#include "hsubuttons.h"
#include "TSystem.h"

// -----------------------------------------------------------------------------
// *-- Author : Marcin Jaskula
// -----------------------------------------------------------------------------

ClassImp(HSUCheckButton);
ClassImp(HSUHorizontalLine);
ClassImp(HSUFileOpen);

// -----------------------------------------------------------------------------

TGLayoutHints g_FileOpenEditHints(kLHintsLeft    | kLHintsCenterY);
TGLayoutHints g_FileOpenButtonHints(kLHintsRight | kLHintsCenterY);

// -----------------------------------------------------------------------------

#define SAFE_DELETE(A)  { if(A != NULL) { delete A; A = NULL; }}
#define OPEN_FILE_SPACE 5

// -----------------------------------------------------------------------------

static const Char_t *gOpenAsTypes[] =
{
    "Macro files", "*.C",
    "HLD files",   "*.hld",
    "ROOT files",  "*.root",
    "PostScript",  "*.ps",
    "Encapsulated PostScript", "*.eps",
    "Gif files",   "*.gif",
    "All files",   "*",
     0, 0
};

// -----------------------------------------------------------------------------
//
// HSUCheckButton
//
// -----------------------------------------------------------------------------

HSUCheckButton::HSUCheckButton(const Char_t *pName, Int_t *piVal, Int_t iMask,
                            const TGWindow* pParent, Int_t iId)
                            : TGCheckButton(pParent, pName, iId)
{
    if(piVal == NULL)
        Error("HSUCheckButton", "piVal == NULL");

    m_piVal = piVal;
    m_iMask = iMask;
}

// -----------------------------------------------------------------------------

void HSUCheckButton::Reset(void)
{
    if(m_piVal == NULL)
        Error("Reset", "m_piVal == NULL");
    else
    {
        if((*m_piVal & m_iMask) != 0)
        {
            //PSetState(kButtonDown);
            PSetState(kButtonDown,kFALSE);
            fPrevState = fState;        // error in ROOT 225-03
        }
    }
}

// -----------------------------------------------------------------------------

void HSUCheckButton::SetData(void)
{
    if(m_piVal == NULL)
        Error("SetData", "m_piVal == NULL");
    else
    {
        if(fState == kButtonDown)
            *m_piVal |= m_iMask;
        else
            *m_piVal &= ~m_iMask;
    }
}

// -----------------------------------------------------------------------------
//
// HSUFileOpen
//
// -----------------------------------------------------------------------------

HSUFileOpen::HSUFileOpen(Char_t *pFileName, EFileDialogMode eMode,
                        const Char_t **pFileTypes, const TGWindow *pParent)
                        : TGHorizontalFrame(pParent, 10, 10)
{
    m_pTStrFileName = NULL;
    if((m_pFileName = pFileName) == NULL)
        Error("HSUFileOpen", "pFileName == NULL");

    m_bDeleteFileTypes = kFALSE;
    Init(eMode, pFileTypes);
}

// -----------------------------------------------------------------------------

HSUFileOpen::HSUFileOpen(TString *pFileName, EFileDialogMode eMode,
                        const Char_t **pFileTypes, const TGWindow *pParent)
                        : TGHorizontalFrame(pParent, 10, 10)
{
    m_pFileName = NULL;

    if((m_pTStrFileName = pFileName) == NULL)
        Error("HSUFileOpen", "pFileName == NULL");

    m_bDeleteFileTypes = kFALSE;
    Init(eMode, pFileTypes);
}

// -----------------------------------------------------------------------------

HSUFileOpen::HSUFileOpen(Char_t *pFileName, EFileDialogMode eMode,
                        UInt_t uiFileTypes, const TGWindow *pParent)
                        : TGHorizontalFrame(pParent, 10, 10)
{
    m_pTStrFileName = NULL;
    if((m_pFileName = pFileName) == NULL)
        Error("HSUFileOpen", "pFileName == NULL");

    InitFilesType(uiFileTypes);
    Init(eMode, m_pFileTypes);
}

// -----------------------------------------------------------------------------

HSUFileOpen::HSUFileOpen(TString *pFileName, EFileDialogMode eMode,
                        UInt_t uiFileTypes, const TGWindow *pParent)
                        : TGHorizontalFrame(pParent, 10, 10)
{
    m_pFileName = NULL;
    if((m_pTStrFileName = pFileName) == NULL)
        Error("HSUFileOpen", "pFileName == NULL");

    InitFilesType(uiFileTypes);
    Init(eMode, m_pFileTypes);
}

// -----------------------------------------------------------------------------

void HSUFileOpen::InitFilesType(UInt_t uiFileTypes)
{
Int_t i, iMax, k;

    iMax = sizeof(gOpenAsTypes) / (2 * sizeof(const Char_t *));
    m_pFileTypes = new const Char_t* [2 * iMax];
    for(i = 0; i < 2 * iMax; i++)
        m_pFileTypes[i] = NULL;

    for(k = 0, i = 0; i < iMax - 1; i++)
    {
        if((uiFileTypes & (1 << i)) == 0)
            continue;

        m_pFileTypes[k++] = gOpenAsTypes[2 * i];
        m_pFileTypes[k++] = gOpenAsTypes[2 * i + 1];
    }

    if(k == 0)
    {
        m_pFileTypes[k++] = gOpenAsTypes[2 * iMax - 4];
        m_pFileTypes[k++] = gOpenAsTypes[2 * iMax - 3];
    }

    m_pFileTypes[k++] = gOpenAsTypes[2 * iMax - 2];
    m_pFileTypes[k++] = gOpenAsTypes[2 * iMax - 1];

    m_bDeleteFileTypes = kTRUE;
}

// -----------------------------------------------------------------------------

void HSUFileOpen::Init(EFileDialogMode eMode, const Char_t **pFileTypes)
{
static const Char_t *pIconName = "folder_t.xpm";

    m_eMode      = eMode;
    m_pFileTypes = pFileTypes;

    m_pTextField = new TGTextEntry(this, (m_pTStrFileName != NULL) ?
                m_pTStrFileName->Data() : m_pFileName);
    AddFrame(m_pTextField, &g_FileOpenEditHints);

    m_pTextField->SetWidth(10 * m_pTextField->GetDefaultHeight());

    if((m_pPicture = fClient->GetPicture(pIconName)) == NULL)
        Error("HSUFileOpen", "%s not found !\n", pIconName);

    m_pButton = new TGPictureButton(this, m_pPicture, 1);
    AddFrame(m_pButton, &g_FileOpenButtonHints);
}

// -----------------------------------------------------------------------------

HSUFileOpen::~HSUFileOpen(void)
{
    SAFE_DELETE(m_pTextField);
    SAFE_DELETE(m_pButton);

    if(m_pPicture != NULL)
    {
        fClient->FreePicture(m_pPicture);
        m_pPicture = NULL;
    }

    if((m_bDeleteFileTypes) && (m_pFileTypes != NULL))
    {
        delete [] m_pFileTypes;
        m_pFileTypes = NULL;
    }
}

// -----------------------------------------------------------------------------

void HSUFileOpen::Reset(void)
{
    if(m_pTStrFileName != NULL)
        m_pTextField->SetText(m_pTStrFileName->Data());
    else
    {
        if(m_pFileName != NULL)
            m_pTextField->SetText(m_pFileName);
    }
}

// -----------------------------------------------------------------------------

void HSUFileOpen::SetData(void)
{
    if(m_pTStrFileName != NULL)
    {
        *m_pTStrFileName = m_pTextField->GetText();
        return;
    }

    if(m_pFileName == NULL)
    {
        Error("SetData", "m_pFileName == NULL");
        return;
    }

    strcpy(m_pFileName, m_pTextField->GetText());
}

// -----------------------------------------------------------------------------

TGDimension HSUFileOpen::GetDefaultSize() const
{
Int_t iWidth  = m_pTextField->GetDefaultWidth();
Int_t iHeight = m_pTextField->GetDefaultHeight();
Int_t i;

    if((i = m_pButton->GetDefaultHeight()) > iHeight)
        iHeight = i;

    iWidth += m_pButton->GetDefaultWidth() + OPEN_FILE_SPACE;

    return TGDimension(iWidth, iHeight);
}

// -----------------------------------------------------------------------------

void HSUFileOpen::Resize(UInt_t w, UInt_t h)
{
    SetWidth(w);
    SetHeight(h);
    m_pButton->Resize(m_pButton->GetDefaultSize());
    m_pTextField->Resize(w - OPEN_FILE_SPACE - m_pButton->GetDefaultWidth(), h);
}

// -----------------------------------------------------------------------------

Bool_t HSUFileOpen::ProcessMessage(Long_t lMsg, Long_t lParam1, Long_t)
{
    switch(GET_MSG(lMsg))
    {
        case kC_COMMAND:
            switch(GET_SUBMSG(lMsg))
            {
                case kCM_BUTTON:
                    if(lParam1 != 0)
                        OpenFileDialog();

                    break;

                default:
                    break;
            }

        default:
            break;
    }

    return kTRUE;
}

// -----------------------------------------------------------------------------

void HSUFileOpen::OpenFileDialog(void)
{
TGFileInfo    fInfo;
Char_t          sFile[256];
const Char_t   *pDirName;
void         *pDir;

    strcpy(sFile, m_pTextField->GetText());

    fInfo.fFilename  = sFile;
    pDirName = gSystem->DirName(sFile);

    if((pDir = gSystem->OpenDirectory(pDirName)) == NULL)
    {
        Warning("OpenFileDialog", "Directory: \"%s\" doesn't exisit", pDirName);
        fInfo.fIniDir = StrDup(".");
    }
    else
    {
        fInfo.fIniDir = StrDup(pDirName);
        gSystem->FreeDirectory(pDir);
    }

    fInfo.fFileTypes = ((m_pFileTypes == NULL)
                        ? gOpenAsTypes : m_pFileTypes);

    new TGFileDialog(fClient->GetRoot(), this, m_eMode, &fInfo);

    if(fInfo.fFilename != NULL)
        m_pTextField->SetText(fInfo.fFilename);
}

Last change: Sat May 22 13:12:55 2010
Last generated: 2010-05-22 13:12

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.