/*
* Primitive.h
* Copyright (c) 2009 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL++2000
// 2000.02.18
#pragma once
#include <sol\View.h>
#include <sol\FileStream.h>
#include <sol\Application.h>
#include <sol\ClientDC.h>
namespace SOL {
class Primitive :public View {
private:
static int stylesCount()
{
int count = 0;
styles(&count);
return count;
}
static Arg* styles(int* count = NULL) {
static Arg _styles[] = {
{XmNgroup, WS_GROUP},
{XmNdisabled, WS_DISABLED},
{XmNtabStop, WS_TABSTOP},
{XmNborderWidth, WS_BORDER},
};
if (count) {
*count = XtNumber(_styles);
}
return _styles;
}
private:
WNDPROC newProc;
WNDPROC oldProc;
protected:
void Primitive::resize(const TCHAR* label)
{
if(label && strlen(label)) {
ClientDC cdc(this);
HFONT hfont = null;
Font* font = getFont();
if (font) {
hfont = (HFONT)cdc.select(font);
}
SIZE size;
cdc.getTextExtent(label, strlen(label), &size);
int w = size.cx;
int h = size.cy;
int x, y;
getLocation(x, y);
h = cdc.getTextHeight();
reshape(x, y, w+h*2, h+10);//h*7/4);
if (hfont) cdc.select(hfont);
}
}
protected:
LRESULT defaultProc(Event& event)
{
if(oldProc) {
#ifdef STRICT
return ::CallWindowProc(oldProc,
#else
return ::CallWindowProc((FARPROC)oldProc,
#endif
getWindow(),
event.getMessage(),
event.getWParam(),
event.getLParam());
}
return View::defaultProc(event);
}
protected:
LRESULT discardInput(Event& event)
{
View* view = getParent();
if(view) {
HWND parent = view -> getWindow();
POINT p;
::GetCursorPos(&p);
::ScreenToClient(parent, &p);
switch(event.getMessage()) {
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SETFOCUS:
case WM_CHAR:
return 0L;
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
return view -> send(event.getMessage(), 0,
MAKELONG(p.x, p.y));
default:
break;
}
}
return Primitive::defaultProc(event);
}
WNDPROC getNewProc() { return newProc; }
public:
Primitive()
:View()
{
newProc = NULL;
oldProc = NULL;
}
public:
Primitive(View* parent, HWND hwnd)
:View(parent)
{
newProc = NULL;
oldProc = NULL;
setWindow(hwnd);
Application::add(hwnd, this);
setDestructable(FALSE);
}
public:
Primitive(View* parent, const TCHAR* name, Args& args)
:View(parent, name,
args.set(styles(), stylesCount())
.set(XmNstyle, (ulong)WS_CHILD|WS_VISIBLE))
{
newProc = NULL;
oldProc = NULL;
}
public:
Primitive::~Primitive()
{
}
public:
virtual Boolean create(View* parent, const TCHAR* name, Args& args)
{
return View::create(parent, name,
args.set(styles(), stylesCount())
.set(XmNstyle, (ulong)WS_CHILD|WS_VISIBLE));
}
virtual BOOL hasCallback() { return TRUE; }
virtual const TCHAR* defaultCallbackName() { return NULL; }
virtual void setSensitivity(BOOL flag) {
disable();
}
public:
void layout(int x, int y, int w, int h)
{
reshape(x, y, w, h);
}
public:
void replaceWindowProc()
{
WNDPROC proc = (WNDPROC)getWindowLong(GWL_WNDPROC);
Application& applet = Application::getApplet(NULL);
HINSTANCE hins = applet.getInstance();//Application::getInstance();
if(newProc == NULL) {
newProc = (WNDPROC)View::procedure;
oldProc = proc;
setWindowLong(GWL_WNDPROC, (LPARAM)newProc);
}
}
public:
void restoreWindowProc()
{
if(oldProc) {
setWindowLong(GWL_WNDPROC, (LONG)oldProc);
oldProc = NULL;
if(newProc) {
newProc = NULL;
}
}
}
};
}
|