powerpoint listview redone

Share your advanced PureBasic knowledge/code with the community.
localmotion34
Enthusiast
Enthusiast
Posts: 665
Joined: Fri Sep 12, 2003 10:40 pm
Location: Tallahassee, Florida

powerpoint listview redone

Post by localmotion34 »

here is a redone version of my powerpoint listview gadget using buttonimagegadgets. it is now possible to have up to 10 listviews with 100 images each. its a little buggy now, and im hoping someone can look through it and tell me what is going on, especially with the setpptstate() to 2 button, where it sometimes sets the wrong listview. hope this can be useful to some people. please give me some comments or suggestions

Code: Select all

#SS_NOTIFY=256 
#SS_OWNERDRAW=$D 


UseJPEGImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 
UseTGAImageDecoder() 


Global PPL 
;- Structures and Arrays
Structure PPTinfo
  gadgetnumber.l
  scrollarea.l
  scrollareachild.l
  scrollareahandle.l
  childimages.l[100]
EndStructure
  
Dim pptLVstruct.PPTinfo(100)

rect.RECT

Structure FindWindowData 
  childwindowhandle.l  
EndStructure 

Structure handle
  hwnd.l
EndStructure 

NewList FindChild.FindWindowData()
NewList PptLVnumber.handle()

;- Procedures
Procedure.l EnumChildProc(hChild, lParam) 
  AddElement(FindChild()) 
  FindChild()\childwindowhandle= hChild 
  ProcedureReturn 1 
EndProcedure 

Dim PPTimages(500) 

