/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Additional permissions under GNU GPL version 3 section 7 If you modify this Program, or any covered work, by linking or combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK (or a modified version of those libraries), containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the licensors of this Program grant you additional permission to convey the resulting work. Corresponding Source for a non-source form of such a combination shall include the source code for the parts of OpenSSL and IJG JPEG Library used as well as that of the covered work. You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include "HeadSpin.h" #include "plAutoUIParams.h" #include "../MaxMain/plMaxAccelerators.h" #include "hsUtils.h" #include #include "../MaxMain/plMaxNode.h" #include "plComponentBase.h" plAutoUIParam::plAutoUIParam(ParamID id, const char *name) : fID(id), fName(hsStrcpy(name)), fVisID(-1), fHeight(0) { } plAutoUIParam::~plAutoUIParam() { delete [] fName; } int plAutoUIParam::Create(HWND hDlg, IParamBlock2 *pb, int yOffset) { int size = fControlVec.size(); if (size > 0) fControlVec.clear(); int initialOffset = yOffset; int finalOffset = CreateControls(hDlg, pb, yOffset); fHeight = finalOffset - initialOffset; fhDlg = hDlg; return finalOffset; } int plAutoUIParam::ISizeControl(HWND hDlg, HWND hControl, int w, int h, int y, int x) { // Convert the dialog units to screen units RECT rect; SetRect(&rect, x, 0, w, h); MapDialogRect(hDlg, &rect); // Y is already in screen units rect.top = y; // Resize the window MoveWindow(hControl, rect.left, rect.top, rect.right, rect.bottom, FALSE); return rect.bottom; } HWND plAutoUIParam::ICreateControl(HWND hDlg, const char *className, const char *wndName, DWORD style, DWORD exStyle) { HWND hwnd = CreateWindowEx(exStyle, className, wndName, WS_VISIBLE | WS_CHILD | style, 0, 0, 0, 0, hDlg, 0/*(HMENU)fDlgItemID*/, hInstance, NULL); fControlVec.push_back(hwnd); return hwnd; } // By default the controls use a font that is too big. This fixes that. void plAutoUIParam::ISetControlFont(HWND hControl) { SendMessage(hControl, WM_SETFONT, (WPARAM)GetCOREInterface()->GetAppHFont(), TRUE); } int plAutoUIParam::IAddStaticText(HWND hDlg, int y, const char *text) { HWND hStatic = ICreateControl(hDlg, "Static", text, SS_LEFT); int height = ISizeControl(hDlg, hStatic, 100, 8, y) + 2; ISetControlFont(hStatic); return height; } int plAutoUIParam::GetParamType() { return kTypeNone; } void plAutoUIParam::Show(int yOffset) { HWND tmp; int ctrlOffset = 0; RECT rect; for (int i = 0; i < fControlVec.size(); i++) { tmp = fControlVec[i]; GetWindowRect(tmp, &rect); SetRect(&rect, 3, 0, (rect.right - rect.left) + 3, rect.bottom - rect.top); //MapDialogRect(fhDlg, &rect); // Y is already in screen units rect.top = yOffset + ctrlOffset; rect.bottom = rect.bottom + rect.top; // Resize the window MoveWindow(tmp, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); //MoveWindow(tmp, rect.left, yOffset + ctrlOffset, (rect.right - rect.left), (rect.bottom - rect.top), FALSE); ctrlOffset += (rect.bottom - rect.top) + 2; ShowWindow(tmp, SW_SHOW); } } void plAutoUIParam::Hide() { HWND tmp; for (int i = 0; i < fControlVec.size(); i++) { tmp = fControlVec[i]; ShowWindow(tmp, SW_HIDE); } } int plAutoUIParam::GetHeight() { return fHeight; } void plAutoUIParam::SetVisInfo(ParamID id, std::vector* states) { fVisID = id; fVisStates = *states; } bool plAutoUIParam::CheckVisibility(ParamID id, std::string state) { if (fVisStates.size() == 0) { return true; } else { if (fVisID == id) { if (std::find(fVisStates.begin(), fVisStates.end(), state) != fVisStates.end()) { return true; } else { return false; } } else { return false; } } } hsBool plAutoUIParam::GetBool(IParamBlock2 *pb) { hsAssert(false, "Parameter is not a bool"); return false; } float plAutoUIParam::GetFloat(IParamBlock2 *pb) { hsAssert(false, "Parameter is not a float"); return -1; } int plAutoUIParam::GetInt(IParamBlock2 *pb) { hsAssert(false, "Parameter is not an int"); return -1; } const char* plAutoUIParam::GetString(IParamBlock2 *pb) { hsAssert(false, "Parameter is not a string"); return nil; } int plAutoUIParam::GetCount(IParamBlock2 *pb) { hsAssert(false, "Parameter is not a key list"); return -1; } plKey plAutoUIParam::GetKey(IParamBlock2 *pb, int idx) { hsAssert(false, "Parameter is not a key"); return nil; } plComponentBase *plAutoUIParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(false, "Parameter is not a component"); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plCheckBoxParam::plCheckBoxParam(ParamID id, const char *name) : plAutoUIParam(id, name), fhCheck(nil) { } int plCheckBoxParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { // Create the checkbox fhCheck = ICreateControl(hDlg, "Button", fName, BS_AUTOCHECKBOX); yOffset += ISizeControl(hDlg, fhCheck, 90, 10, yOffset) + 2; // Set the check from the current value SendMessage(fhCheck, BM_SETCHECK, pb->GetInt(fID), 0); return yOffset; } bool plCheckBoxParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhCheck) { // Get the state hsBool checked = (SendMessage(fhCheck, BM_GETCHECK, 0, 0) == BST_CHECKED); // Set the state in the paramblock pb->SetValue(fID, 0, checked); return true; } } return false; } int plCheckBoxParam::GetParamType() { return kTypeBool; } hsBool plCheckBoxParam::GetBool(IParamBlock2 *pb) { return pb->GetInt(fID); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plSpinnerParam::plSpinnerParam(ParamID id, const char *name, bool isFloat) : plAutoUIParam(id, name), fIsFloat(isFloat), fhSpinner(nil) { } int plSpinnerParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName); // Create the edit box HWND hEdit = ICreateControl(hDlg, "CustEdit"); ISizeControl(hDlg, hEdit, 30, 10, yOffset); // Create the spinner (beside the edit box) fhSpinner = ICreateControl(hDlg, "SpinnerControl"); yOffset += ISizeControl(hDlg, fhSpinner, 8, 10, yOffset, 33) + 2; // Initialize the spinner ISpinnerControl *spin = GetISpinner(fhSpinner); ParamDef &def = pb->GetParamDef(fID); if (fIsFloat) { spin->SetLimits(def.range_low.f, def.range_high.f, FALSE); spin->SetValue(pb->GetFloat(fID), FALSE); spin->SetScale(0.1f); spin->LinkToEdit(hEdit, EDITTYPE_FLOAT); } else { spin->SetLimits(def.range_low.i, def.range_high.i, FALSE); spin->SetValue(pb->GetInt(fID), FALSE); spin->SetScale(1); spin->LinkToEdit(hEdit, EDITTYPE_INT); } ReleaseISpinner(spin); return yOffset; } void plSpinnerParam::Show(int yOffset) { yOffset += ISizeControl(fhDlg, fControlVec[0], 100, 8, yOffset) + 2; ISizeControl(fhDlg, fControlVec[1], 30, 10, yOffset); ISizeControl(fhDlg, fControlVec[2], 8, 10, yOffset, 33); ShowWindow(fControlVec[0], SW_SHOW); ShowWindow(fControlVec[1], SW_SHOW); ShowWindow(fControlVec[2], SW_SHOW); } bool plSpinnerParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == CC_SPINNER_CHANGE)// && HIWORD(wParam) == FALSE) { ISpinnerControl *spin = (ISpinnerControl*)lParam; HWND hSpinner = spin->GetHwnd(); if (hSpinner == fhSpinner) { // Set the state if (fIsFloat) pb->SetValue(fID, 0, spin->GetFVal()); else pb->SetValue(fID, 0, spin->GetIVal()); return true; } } return false; } int plSpinnerParam::GetParamType() { return fIsFloat ? kTypeFloat : kTypeInt; } float plSpinnerParam::GetFloat(IParamBlock2 *pb) { return (fIsFloat ? pb->GetFloat(fID) : -1); } int plSpinnerParam::GetInt(IParamBlock2 *pb) { return (!fIsFloat ? pb->GetInt(fID) : -1); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plEditParam::plEditParam(ParamID id, const char *name, int lines) : plAutoUIParam(id, name), fhEdit(nil), fLines(lines) { } int plEditParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName); // // Create the edit box // DWORD flags = ES_AUTOHSCROLL | ES_LEFT | WS_BORDER; // If this edit box has more than one line, add the multiline flags if (fLines > 1) flags |= ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN; fhEdit = ICreateControl(hDlg, "Edit", nil, flags, WS_EX_CLIENTEDGE); yOffset += ISizeControl(hDlg, fhEdit, 100, 5 + 8*fLines, yOffset) + 2; ISetControlFont(fhEdit); // Initialize the edit box SetWindowText(fhEdit, pb->GetStr(fID)); return yOffset; } void plEditParam::Show(int yOffset) { yOffset += ISizeControl(fhDlg, fControlVec[0], 100, 8, yOffset) + 2; ISizeControl(fhDlg, fControlVec[1], 100, 5 + 8*fLines, yOffset); ShowWindow(fControlVec[0], SW_SHOW); ShowWindow(fControlVec[1], SW_SHOW); } bool plEditParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND) { // Disable Max accelerators when the edit box gets focus if (HIWORD(wParam) == EN_SETFOCUS && (HWND)lParam == fhEdit) { plMaxAccelerators::Disable(); return true; } else if (HIWORD(wParam) == EN_KILLFOCUS && (HWND)lParam == fhEdit) { // Get the text from the edit and store it in the paramblock int len = GetWindowTextLength(fhEdit)+1; if (len > 1) { char *buf = TRACKED_NEW char[len]; GetWindowText(fhEdit, buf, len); pb->SetValue(fID, 0, buf); delete [] buf; } else pb->SetValue(fID, 0, ""); plMaxAccelerators::Enable(); return true; } } return false; } int plEditParam::GetParamType() { return kTypeString; } const char* plEditParam::GetString(IParamBlock2 *pb) { return pb->GetStr(fID); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// #include "plPickNode.h" plPickListParam::plPickListParam(ParamID id, const char *name, std::vector* filter) : plAutoUIParam(id, name), fhList(nil), fhAdd(nil), fhRemove(nil) { if (filter) fCIDs = *filter; } int plPickListParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the listbox fhList = ICreateControl(hDlg, "ListBox", nil, LBS_STANDARD | LBS_NOINTEGRALHEIGHT, WS_EX_CLIENTEDGE); yOffset += ISizeControl(hDlg, fhList, 100, 5+4*8, yOffset) + 2; ISetControlFont(fhList); // Create the Add button fhAdd = ICreateControl(hDlg, "Button"); ISizeControl(hDlg, fhAdd, 48, 14, yOffset, 4); SetWindowText(fhAdd, "Add..."); // Create the Remove button fhRemove = ICreateControl(hDlg, "Button"); yOffset += ISizeControl(hDlg, fhRemove, 48, 14, yOffset, 54); SetWindowText(fhRemove, "Remove"); return yOffset; } void plPickListParam::Show(int yOffset) { yOffset += ISizeControl(fhDlg, fControlVec[0], 100, 8, yOffset) + 4; yOffset += ISizeControl(fhDlg, fControlVec[1], 100, 5+4*8, yOffset) + 2; ISizeControl(fhDlg, fControlVec[2], 48, 14, yOffset, 4); ISizeControl(fhDlg, fControlVec[3], 48, 14, yOffset, 54); ShowWindow(fControlVec[0], SW_SHOW); ShowWindow(fControlVec[1], SW_SHOW); ShowWindow(fControlVec[2], SW_SHOW); ShowWindow(fControlVec[3], SW_SHOW); } bool plPickListParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_INITDIALOG) { IUpdateList(pb); return false; } if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhAdd) { plPick::Node(pb, fID, &fCIDs, false, false); IUpdateList(pb); return true; } if ((HWND)lParam == fhRemove) { int sel = SendMessage(fhList, LB_GETCURSEL, 0, 0); if (sel != -1) { pb->Delete(fID, sel, 1); IUpdateList(pb); } return true; } } return false; } void plPickListParam::IUpdateList(IParamBlock2 *pb) { SendMessage(fhList, LB_RESETCONTENT, 0, 0); int count = pb->Count(fID); for (int i = 0; i < count; i++) { INode *node = pb->GetINode(fID, 0, i); const char *name = node ? node->GetName() : ""; SendMessage(fhList, LB_ADDSTRING, 0, (LPARAM)name); } } int plPickListParam::GetParamType() { return kTypeSceneObj; } int plPickListParam::GetCount(IParamBlock2 *pb) { return pb->Count(fID); } plKey plPickListParam::GetKey(IParamBlock2 *pb, int idx) { plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID, 0, idx); if (node) return node->GetKey(); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// class plPickButtonParam; class PickNodeButtonFilter : public PickNodeCallback { public: virtual BOOL Filter(INode *node) { return TRUE; } }; static PickNodeButtonFilter gPickFilter; class PickNodeButtonMode : public PickModeCallback { public: plPickButtonParam *fParam; IParamBlock2 *fPB; BOOL HitTest(IObjParam *ip, HWND hWnd, ViewExp *vpt, IPoint2 m, int flags) { return (ip->PickNode(hWnd,m,&gPickFilter) != NULL); } BOOL Pick(IObjParam *ip, ViewExp *vpt); PickNodeCallback *GetFilter() { return &gPickFilter; } BOOL RightClick(IObjParam *ip, ViewExp *vpt); }; static PickNodeButtonMode gPickMode; plPickButtonParam::plPickButtonParam(ParamID id, const char *name, std::vector* filter, bool canConvertToType) : plAutoUIParam(id, name), fButton(nil), fCanConvertToType(canConvertToType) { if (filter) fCIDs = *filter; } int plPickButtonParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the picknode button HWND button = ICreateControl(hDlg, "CustButton"); ISizeControl(hDlg, button, 84, 12, yOffset); fButton = GetICustButton(button); // Setup the button properties fButton->SetType(CBT_CHECK); fButton->SetButtonDownNotify(TRUE); fButton->SetCheckHighlight(TRUE); fButton->SetHighlightColor(GREEN_WASH); INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); else fButton->SetText("(none)"); // Create the Remove button fhRemove = ICreateControl(hDlg, "Button"); yOffset += ISizeControl(hDlg, fhRemove, 17, 12, yOffset, 89); SetWindowText(fhRemove, "Clear"); return yOffset; } void plPickButtonParam::Show(int yOffset) { yOffset += ISizeControl(fhDlg, fControlVec[0], 100, 8, yOffset) + 4; ISizeControl(fhDlg, fControlVec[1], 84, 12, yOffset); ISizeControl(fhDlg, fControlVec[2], 17, 12, yOffset, 89); ShowWindow(fControlVec[0], SW_SHOW); ShowWindow(fControlVec[1], SW_SHOW); ShowWindow(fControlVec[2], SW_SHOW); } bool plPickButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fCIDs.size() > 0) { if (fButton->IsChecked()) { if (plPick::Node(pb, fID, &fCIDs, true, fCanConvertToType)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } } else { if (fButton->IsChecked()) { gPickMode.fParam = this; gPickMode.fPB = pb; GetCOREInterface()->SetPickMode(&gPickMode); } else { GetCOREInterface()->ClearPickMode(); } } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } void plPickButtonParam::SetPickNode(INode *node, IParamBlock2 *pb) { if (node && pb) { pb->SetValue(fID, 0, (ReferenceTarget*)node); fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } BOOL PickNodeButtonMode::Pick(IObjParam *ip, ViewExp *vpt) { INode *node = vpt->GetClosestHit(); if (node && fParam && fPB) fParam->SetPickNode(node, fPB); fParam = nil; fPB = nil; return TRUE; } BOOL PickNodeButtonMode::RightClick(IObjParam *ip, ViewExp *vpt) { if (fParam && fPB) fParam->SetPickNode(nil, nil); fParam = nil; fPB = nil; return TRUE; } int plPickButtonParam::GetParamType() { return kTypeSceneObj; } int plPickButtonParam::GetCount(IParamBlock2 *pb) { return (pb->GetReferenceTarget(fID) ? 1 : 0); } plKey plPickButtonParam::GetKey(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->GetKey(); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickComponentButtonParam::plPickComponentButtonParam(ParamID id, const char *name, std::vector* filter, bool canConvertToType) : plPickButtonParam(id, name, filter, canConvertToType) { hsAssert(filter, "Need to have a ClassID filter for pick component buttons"); } int plPickComponentButtonParam::GetParamType() { return kTypeComponent; } plComponentBase* plPickComponentButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickComponentListParam::plPickComponentListParam(ParamID id, const char *name, std::vector* filter) : plPickListParam(id, name, filter) { } bool plPickComponentListParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { return plPickListParam::IsMyMessage(msg, wParam, lParam, pb); } int plPickComponentListParam::GetParamType() { return kTypeComponent; } plComponentBase *plPickComponentListParam::GetComponent(IParamBlock2 *pb, int idx) { plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID, 0, idx); if (node) return node->ConvertToComponent(); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickActivatorButtonParam::plPickActivatorButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickActivatorButtonParam::GetParamType() { return kTypeActivator; } plComponentBase* plPickActivatorButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickActivatorButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::Activator(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickActivatorListParam::plPickActivatorListParam(ParamID id, const char *name) : plPickListParam(id, name, nil) { } bool plPickActivatorListParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhAdd) { plPick::Activator(pb, fID, false); IUpdateList(pb); return true; } } return plPickListParam::IsMyMessage(msg, wParam, lParam, pb); } int plPickActivatorListParam::GetParamType() { return kTypeActivator; } plComponentBase *plPickActivatorListParam::GetComponent(IParamBlock2 *pb, int idx) { plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID, 0, idx); if (node) return node->ConvertToComponent(); return nil; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// #include "plPickMaterialMap.h" #include "../MaxPlasmaMtls/Layers/plPlasmaMAXLayer.h" #include "../plSurface/plLayerInterface.h" #include "../plGImage/plDynamicTextMap.h" plPickDynamicTextButtonParam::plPickDynamicTextButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickDynamicTextButtonParam::GetParamType() { return kTypeDynamicText; } // temp hack to get the name of the texture map name const char* plPickDynamicTextButtonParam::GetString(IParamBlock2 *pb) { // get the plKeys based on the texture map that the DynamicText map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); return texmap->GetName(); } int plPickDynamicTextButtonParam::GetCount(IParamBlock2 *pb) { // get the plKeys based on the texture map that the DynamicText map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); // make sure that there was a texmap set if ( texmap ) { plPlasmaMAXLayer *maxLayer = plPlasmaMAXLayer::GetPlasmaMAXLayer( texmap ); if( maxLayer != nil ) { // It's one of our Plasma layer types, which means most likely it got converted. // Note: if the following count is zero, it was never converted, which most likely means // no visible geometry in the scene uses this layer. So why do you even care about it? return maxLayer->GetNumConversionTargets(); } } return 0; } plKey plPickDynamicTextButtonParam::GetKey(IParamBlock2 *pb, int idx) { // get the plKeys based on the texture map that the DynamicText map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); // make sure that there was a texmap set if ( texmap ) { plPlasmaMAXLayer *maxLayer = plPlasmaMAXLayer::GetPlasmaMAXLayer( texmap ); if( maxLayer != nil ) { // make sure the index is valid if ( idx >= 0 && idx < maxLayer->GetNumConversionTargets() ) { plLayerInterface *convertedLayer = maxLayer->GetConversionTarget(idx); if ( convertedLayer ) { plBitmap* bmap = convertedLayer->GetTexture(); // make sure there was a bitmap and that it is a DynamicTextMap if ( bmap ) return bmap->GetKey(); } } } } // otherwise we didn't find one, because of one of many reasons return nil; } int plPickDynamicTextButtonParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the picknode button HWND button = ICreateControl(hDlg, "CustButton"); ISizeControl(hDlg, button, 84, 12, yOffset); fButton = GetICustButton(button); // Setup the button properties fButton->SetType(CBT_CHECK); fButton->SetButtonDownNotify(TRUE); fButton->SetCheckHighlight(TRUE); fButton->SetHighlightColor(GREEN_WASH); Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); if (texmap) fButton->SetText(texmap->GetName()); else fButton->SetText("(none)"); // Create the Remove button fhRemove = ICreateControl(hDlg, "Button"); yOffset += ISizeControl(hDlg, fhRemove, 17, 12, yOffset, 89); SetWindowText(fhRemove, "Clear"); return yOffset; } bool plPickDynamicTextButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if ( plPickMaterialMap::PickTexmap(pb, fID) ) { Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); if (texmap) fButton->SetText(texmap->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickSingleComponentButtonParam::plPickSingleComponentButtonParam(ParamID id, const char *name, int myType, Class_ID myClassToPick ) : plPickButtonParam(id, name, nil, false) { fClassToPick = myClassToPick; fMyType = myType; } int plPickSingleComponentButtonParam::GetParamType() { return fMyType; } plComponentBase* plPickSingleComponentButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickSingleComponentButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::GenericClass(pb, fID, true,fClassToPick)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickExcludeRegionButtonParam::plPickExcludeRegionButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickExcludeRegionButtonParam::GetParamType() { return kTypeExcludeRegion; } plComponentBase* plPickExcludeRegionButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickExcludeRegionButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::ExcludeRegion(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickWaterComponentButtonParam::plPickWaterComponentButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickWaterComponentButtonParam::GetParamType() { return kTypeWaterComponent; } plComponentBase* plPickWaterComponentButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickWaterComponentButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::WaterComponent(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickSwimCurrentInterfaceButtonParam::plPickSwimCurrentInterfaceButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickSwimCurrentInterfaceButtonParam::GetParamType() { return kTypeSwimCurrentInterface; } plComponentBase* plPickSwimCurrentInterfaceButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickSwimCurrentInterfaceButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::Swim2DComponent(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickClusterComponentButtonParam::plPickClusterComponentButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickClusterComponentButtonParam::GetParamType() { return kTypeClusterComponent; } plComponentBase* plPickClusterComponentButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickClusterComponentButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::ClusterComponent(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickAnimationButtonParam::plPickAnimationButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickAnimationButtonParam::GetParamType() { return kTypeAnimation; } plComponentBase* plPickAnimationButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickAnimationButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::Animation(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickBehaviorButtonParam::plPickBehaviorButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickBehaviorButtonParam::GetParamType() { return kTypeBehavior; } plComponentBase* plPickBehaviorButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickBehaviorButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::Behavior(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickMaterialButtonParam::plPickMaterialButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickMaterialButtonParam::GetParamType() { return kTypeMaterial; } // temp hack to get the name of the texture map name const char* plPickMaterialButtonParam::GetString(IParamBlock2 *pb) { // get the plKeys based on the texture map that the DynamicText map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); return texmap->GetName(); } int plPickMaterialButtonParam::GetCount(IParamBlock2 *pb) { // get the plKeys based on the texture map that the Texture map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); // make sure that there was a texmap set if ( texmap ) { plPlasmaMAXLayer *maxLayer = plPlasmaMAXLayer::GetPlasmaMAXLayer( texmap ); if( maxLayer != nil ) { // It's one of our Plasma layer types, which means most likely it got converted. // Note: if the following count is zero, it was never converted, which most likely means // no visible geometry in the scene uses this layer. So why do you even care about it? return maxLayer->GetNumConversionTargets(); } } return 0; } plKey plPickMaterialButtonParam::GetKey(IParamBlock2 *pb, int idx) { // get the plKeys based on the texture map that the Texture map is on Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); // make sure that there was a texmap set if ( texmap ) { plPlasmaMAXLayer *maxLayer = plPlasmaMAXLayer::GetPlasmaMAXLayer( texmap ); if( maxLayer != nil ) { // make sure the index is valid if ( idx >= 0 && idx < maxLayer->GetNumConversionTargets() ) { plLayerInterface *convertedLayer = maxLayer->GetConversionTarget(idx); if ( convertedLayer ) { plBitmap* bmap = convertedLayer->GetTexture(); // make sure there was a bitmap if ( bmap ) return bmap->GetKey(); } } } } // otherwise we didn't find one, because of one of many reasons return nil; } int plPickMaterialButtonParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the picknode button HWND button = ICreateControl(hDlg, "CustButton"); ISizeControl(hDlg, button, 84, 12, yOffset); fButton = GetICustButton(button); // Setup the button properties fButton->SetType(CBT_CHECK); fButton->SetButtonDownNotify(TRUE); fButton->SetCheckHighlight(TRUE); fButton->SetHighlightColor(GREEN_WASH); Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); if (texmap) fButton->SetText(texmap->GetName()); else fButton->SetText("(none)"); // Create the Remove button fhRemove = ICreateControl(hDlg, "Button"); yOffset += ISizeControl(hDlg, fhRemove, 17, 12, yOffset, 89); SetWindowText(fhRemove, "Clear"); return yOffset; } bool plPickMaterialButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if ( plPickMaterialMap::PickTexmap(pb, fID) ) { Texmap* texmap = (Texmap*)pb->GetReferenceTarget(fID); if (texmap) fButton->SetText(texmap->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickMaterialAnimationButtonParam::plPickMaterialAnimationButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickMaterialAnimationButtonParam::GetParamType() { return kTypeMaterialAnimation; } const char* plPickMaterialAnimationButtonParam::GetString(IParamBlock2 *pb) { Mtl* texmap = (Mtl*)pb->GetReferenceTarget(fID); return texmap->GetName(); } int plPickMaterialAnimationButtonParam::GetCount(IParamBlock2 *pb) { return fKeys.Count(); } plKey plPickMaterialAnimationButtonParam::GetKey(IParamBlock2 *pb, int idx) { int kcount = fKeys.Count(); if ( idx >= 0 && idx < kcount ) { return fKeys[idx]; } return nil; } // this is in plResponderMtl.cpp extern int GetMatAnimModKey(Mtl* mtl, plMaxNodeBase* node, const char* segName, hsTArray& keys);; void plPickMaterialAnimationButtonParam::CreateKeyArray(IParamBlock2* pb) { fKeys.Reset(); Mtl* mtl = (Mtl*)pb->GetReferenceTarget(fID); int bob = GetMatAnimModKey(mtl, nil, nil, fKeys); } void plPickMaterialAnimationButtonParam::DestroyKeyArray() { fKeys.Reset(); } int plPickMaterialAnimationButtonParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the picknode button HWND button = ICreateControl(hDlg, "CustButton"); ISizeControl(hDlg, button, 84, 12, yOffset); fButton = GetICustButton(button); // Setup the button properties fButton->SetType(CBT_CHECK); fButton->SetButtonDownNotify(TRUE); fButton->SetCheckHighlight(TRUE); fButton->SetHighlightColor(GREEN_WASH); Mtl* texmap = (Mtl*)pb->GetReferenceTarget(fID); if (texmap) fButton->SetText(texmap->GetName()); else fButton->SetText("(none)"); // Create the Remove button fhRemove = ICreateControl(hDlg, "Button"); yOffset += ISizeControl(hDlg, fhRemove, 17, 12, yOffset, 89); SetWindowText(fhRemove, "Clear"); return yOffset; } bool plPickMaterialAnimationButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if ( Mtl* mtl = plPickMaterialMap::PickMaterial(0) ) { pb->SetValue(fID, 0, (ReferenceTarget*)mtl); fButton->SetText(mtl->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plDropDownListParam::plDropDownListParam(ParamID id, const char *name, std::vector* options) : plAutoUIParam(id, name), fhList(nil) { if (options) fOptions = *options; } int plDropDownListParam::CreateControls(HWND hDlg, IParamBlock2 *pb, int yOffset) { yOffset += IAddStaticText(hDlg, yOffset, fName) + 2; // Create the combobox fhList = ICreateControl(hDlg, "ComboBox", nil, CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL, WS_EX_CLIENTEDGE); ISizeControl(hDlg, fhList, 100, 100, yOffset); yOffset += 13 + 2; ISetControlFont(fhList); return yOffset + 5; } bool plDropDownListParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_INITDIALOG) { IUpdateList(pb); return false; } if ((HWND)lParam == fhList) { if (HIWORD(wParam) == CBN_SELENDOK) { int idx = ComboBox_GetCurSel(fhList); if (idx >=0 && idx < fOptions.size()) { char* buf = TRACKED_NEW char[fOptions[idx].size() + 1]; strcpy(buf, fOptions[idx].c_str()); pb->SetValue(fID, 0, buf); delete [] buf; } return true; } } return false; } void plDropDownListParam::IUpdateList(IParamBlock2 *pb) { std::string val = ""; int selection = -1; if (pb) { char* bob = pb->GetStr(fID); if (bob) val = bob; } ComboBox_ResetContent(fhList); for (int i = 0; i < fOptions.size(); i++) { const char *name = fOptions[i].c_str(); ComboBox_AddString(fhList, name); if (fOptions[i] == val) { selection = i; } } if (selection >= 0) { ComboBox_SetCurSel(fhList, selection); } } int plDropDownListParam::GetParamType() { return kTypeDropDownList; } int plDropDownListParam::GetCount(IParamBlock2 *pb) { return pb->Count(fID); } const char* plDropDownListParam::GetString(IParamBlock2 *pb) { return pb->GetStr(fID); } void plDropDownListParam::Show(int yOffset) { /* HWND tmp; int ctrlOffset = 0; RECT rect; for (int i = 0; i < fControlVec.size(); i++) { tmp = fControlVec[i]; GetWindowRect(tmp, &rect); SetRect(&rect, 3, 0, (rect.right - rect.left) + 3, rect.bottom - rect.top); //MapDialogRect(fhDlg, &rect); // Y is already in screen units rect.top = yOffset + ctrlOffset; rect.bottom = rect.bottom + rect.top; // Resize the window MoveWindow(tmp, rect.left, rect.top, rect.right - rect.left, (tmp == fhList) ? 100 : rect.bottom - rect.top, TRUE); //MoveWindow(tmp, rect.left, yOffset + ctrlOffset, (rect.right - rect.left), (rect.bottom - rect.top), FALSE); ctrlOffset += (rect.bottom - rect.top) + 2; ShowWindow(tmp, SW_SHOW); } */ yOffset += ISizeControl(fhDlg, fControlVec[0], 100, 8, yOffset) + 4; ISizeControl(fhDlg, fhList, 100, 100, yOffset); ShowWindow(fControlVec[0], SW_SHOW); ShowWindow(fControlVec[1], SW_SHOW); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// plPickGrassComponentButtonParam::plPickGrassComponentButtonParam(ParamID id, const char *name) : plPickButtonParam(id, name, nil, false) { } int plPickGrassComponentButtonParam::GetParamType() { return kTypeGrassComponent; } plComponentBase* plPickGrassComponentButtonParam::GetComponent(IParamBlock2 *pb, int idx) { hsAssert(idx == 0, "Pick buttons only have one key"); plMaxNode *node = (plMaxNode*)pb->GetReferenceTarget(fID); if (node) return node->ConvertToComponent(); return nil; } bool plPickGrassComponentButtonParam::IsMyMessage(UINT msg, WPARAM wParam, LPARAM lParam, IParamBlock2 *pb) { if (msg == WM_COMMAND && HIWORD(wParam) == BN_BUTTONUP) { if ((HWND)lParam == fButton->GetHwnd()) { if (fButton->IsChecked()) { if (plPick::GrassComponent(pb, fID, true)) { INode *node = (INode*)pb->GetReferenceTarget(fID); if (node) fButton->SetText(node->GetName()); } fButton->SetCheck(FALSE); } return true; } } // check if the reset button is hit if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED) { if ((HWND)lParam == fhRemove) { pb->SetValue(fID, 0, (ReferenceTarget*)nil); fButton->SetText("(none)"); return true; } } return false; } /////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////