Adding a "Link" object to dialog

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 19/11/2012 at 19:32, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   12 
Platform:    Mac  ;  
Language(s) :     C++  ;

---------
Hello

I am slowly working my way through C++ the C4D way. 
Working on MacOS 10.6 under XCode 4.5. So all my experiments are based on cinema4dsdk and other examples I have found here and elsewhere.

My question is:
How do I add a "LINK" field to a dialog?

Looking at some code from the NoskeWiki below all gadgets are created with "Add..." but going through the documentation I can't find any info on how to add a LINK to a dialog. I know how to put a LINK in a .res file but then have not been successful yet to actually use the data from a res file in a command/tool plugin. I did it in a Expression Plugin. Sorry, this is probably a real rookie question.....

  virtual Bool CreateLayout(void)
  {
    this->SetTitle( "Object Converter" );
 
    LONG SC_VH = BFH_SCALEFIT | BFV_SCALEFIT;
 
    GroupBorderSpace( 10, 10, 10, 10 );
    GroupSpace(5,5);
 
    AddStaticText   (DLG_LBL1, BFH_LEFT,0,0, "This plugin helps ready, clean and reduce models for export to programs ", BORDER_NONE);
    AddStaticText   (DLG_LBL2, BFH_LEFT,0,0, "like Unity. Click 'Help' for more info.", BORDER_NONE);
    AddStaticText   (DLG_LBL3, BFH_LEFT,0,0, "", BORDER_NONE);
 
    GroupBegin( DLG_GRP2,SC_VH,2,0,"actions based on object names:",BFV_GRIDGROUP_EQUALROWS );
 
      GroupBorder(BORDER_WITH_TITLE|BORDER_THIN_IN);
      GroupBorderSpace( 5, 5, 5, 5 );
      GroupSpace(3,3);
 
      //AddSeparatorH   (SC_VH);
      //AddSeparatorH   (SC_VH);
 
      AddStaticText   (DLG_LBL4, BFH_LEFT,100,0,"action:", BORDER_NONE);
      AddStaticText   (DLG_LBL5, BFH_LEFT,30,0,"text", BORDER_NONE);
 
      AddCheckbox     (DLG_CHK_DEL1,   SC_VH,100,0,"delete objects containing:");
      AddEditText     (DLG_EDIT_DEL1STR, SC_VH,30,0);
 
      AddCheckbox     (DLG_CHK_TURNON,  SC_VH,0,0,"make visible objects \" \" \" \" \" \" \" \":");
      AddEditText     (DLG_EDIT_TURNONSTR,SC_VH,0,0);

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 19/11/2012 at 23:25, xxxxxxxx wrote:

// As a member of your class, for instance  
LinkBoxGui*    myLinkBox =    NULL;  
  
// In GeDialog.CreateLayout()  
BaseContainer    tbc;  
tbc.SetBool(LINKBOX_HIDE_ICON,        FALSE);  
myLinkBox =    (LinkBoxGui* )AddCustomGui(MY_LINK_BOX_ID,CUSTOMGUI_LINKBOX,String(),BFH_SCALEFIT|BFV_SCALEFIT,0L,0L,tbc);  
if (!myLinkBox)        return FALSE;  
  
// GeDialog.Message  
//*---------------------------------------------------------------------------*  
LONG IPPDialog::Message(const BaseContainer& msg, BaseContainer& result)  
//*---------------------------------------------------------------------------*  
{  
  //GePrint(BaseContainerToString(msg));  
  LONG    mid =    msg.GetId();  
  if        (mid == BFM_DRAGRECEIVE)        return Msg_DragReceive(msg, result);  
  // ...  
  return GeDialog::Message(msg, result);  
}  
// IPPDialog.Msg_DragReceive - BFM_DRAGRECEIVE  
// - How to verify and accept what is being dropped into the LinkBox  
//*---------------------------------------------------------------------------*  
LONG IPPDialog::Msg_DragReceive(const BaseContainer& msg, BaseContainer& result)  
//*---------------------------------------------------------------------------*  
{  
  // LinkBox  
  if (!CheckDropArea(MY_LINK_BOX_ID, msg, TRUE, TRUE))    return GeDialog::Message(msg, result);  
  if (msg.GetLong(BFM_DRAG_LOST))                            return GeDialog::Message(msg, result);  
  
  LONG        cursor =    MOUSE_POINT_HAND;  
  LONG        type =        0L;  
  void*        object =    NULL;  
  BaseObject*    op =        NULL;  
  
  GetDragObject(msg, &type, &object);  
  
  if ((type == DRAGTYPE_ATOMARRAY) && (((AtomArray* )object)->GetCount() == 1L) && ((AtomArray* )object)->GetIndex(0))  
  {  
      op =    (BaseObject* )((AtomArray* )object)->GetIndex(0L);  
      // Add whatever restrictions here (such as only allowing Spline objects, for instance)  
      if (op->IsInstanceOf(Obase))    cursor = MOUSE_INSERTCOPY;  
      else  
      {  
          cursor =        MOUSE_FORBIDDEN;  
          op =            NULL;  
      }  
  }  
  
  if (msg.GetLong(BFM_DRAG_FINISHED))        myLinkBox->SetLink(op);  
  
  return SetDragDestination(cursor);  
}

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/11/2012 at 18:48, xxxxxxxx wrote:

Thanks for posting this code!

Sorry I am a bit late. Was out of town over Thanksgiving.
I'll try this out later tonight.

Peter