Procedure PPTcallback(WindowID,message,wParam,lParam) 
  ;Shared PPL
  pptnumber=CountList(PptLVnumber())
  For a=0 To pptnumber-1
    scrollareachild=pptLVstruct(a)\scrollareachild
    scrollareachildfirstchild=GetWindow_(scrollareachild,#GW_CHILD) 
    scrollareachildnextchild=GetWindow_(scrollareachildfirstchild,#GW_HWNDNEXT) 
    scrollareachildlastchild=GetWindow_(scrollareachildfirstchild,#GW_HWNDLAST) 
    ClearList(FindChild())
    EnumChildWindows_(scrollareachild, @EnumChildProc(), 0) 
    Result=#PB_ProcessPureBasicEvents 
    Select message 
      Case #WM_COMMAND
        ResetList(FindChild()) 
        ForEach FindChild() 
          Index = ListIndex(FindChild()) 
          If lParam = FindChild()\childwindowhandle 
            Result=SendMessage_(FindChild()\childwindowhandle ,#BM_GETCHECK,0,0)
            SendMessage_(FindChild()\childwindowhandle,#BM_SETCHECK,#BST_CHECKED,0)
            ForEach FindChild() 
              If lParam <> FindChild()\childwindowhandle 
                SendMessage_(FindChild()\childwindowhandle,#BM_SETCHECK,#BST_UNCHECKED,0)
              EndIf 
            Next  
          EndIf  
        Next  
    EndSelect 
  Next 
  ProcedureReturn Result 
EndProcedure 
    
Procedure PPtListview(number,x,y,Width,Height,Imagenumber) 
  AddElement(PptLVnumber())
  LVnumber=CountList(PptLVnumber())
  Index= LVnumber-1
  If Index=number
    imagex=5
    imagewidth=Width-30 
    imageheightF.f=imagewidth*(5/7) 
    imageheightF$=StrF(imageheightF) 
    Result$ = StringField(imageheightF$, 1,".") 
    imageheight=Val(Result$) 
    imagey=0-imageheight 
    If Imagenumber>4 
      scrollheight=Imagenumber*(imageheight+10) 
    Else 
      scrollheight=600 
    EndIf 
    pptLVstruct(Index)\scrollarea=ScrollAreaGadget(#PB_Any, x,y,Width,Height, Width-20,scrollheight, 10) 
    pptLVstruct(Index)\scrollareachild=GetWindow_(GadgetID(pptLVstruct(Index)\scrollarea),#GW_CHILD)
    pptLVstruct(Index)\scrollareahandle=GadgetID(pptLVstruct(Index)\scrollarea)
    CreateImage(999,imagewidth, imageheight)
    StartDrawing(ImageOutput())
    Box(0,0,imagewidth, imageheight,#COLOR_BTNFACE)
    StopDrawing()
    For a=1 To Imagenumber 
      imagey=imagey+ 6+ imageheight 
      pptLVstruct(Index)\childimages[a]=ButtonImageGadget(#PB_Any,imagex,imagey, imagewidth, imageheight, UseImage(999)) 
      style = GetWindowLong_(GadgetID(pptLVstruct(Index)\childimages[a]), #GWL_STYLE) 
      toggleStyle = style |$1003 
      SetWindowLong_(GadgetID(pptLVstruct(Index)\childimages[a]), #GWL_STYLE, toggleStyle)
      CreateImage(a,imagewidth-10, imageheight-10) 
      StartDrawing(ImageOutput()) 
      Box(0,0,imagewidth, imageheight,RGB(228,225,227)) 
      StopDrawing() 
      SetGadgetState(pptLVstruct(Index)\childimages[a],UseImage(a)) 
    Next 
    CloseGadgetList() 
    SetWindowCallback(@PPTcallback())
    ProcedureReturn @pptLVstruct(Index)
  EndIf 
EndProcedure 
    
Procedure GetPPTstate(PPTlistview) 
  scrollareachild=pptLVstruct(PPTlistview)\scrollareachild
  ClearList(FindChild())
  EnumChildWindows_(scrollareachild, @EnumChildProc(), 0)
  ResetList(FindChild()) 
  While NextElement(FindChild()) 
    Index = ListIndex(FindChild()) 
    If SendMessage_(FindChild()\childwindowhandle,#BM_GETCHECK,0,0)=#BST_CHECKED
      ProcedureReturn Index+1 
      Break 
    Else 
    EndIf 
  Wend 
EndProcedure 
    
Procedure SetPPTstate(PPTlistview,item,State) 
  scrollareachild=pptLVstruct(PPTlistview)\scrollareachild
  ClearList(FindChild())
  EnumChildWindows_(scrollareachild, @EnumChildProc(), 0)
  If State =0 
    ResetList(FindChild()) 
    While NextElement(FindChild()) 
      SendMessage_(FindChild()\childwindowhandle,#BM_SETCHECK,#BST_UNCHECKED,0)
    Wend 
  ElseIf State=1 
    ResetList(FindChild()) 
    ForEach FindChild()
      SendMessage_(FindChild()\childwindowhandle,#BM_SETCHECK,#BST_UNCHECKED,0)
    Next 
    SelectElement(FindChild(),item-1)
    SendMessage_(FindChild()\childwindowhandle,#BM_SETCHECK,#BST_CHECKED,0)
  EndIf 
EndProcedure 
    
Procedure AddPPTitem(PPTlistview,optionalimage) 
  scrollarea=pptLVstruct(PPTlistview)\scrollarea
  scrollareachild=GetWindow_(GadgetID(pptLVstruct(PPTlistview)\scrollarea),#GW_CHILD)
  ClearList(FindChild())
  EnumChildWindows_(scrollareachild, @EnumChildProc(), 0)
  numberimages=CountList(FindChild()) 
  AddElement(FindChild()) 
  imagex=5 
  Width=GadgetWidth(scrollarea) 
  y=GadgetY(pptLVstruct(PPTlistview)\childimages[numberimages]) 
  imagewidth=Width-30 
  imageheightF.f=imagewidth*(5/7) 
  imageheightF$=StrF(imageheightF) 
  Result$ = StringField(imageheightF$, 1,".") 
  imageheight=Val(Result$) 
  imagey=y+imageheight+5 
  CreateImage(999,imagewidth, imageheight)
  StartDrawing(ImageOutput())
  Box(0,0,imagewidth, imageheight,#COLOR_BTNFACE)
  StopDrawing()
  OpenGadgetList(scrollarea) 
  pptLVstruct(PPTlistview)\childimages[numberimages+1]=ButtonImageGadget(#PB_Any,imagex,imagey, imagewidth, imageheight, UseImage(999)) 
  style = GetWindowLong_(GadgetID(pptLVstruct(PPTlistview)\childimages[numberimages+1]), #GWL_STYLE) 
  toggleStyle = style |$1003 
  SetWindowLong_(GadgetID(pptLVstruct(PPTlistview)\childimages[numberimages+1]), #GWL_STYLE, toggleStyle)
  If CreateImage(numberimages+1,imagewidth-10, imageheight-10) 
    StartDrawing(ImageOutput()) 
    Box(0,0,imagewidth, imageheight,RGB(228,225,227)) 
    StopDrawing() 
    SetGadgetState(pptLVstruct(PPTlistview)\childimages[numberimages+1],UseImage(numberimages+1)) 
  EndIf 
  CloseGadgetList() 
  If numberimages>4 
    scrollheight=(numberimages+1)*(imageheight+10) 
    SetGadgetAttribute(scrollarea,#PB_ScrollArea_InnerHeight,scrollheight) 
  EndIf 
  If optionalimage <> 0 Or optionalimage <>#Null 
    numberimages=CountList(FindChild()) 
    imagewidth=GadgetWidth(PPTimages(numberimages+1)) 
    imageheight=GadgetHeight(PPTimages(numberimages+1)) 
    ResizeImage(optionalimage,imagewidth,imageheight) 
    SetGadgetState(pptLVstruct(PPTlistview)\childimages[numberimages+1],UseImage(optionalimage)) 
  EndIf 
EndProcedure 
    
Procedure CountPPTitems(PPTlistview) 
  scrollareachild=GetWindow_(GadgetID(pptLVstruct(PPTlistview)\scrollarea),#GW_CHILD)
  ClearList(FindChild())
  EnumChildWindows_(scrollareachild, @EnumChildProc(), 0)
  itemcount=CountList(FindChild()) 
  ProcedureReturn itemcount 
EndProcedure 
    
Procedure DeletePPTitem(PPTlistview,item) 
EndProcedure 
    
Procedure SetPPTitemImage(PPTlistview,item,Image) 
  scrollareachild=pptLVstruct(PPTlistview)\scrollareachild
  ClearList(FindChild())
  EnumChildWindows_(scrollareachild, @EnumChildProc(), 0)
  numberimages=CountList(FindChild()) 
  imagewidth=GadgetWidth(pptLVstruct(PPTlistview)\childimages[numberimages]) 
  imageheight=GadgetHeight(pptLVstruct(PPTlistview)\childimages[numberimages]) 
  ResizeImage(Image,imagewidth,imageheight) 
  SetGadgetState(pptLVstruct(PPTlistview)\childimages[item],UseImage(Image)) 
EndProcedure 
    
Procedure GetPPTitemImage(PPTlistview,item) 
  If item=0 
  Else 
    imagewidth=GadgetWidth(pptLVstruct(PPTlistview)\childimages[item]) 
    imageheightF.f=imagewidth*(5/7) 
    imageheightF$=StrF(imageheightF) 
    Result$ = StringField(imageheightF$, 1,".") 
    imageheight=Val(Result$) 
    Width=imagewidth*3 
    Height=imageheight*3 
    imagehandle=SendMessage_(GadgetID(pptLVstruct(PPTlistview)\childimages[item]),#BM_GETIMAGE,#IMAGE_BITMAP,0) 
    imagereturn=CreateImage(#PB_Any,Width,Height) 
    StartDrawing(ImageOutput()) 
    DrawImage(imagehandle,0,0,Width,Height) 
    StopDrawing() 
  EndIf 
  ProcedureReturn imagereturn 
EndProcedure 

;-Main Program
OpenWindow(0,0,0,600,600,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PPTlistview Test") 
CreateGadgetList(WindowID(0)) 
PPL=PPtListview(0,10,10,190,300,4) 
lll=PPtListview(1,10,320,190,200,3)
ButtonGadget(8,250,40,150,20,"Grab Selected Image") 
ButtonGadget(7,250,70,150,20,"Add Image To First Item") 
ButtonGadget(1,250,100,150,20,"Get PPTLv State") 
ButtonGadget(2,250,130,150,20,"Set PPTLv State To 0") 
ButtonGadget(3,250,160,150,20,"Set PPTLv State To 2") 
ButtonGadget(5,250,190,150,20,"Add PPTlv Item") 
ButtonGadget(6,250,220,150,20,"Count PPTlv Items") 
ImageGadget(4,250,250,280,210,0,#PB_Image_Border) 

;-Event Loop    
Repeat 
  Select WaitWindowEvent() 
    Case  #PB_Event_CloseWindow 
      SetWindowCallback(0)
      End 
    Case  #PB_Event_Gadget 
      Select EventGadgetID() 
        Case 1 
          State=GetPPTstate(0) 
          MessageRequester("Info","The PPT Listview State is " + Str(State)) 
        Case 2 
          SetPPTstate(0,0,0) 
        Case 3 
          SetPPTstate(0,2,1) 
        Case 5 
          AddPPTitem(0,0) 
        Case 6 
          number=CountPPTitems(0) 
          MessageRequester("Info" ,"There are" + " " + Str(number) + " "+"Items In the PPT Listview") 
        Case 7 
          Filename$ = OpenFileRequester("Choose an Image", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0) 
          If Filename$ 
            currentimage=LoadImage(#PB_Any,Filename$) 
            SetPPTitemImage(0,1,currentimage) 
          EndIf 
        Case 8 
          currentimage=GetPPTitemImage(0,GetPPTstate(0)) 
          ResizeImage(currentimage,GadgetWidth(4)-4,GadgetHeight(4)-4) 
          SetGadgetState(4,UseImage(currentimage)) 
        Case PPL 
          Debug "ok"
      EndSelect 
      
  EndSelect 
  
ForEver 
    

Code: Select all

!.WHILE status != dwPassedOut
! Invoke AllocateDrink, dwBeerAmount
!MOV Mug, Beer
!Invoke Drink, Mug, dwBeerAmount
!.endw