/*----------------------------------------------------------------------------*/ /* */ /* 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)