rexx-things/modules/windows/oodialog/controls/ToolBar/customizeToolBar.rex

313 lines
11 KiB
Rexx
Raw Normal View History

2025-03-12 20:50:48 +00:00
/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 2013-2014 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/** customizeToolBar.rex
*
* The main purpose of this example is to show how to make the built-in
* customization features of the toolbar available to the users of your
* application. It also shows how to connect many of the event notifications of
* the toolbar.
*
*
*
*/
sd = locate()
.application~useGlobalConstDir('O')
dlg = .CustomizableToolBar~new(sd'rc\customizeToolBar.dll', IDD_TBAR, , sd'rc\customizeToolBar.h')
dlg~execute("SHOWTOP", IDI_DLG_OOREXX)
return 0
-- End of entry point.
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\
Directives, Classes, or Routines.
\* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
::requires "ooDialog.cls"
::class 'CustomizableToolBar' subclass ResDialog
::method init
expose buttons
forward class (super) continue
self~connectButtonEvent(IDB_ARROW_LEFT, 'CLICKED', onArrowLeft)
self~connectButtonEvent(IDB_ARROW_RIGHT, 'CLICKED', onArrowRight)
self~connectButtonEvent(IDB_COPY_CLIPBOARD, 'CLICKED', onCopyClipBoard)
self~connectButtonEvent(IDB_COPY_TO_FOLDER , 'CLICKED', onCopyToFolder)
self~connectButtonEvent(IDB_CUT_CLIPBOARD, 'CLICKED', onCutClipBoard)
self~connectButtonEvent(IDB_DELETE , 'CLICKED', onDelete)
self~connectButtonEvent(IDB_FAVORITES , 'CLICKED', onFavorites)
self~connectButtonEvent(IDB_FOLDER_CLOSED , 'CLICKED', onFolderClosed)
self~connectButtonEvent(IDB_MOVE_TO_FOLDER , 'CLICKED', onMoveToFolder)
self~connectButtonEvent(IDB_PASTE_CLIPBOARD, 'CLICKED', onPasteClipboard)
self~connectButtonEvent(IDB_SEARCH , 'CLICKED', onSearch)
self~connectToolBarEvent(IDC_TOOLBAR, 'BEGINADJUST')
self~connectToolBarEvent(IDC_TOOLBAR, 'ENDADJUST')
self~connectToolBarEvent(IDC_TOOLBAR, 'CUSTHELP')
self~connectToolBarEvent(IDC_TOOLBAR, 'DELETINGBUTTON')
self~connectToolBarEvent(IDC_TOOLBAR, 'GETBUTTONINFO')
self~connectToolBarEvent(IDC_TOOLBAR, 'INITCUSTOMIZE')
self~connectToolBarEvent(IDC_TOOLBAR, 'QUERYDELETE')
self~connectToolBarEvent(IDC_TOOLBAR, 'QUERYINSERT')
self~connectToolBarEvent(IDC_TOOLBAR, 'RELEASEDCAPTURE')
self~connectToolBarEvent(IDC_TOOLBAR, 'TOOLBARCHANGE')
tbb1 = .TbButton~new(IDB_ARROW_LEFT , "Previous" , "BUTTON", "ENABLED", , 1)
tbb2 = .TbButton~new(IDB_ARROW_RIGHT , "Next" , "BUTTON", "ENABLED", , 2)
tbb3 = .TbButton~new(IDB_COPY_CLIPBOARD , "Copy to clipboard" , "BUTTON", "ENABLED", , 3)
tbb5 = .TbButton~new(IDB_COPY_TO_FOLDER , "Copy to folder" , "BUTTON", "ENABLED", , 4)
tbb4 = .TbButton~new(IDB_CUT_CLIPBOARD , "Cut to clipboard" , "BUTTON", "ENABLED", , 5)
tbb6 = .TbButton~new(IDB_DELETE , "Delete" , "BUTTON", "ENABLED", , 6)
tbb7 = .TbButton~new(IDB_FAVORITES , "Favorites" , "BUTTON", "ENABLED", , 7)
tbb8 = .TbButton~new(IDB_FOLDER_CLOSED , "Close folder" , "BUTTON", "ENABLED", , 8)
tbb9 = .TbButton~new(IDB_MOVE_TO_FOLDER , "Move to folder" , "BUTTON", "ENABLED", , 9)
tbb10 = .TbButton~new(IDB_PASTE_CLIPBOARD, "Paste from clipboard" , "BUTTON", "ENABLED", , 10)
tbb11 = .TbButton~new(IDB_SEARCH , "Search, for something", "BUTTON", "ENABLED", , 11)
self~storeButtonText
buttons = .array~of(tbb1, tbb2, tbb3, tbb4, tbb5, tbb6, tbb7, tbb8, tbb9, tbb10, tbb11)
::method initDialog
expose tb buttons listBox
tb = self~newToolBar(IDC_TOOLBAR)
ret = tb~setExtendedStyle('DOUBLEBUFFER MIXEDBUTTONS')
ret = tb~setBitmapSize(.Size~new(24, 24))
self~loadImageList(tb)
self~setupListBox
-- We only add the first 3 buttons here.
btns = .array~of(buttons[1], buttons[2], buttons[3])
ret = tb~addButtons(btns)
ret = tb~setButtonText("Previous", IDB_ARROW_LEFT)
ret = tb~setButtonText("Next", IDB_ARROW_RIGHT)
ret = tb~setButtonText("Copy to clipboard", IDB_COPY_CLIPBOARD)
-- Now that the tool bar has its buttons, tell it to recalculate its size.
tb~autoSize
-- And show the tool bar.
tb~show
tb~assignFocus
::method onArrowLeft unguarded
expose tb listBox
self~add('Current text:' tb~getButtonTextEx(IDB_ARROW_LEFT))
::method onArrowRight unguarded
expose tb listBox
self~add('Current text:' tb~getButtonTextEx(IDB_ARROW_RIGHT))
::method onCopyClipboard unguarded
expose tb listBox
self~add('Current text:' tb~getButtonTextEx(IDB_COPY_CLIPBOARD))
::method onCopyToFolder unguarded
expose tb listBox
self~add('Current text:' tb~getButtonTextEx(IDB_COPY_TO_FOLDER))
::method onGetButtonInfo unguarded
expose buttons listBox
use arg id, index, textLen, tbb, toobar
self~add('TBN_GETBUTTONINFO buttonindex:' index)
if index > buttons~items then return .false
self~mergeButtons(tbb, buttons[index])
return .true
::method onQueryDelete unguarded
expose listBox
use arg id, index, tbb, toolbar
self~add('TBN_QUERYDELETE buttonindex:' index 'cmdID:' tbb~cmdID)
return .true
::method onQueryInsert unguarded
expose listBox
use arg id, index, tbb, toolbar
self~add('TBN_QUERYINSERT buttonindex:' index 'cmdID:' tbb~cmdID)
return .true
::method onReleasedCapture unguarded
expose listBox
use arg id, toolBar
self~add('NM_RELEASEDCAPTURE')
return 0
::method onBeginAdjust unguarded
expose listBox
self~add('TBN_BEGINADJUST')
return .true
::method onCustHelp unguarded
expose listBox
self~add('TBN_CUSTHELP')
return .true
::method onDeletingButton unguarded
expose listBox
use arg id, cmdID, toolbar
self~add('TNB_DELETINGBUTTON cmdID:' cmdID)
return 0
::method onInitCustomize unguarded
expose listBox
self~add('TBN_INITCUSTOMIZE')
return .true
::method onEndAdjust unguarded
expose listBox
use arg id, tb
self~add('TBN_ENDADJUST')
count = tb~buttonCount
do i = 1 to count
cmdID = tb~indexToCommand(i)
if cmdID <> 0, cmdID <> .nil then self~resetText(cmdID)
end
return 0
::method onToolBarChange unguarded
expose buttonTextSet listBox
use arg id, tb
self~add('TBN_TOOLBARCHANGE')
return 0
::method leaving
expose font imageList
imageList~release
self~deleteFont(font)
::method mergeButtons unguarded private
use strict arg button1, button2
button1~bitmapID = button2~bitmapID
button1~cmdID = button2~cmdID
button1~itemData = button2~itemData
button1~state = button2~state
button1~style = button2~style
button1~text = button2~text
::method printTbb unguarded private
use arg tbb
say 'bitmapID:' tbb~bitmapID
say 'cmdID: ' tbb~cmdID
say 'itemData:' tbb~itemData
say 'state: ' tbb~state
say 'style: ' tbb~style
say 'text: ' tbb~text
say
::method loadImageList private
expose imageList
use strict arg tb
flags = 'COLOR32 MASK'
cRef = .Image~colorRef(255, 0, 255)
ri = .ResourceImage~new(self)
imageBMP = ri~getImage(IDB_BUTTONS_IL)
imageList = .ImageList~create(.Size~new(24, 24), flags, 20, 0)
index = imageList~addMasked(imageBMP, cRef)
old = tb~setImageList(imageList)
imageBMP~release
::method setupListBox private
expose listBox font maxItems
font = self~createFontEx('Courier New')
size = self~getTextSizePX('A'~copies(50))
listBox = self~newListBox(IDC_LB_EVENTS)
listBox~setFont(font)
listBox~setWidthPX(size~width)
maxItems = listBox~clientRect~bottom % listBox~itemHeightPX
::method add unguarded private
expose listBox maxItems
use strict arg text
index = listBox~add(text)
if index + listBox~getFirstVisible >= maxItems then listBox~makeFirstVisible(index - maxItems + 1)
::method storeButtonText private
expose buttonTextTable
table = .table~new
table[.constDir[IDB_ARROW_LEFT]] = "Previous"
table[.constDir[IDB_ARROW_RIGHT]] = "Next"
table[.constDir[IDB_COPY_CLIPBOARD]] = "Copy to clipboard"
table[.constDir[IDB_COPY_TO_FOLDER]] = "Copy to folder"
table[.constDir[IDB_CUT_CLIPBOARD]] = "Cut to clipboard"
table[.constDir[IDB_DELETE]] = "Delete"
table[.constDir[IDB_FAVORITES]] = "Favorites"
table[.constDir[IDB_FOLDER_CLOSED]] = "Close folder"
table[.constDir[IDB_MOVE_TO_FOLDER]] = "Move to folder"
table[.constDir[IDB_PASTE_CLIPBOARD]] = "Paste from clipboard"
table[.constDir[IDB_SEARCH]] = "Search, for something"
buttonTextTable = table
::method resetText unguarded private
expose tb buttonTextTable
use arg cmdID
ret = tb~setButtonText(buttonTextTable[cmdID], cmdID)