SOL9 2.0 Class: FolderTreeDialog

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * FolderTreeDialog.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL++2000
// 2000.02.18
#pragma once

#include <sol\TextField.h>
#include <sol\Static.h>
#include <sol\PushButton.h>

#include <sol\DynamicDialog.h>
#include <sol\Font.h>
#include <sol\FolderTreeView.h>
#include <sol\ClientDC.h>


namespace SOL {

class FolderTreeDialog :public DynamicDialog {
private:
    BOOL        initialized;
    int            th;
    int            bwidth;
    Static        label;
    Font        font;
    TextField    textf;
    FolderTreeView treev;
    PushButton    ok;
    PushButton    cancel;
private:
//    long    size(Event& event);
//    void    expanding(Action& action);
//    void    selChanging(Action& action);
private:
    long size(Event& event)
    {
        LPARAM s = event.getLParam();
        
        int w = LOWORD(s);
        int h = HIWORD(s);

        label.reshape(0, 2,  w, th);
        textf.reshape(0, 2+th, w, th+8); 
        treev.reshape(0, th+th+10, w, h-th-th-10-th-20);

        ok.reshape(w-bwidth*2-20, h - th-16, bwidth, th+12);
        cancel.reshape(w-bwidth-10, h - th-16, bwidth, th+12);
    
        return 0;
    }

private:
private:
    void expanding(Action& action)
    {                             
        Event& event = action.getEvent();    
        NM_TREEVIEW* nmtreev = (NM_TREEVIEW*)event.getLParam();
        HTREEITEM htreeItem = nmtreev->itemNew.hItem;
        TCHAR dir[_MAX_PATH];
        dir[0] = Zero;
        treev.getHierachy(htreeItem, dir, _T("\\"));
        treev.findDirectories(htreeItem, dir, 0, 2);
        treev.sortChildren(htreeItem, TRUE);
    }


private:
    void selChanging(Action& action)
    {                             
        Event& event = action.getEvent();    
        NM_TREEVIEW* nmtreev = (NM_TREEVIEW*)event.getLParam();
        HTREEITEM htreeItem = nmtreev->itemNew.hItem;
        TCHAR dir[_MAX_PATH];
        dir[0] = Zero;
        treev.getHierachy(htreeItem, dir, _T("\\"));
        textf.setText(dir);
    }

public:
    FolderTreeDialog():DynamicDialog() { }

public:
    FolderTreeDialog(View* parent, 
                        const TCHAR* name, Args& args)
        :DynamicDialog(parent, name,
            args.set(XmNstyle, (ulong)WS_THICKFRAME)
                .set(XmNbackground, (COLOR_BTNFACE+1))),
        initialized(FALSE)
    {
        Args ar;
        ar.reset();
        ar.set(XmNheight, -12);
    //    ar.set(XmNTCHARSet, (ulong)SHIFTJIS_CHARSET);
    //    ar.set(XmNfaceName, "‚l‚r –¾’©");
        font.create(ar);

        ar.reset();
        label.create(this, _T("Folder"), ar);
        label.setFont(&font);

        ar.reset();
        textf.create(this, _T(""), ar);
        textf.limitText(_MAX_PATH);
        textf.setFont(&font);
        ClientDC cdc(&textf);

        HFONT pfont = (HFONT)cdc.select(&font);
        th = cdc.getTextHeight();

        SIZE size;
        TCHAR* string = _T(" OK ");
        cdc.getTextExtent(string, strlen(string), &size);                        
        cdc.select(pfont);

        bwidth = size.cx+ size.cy*2;

        ar.reset();
        ar.set(XmNexStyle, (ulong)WS_EX_CLIENTEDGE);
        ar.set(XmNstyle, (ulong)TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT);
        treev.create(this, _T(""), ar);

    // 
        treev.addCallback(XmNitemExpandingCallback, this,
                (Callback)&FolderTreeDialog::expanding, NULL);

        treev.addCallback(XmNselChangingCallback, this,
            (Callback)&FolderTreeDialog::selChanging, NULL);

        ar.reset();
        ar.set(XmNid, IDOK);
        ok.create(this, _T(" OK "), ar);
        ok.setFont(&font);

        ar.reset();
        ar.set(XmNid, IDCANCEL);
        cancel.create(this, _T("Cancel"), ar);
        cancel.setFont(&font);
        cancel.addCallback(XmNactivateCallback, this,
            (Callback)&PopupView::popdown, NULL);
    
        addEventHandler(WM_SIZE, this,
            (Handler)&FolderTreeDialog::size, NULL);

        resize();
    }

public:
    ~FolderTreeDialog() 
    { 
    }


public:
    virtual Boolean create(View* parent, 
                        const TCHAR* name, Args& args)

    {
        Boolean rc = DynamicDialog::create(parent, name,
            args.set(XmNstyle, (ulong)WS_THICKFRAME)
                .set(XmNbackground, (COLOR_BTNFACE+1)));

        initialized = FALSE;
        Args ar;
        ar.reset();
        ar.set(XmNheight, -12);
        //    ar.set(XmNTCHARSet, (ulong)SHIFTJIS_CHARSET);    
        //    ar.set(XmNfaceName, "‚l‚r –¾’©");
        font.create(ar);

        ar.reset();
        label.create(this, _T("Folder"), ar);
        label.setFont(&font);

        ar.reset();
        textf.create(this, _T(""), ar);
        textf.limitText(_MAX_PATH);
        textf.setFont(&font);

        ClientDC cdc(&textf);

        HFONT pfont = (HFONT)cdc.select(&font);
        th = cdc.getTextHeight();

        SIZE size;
        TCHAR* string = _T(" OK ");
        cdc.getTextExtent(string, strlen(string), &size);                        
        cdc.select(pfont);

        bwidth = size.cx+ size.cy*2;

        ar.reset();
        ar.set(XmNexStyle, (ulong)WS_EX_CLIENTEDGE);
        ar.set(XmNstyle, (ulong)TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT);
        treev.create(this, _T(""), ar);

    // 
        treev.addCallback(XmNitemExpandingCallback, this,
                (Callback)&FolderTreeDialog::expanding, NULL);

        treev.addCallback(XmNselChangingCallback, this,
            (Callback)&FolderTreeDialog::selChanging, NULL);

        ar.reset();
        ar.set(XmNid, IDOK);
        ok.create(this, _T(" OK "), ar);
        ok.setFont(&font);

        ar.reset();
        ar.set(XmNid, IDCANCEL);
        cancel.create(this, _T("Cancel"), ar);
        cancel.setFont(&font);
        cancel.addCallback(XmNactivateCallback, this,
            (Callback)&PopupView::popdown, NULL);
    
        addEventHandler(WM_SIZE, this,
            (Handler)&FolderTreeDialog::size, NULL);

        resize();

        return rc;
    }

public:
    int  getFolder(TCHAR* buffer, int len) 
    {
        int rc = 0;
        rc = textf.getText(buffer, len);
        return rc;
    }

public:
    void setFolder(const TCHAR* name)
    {
        textf.setText(name);
    }

public:
    void popup(Action& action)
    {
        if(initialized == FALSE) {
            capture();
            ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
            treev.buildDirTree();
            ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
            ::ReleaseCapture();

            initialized = TRUE;
        }
        disableOwner();

        raise();
        show(SW_NORMAL);
    }

public:
    void addOkCallback(Object* object,
                            Callback callback)
    {
        ok.addCallback(XmNactivateCallback, object,
                callback, NULL);
    }
};

}




Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.