SOL9 2.0 Class: GenericTreeView

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

Source code

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


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

#include <sol\Composite.h>
#include <sol\DC.h>
#include <sol\DrawableTree.h>
#include <sol\ClientDC.h>
#include <sol\PaintDC.h>
#include <sol\stdio.h>


namespace SOL {

class GenericTreeView :public Composite {
private:

    int            range;
    DrawableTree* tree;
  
protected:

    long    paint(Event& event)
    {
        PaintDC pdc(this);
        int x = getScrollPos(SB_HORZ);
        int y = getScrollPos(SB_VERT);

        if(tree) {
            HFONT hfont = NULL;
            Font* font = getDefaultFont();
            if (font) {
                hfont = pdc.select(font); 
            }
            tree -> draw(&pdc, -x, -y);
            if(range == FALSE) {
                setTreeScrollRange(&pdc);
            }
            if (hfont) {
                pdc.select(hfont);
            }

        }
        return NULL;
    }


    long    leftButtonDown(Event& event)
    {
        int  x, y;
        event.getMousePosition(x, y);
        DrawableNode* node = search(x, y);
        if(node) {
            int mx = getScrollPos(SB_HORZ);
            int my = getScrollPos(SB_VERT);
            ClientDC cdc(this);
            tree -> setActiveNode(node, &cdc, mx, my);

            callCallback(XmNbrowseSelectionCallback,
                (Key)getWindow(), node, event);
        }
        return NULL;
    }


    long    leftButtonDoubleClick(Event& event)
    {
        int  x, y;
        event.getMousePosition(x, y);
        DrawableNode* node = search(x, y);
        if(node) {
            int mx = getScrollPos(SB_HORZ);
            int my = getScrollPos(SB_VERT);
            ClientDC cdc(this);
            tree -> setActiveNode(node, &cdc, mx, my);

            callCallback(XmNdefaultActionCallback, 
                (Key)getWindow(), node, event);
        }
        return NULL;
    }

    void    setTreeScrollRange(DC* dev)
    {
        DrawableNode* root = (DrawableNode*) tree->getRoot();

        int maxx = 0;
        int maxy = 0;
        root -> getExtent(dev, &maxx, &maxy);
        maxx = maxx + tree->getLeftMargin();
        maxy = maxy + tree->getTopMargin() ;
        setScrollRange(SB_HORZ, 0, maxx);
        setScrollRange(SB_VERT, 0, maxy);

        setScrollExtent(maxx, maxy);

        range = TRUE;
    }


    long    size(Event& event) { return 0L; }

public:
    GenericTreeView(): Composite() { }

public:
    GenericTreeView(View* parent, const char* caption, Args& args)
    :Composite(parent, caption,
            args.set(XmNexStyle, (ulong)(WS_EX_CLIENTEDGE))
                .set(XmNstyle, (ulong)(WS_VISIBLE|WS_HSCROLL|WS_VSCROLL)) )
    {
        tree  = NULL;
        range = FALSE;
        addEventHandler(WM_PAINT, this,
            (Handler)&GenericTreeView::paint, NULL);
        addEventHandler(WM_LBUTTONDOWN, this,
            (Handler)&GenericTreeView::leftButtonDown, NULL);
        addEventHandler(WM_LBUTTONDBLCLK, this,
            (Handler)&GenericTreeView::leftButtonDoubleClick, NULL);
    }


public:
    virtual Boolean create(View* parent, const char* caption, Args& args)
    {
        Boolean rc = Composite::create(parent, caption,
            args.set(XmNexStyle, (ulong)(WS_EX_CLIENTEDGE))
                .set(XmNstyle, (ulong)(WS_VISIBLE|WS_HSCROLL|WS_VSCROLL)) );

        tree  = NULL;
        range = FALSE;
        addEventHandler(WM_PAINT, this,
            (Handler)&GenericTreeView::paint, NULL);
        addEventHandler(WM_LBUTTONDOWN, this,
            (Handler)&GenericTreeView::leftButtonDown, NULL);
        addEventHandler(WM_LBUTTONDBLCLK, this,
            (Handler)&GenericTreeView::leftButtonDoubleClick, NULL);

        return rc;
    }


public:
    void setTree(DrawableTree* tree1)
    {
        if(tree) delete tree;
        tree  = tree1;
        range = FALSE;

        setScrollPos(SB_HORZ, 0);
        setScrollPos(SB_VERT, 0);
    }


public:
    ~GenericTreeView()
    {
        if(tree) delete tree;
    }


public:
    void addCallback(const char* name, Object* object,
            Callback callback, void* data)
    {
        View::addCallback(name, (Key)getWindow(), object, 
            callback, data);
    }


public:
    DrawableNode* search(int x, int y)
    {
        int x1 = getScrollPos(SB_HORZ);
        int y1 = getScrollPos(SB_VERT);
        DrawableNode* node = NULL;
        if(tree) {
            ClientDC cdc(this);
            node = tree->search(&cdc, x+x1, y+y1);
        }
        return node;
    }

public:
    DrawableTree* getTree() { 
        return tree; 
    }
};

}



Last modified: 1 Feb 2012

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