Unit JanusWn;
{ Unit:      JanusWn
  Version:   1.00
  Purpose:   tJanusDialogWindow is a descendant of tDialogWindow that
             is able to create a (modeless) BorDlg from a standard resource
             and vice versa.
  Features:  - no wObjectB is needed
             - let the user decide at runtime whether to use BorDlgs or
               standard dialogs
  Bonus:     national language support for BorButtons: if you intend to
             have for example a german version of Borlands "&No" button
             in your program, it's that simple: just put a "&Nein"
             BorButton with id 7 in your resource and tJanusDialogWindow
             automatically loads the bitmaps for you.
  Date:      22.4.1992

  Developer: Peter Sawatzki (PS)
             Buchenhof 3, D-5800 Hagen 1, Germany
 CompuServe: 100031,3002
       FIDO: 2:245/5800.17
     BITNET: IN307@DHAFEU11

  Copyright (c) 1992 Peter Sawatzki. All Rights Reserved.
}
Interface
Uses
  WinTypes,
  WObjects,
  DialogWn;
Type
  pJanusDialogWindow = ^tJanusDialogWindow;
  tJanusDialogWindow = Object(tDialogWindow)
    useBWCC: Boolean;
    Constructor Init (aParent: pWindowsObject; aName: pChar; BorStyle: Boolean);
    Procedure SetClassName; Virtual;
    Procedure GetChildClass (Var aChildClass: tChildClass); Virtual;
    Function CreateDialogChild (Var aChildClass: tChildClass): hWnd; Virtual;
  End;

Implementation
Uses
  WinProcs,
  Strings;

Const
  BorDialog = 'BorDlg';
  BorButton = 'BorBtn';
  BorRadio  = 'BorRadio';
  BorStatic = 'BorStatic';
  BorCheck  = 'BorCheck';
  BorShade  = 'BorShade';

  bss_Group = 1; {group box}
  bss_Hdip  = 2; {horizontal border}
  bss_Vdip  = 3; {hertical border}
  bss_Hbump = 4; {horizontal speed bump}
  bss_Vbump = 5; {vertical speed bump}

Const
  BWCCInst: tHandle = tHandle(0);

Function LoadBWCC: Boolean;
Var
  aWndClass: tWndClass;
Begin
  If BWCCInst=0 Then Begin
    BWCCInst:= LoadLibrary('BWCC.DLL');
    If BWCCInst<32 Then Begin
      LoadBWCC:= False;
      BWCCInst:= 0;
      Exit
    End
  End;
  LoadBWCC:= GetClassInfo(System.hInstance,BorStatic,aWndClass)
End;

Constructor tJanusDialogWindow.Init (aParent: pWindowsObject; aName: pChar; BorStyle: Boolean);
Begin
  useBWCC:= BorStyle And LoadBWCC;
  tDialogWindow.Init(aParent, aName);
  If useBWCC Then
    If IsFlagSet(wb_MDIChild) Then
      DefaultProc:= GetProcAddress(BWCCInst,'BWCCDefMdiChildProc')
    Else
      DefaultProc:= GetProcAddress(BWCCInst,'BWCCDefWindowProc')
End;

Procedure tJanusDialogWindow.SetClassName;
Var
  pureClassName,
  tempClassName : Array[0..127] Of Char;
Begin
  tDialogWindow.SetClassName;
  With DialogAttr Do Begin
    If ClassName=Nil Then
      pureClassName[0]:= #0
    Else Begin
      If StrLIComp(ClassName,BorDialog,Length(BorDialog))=0 Then
        StrCopy(pureClassName,ClassName+Length(BorDialog)) {extract without 'BorDlg'}
      Else
        StrCopy(pureClassName,ClassName);
      StrDispose(ClassName)
    End;
    If useBWCC Then
      ClassName:= StrNew(StrCat(StrCopy(tempClassName,BorDialog),pureClassName))
    Else
      ClassName:= StrNew(pureClassName)
  End
End;

Procedure tJanusDialogWindow.GetChildClass (Var aChildClass: tChildClass);
Begin With aChildClass Do
  If useBWCC Then
    Case szClass[0] Of
      #$80: Case dwStyle And $F Of
              bs_CheckBox,
              bs_AutoCheckBox:        StrCopy(szClass,BorCheck);
              bs_RadioButton..bs_Auto3State,
              bs_AutoRadioButton:     StrCopy(szClass,BorRadio);
              bs_GroupBox:            StrCopy(szClass,BorShade);
            Else
              StrCopy(szClass,BorButton)
            End;
      #$82: StrCopy(szClass,BorStatic);
    Else
      tDialogWindow.GetChildClass(aChildClass)
    End
  Else
    If      (StrIComp(szClass,BorCheck)=0)
    Or      (StrIComp(szClass,BorRadio)=0)
    Or      (StrIComp(szClass,BorButton)=0) Then szClass[0]:= #$80
    Else If (StrIComp(szClass,BorStatic)=0) Then szClass[0]:= #$82
    Else If (StrIComp(szClass,BorShade)=0)  Then
      Case dwStyle And $F Of
        bss_Group: Begin szClass[0]:= #$80; dwStyle:= dwStyle And $FFFFFFF0 Or bs_GroupBox End;
        bss_Hdip,
        bss_Hbump,
        bss_Vdip,
        bss_Vbump: Begin szClass[0]:= #$82; dwStyle:= dwStyle And $FFFFFFF0 Or ss_BlackRect End;
      End;
    tDialogWindow.GetChildClass(aChildClass)
End;

Function tJanusDialogWindow.CreateDialogChild (Var aChildClass: tChildClass): hWnd;
Var
  aCtl: hWnd;
  BitHandle: array[0..2] of hBitmap;
Const
  bbm_SetBits = (BM_SETSTYLE+10);
Begin
  aCtl:= tDialogWindow.CreateDialogChild(aChildClass);
  If (aCtl<>0) And useBWCC Then Begin
    BitHandle[0] := LoadBitmap(hInstance,pChar(1000+aChildClass.wID)); { Normal }
    If BitHandle[0]<>0 Then Begin
      BitHandle[1] := LoadBitmap(hInstance,pChar(3000+aChildClass.wID)); { Pressed }
      BitHandle[2] := LoadBitmap(hInstance,pChar(5000+aChildClass.wID)); { Selected }
      If BitHandle[2]=0 Then BitHandle[2]:= BitHandle[0];
      If BitHandle[1]=0 Then BitHandle[1]:= BitHandle[2];
      SendMessage(aCtl,BBM_SETBITS,0,Longint(@BitHandle));
      SetWindowText(aCtl,Nil)
    End
  End;
  CreateDialogChild:= aCtl
End;
End.
