小型工具栏【1】案例实战:可停靠【2】的工具栏设计与实现
在软件开发中,工具栏是一个常见的界面元素,它为用户提供了一系列常用的操作按钮【3】。在Smalltalk【4】语言中,我们可以利用其强大的面向对象【5】特性来设计一个可停靠的工具栏。本文将围绕这一主题,通过一个案例实战,展示如何使用Smalltalk语言实现一个可停靠的工具栏。
Smalltalk简介
Smalltalk是一种高级编程语言,以其简洁、优雅和面向对象的特点而闻名。它由Alan Kay在1970年代初期设计,旨在提供一个易于学习和使用的编程环境。Smalltalk语言具有动态类型【6】、垃圾回收【7】、动态绑定等特性,非常适合于快速原型设计【8】和开发。
可停靠工具栏设计
1. 需求分析【9】
在实现可停靠工具栏之前,我们需要明确以下需求:
- 工具栏应包含多个操作按钮,如保存、删除、新建等。
- 工具栏可以停靠在窗口的顶部、底部、左侧或右侧。
- 工具栏的位置【10】可以动态调整,用户可以自由拖动工具栏到新的位置。
- 工具栏应具有最小化【11】和最大化【12】功能。
2. 设计思路
为了实现上述需求,我们可以采用以下设计思路:
- 使用Smalltalk的图形界面库【13】(如Squeak的Pharo)来创建工具栏和按钮。
- 定义一个工具栏类,该类包含按钮的集合和停靠位置信息。
- 实现拖动功能【14】,允许用户将工具栏拖动到新的位置。
- 实现最小化和最大化功能,调整工具栏的显示状态【15】。
实现代码
以下是一个简单的可停靠工具栏实现示例:
```smalltalk
| toolbar window buttons |
Class <> define: initialize [
"Initialize the toolbar and window"
window := Window new
toolbar := Toolbar new
buttons := [
Button new text: 'Save' action: [ self save ],
Button new text: 'Delete' action: [ self delete ],
Button new text: 'New' action: [ self new ]
]
toolbar addButtons: buttons
window add: toolbar
window open
]
Class <> define: save [
"Save action"
Transcript show: 'Save action performed'
]
Class <> define: delete [
"Delete action"
Transcript show: 'Delete action performed'
]
Class <> define: new [
"New action"
Transcript show: 'New action performed'
]
Toolbar subclass: DockableToolbar [
"A toolbar that can be docked to different sides of the window"
variable: position
classVariable: positions [
'Top', 'Bottom', 'Left', 'Right'
]
classVariable【16】: defaultPosition [ 'Top' ]
classVariable: reSize【17】Policy [ 'Fixed' ]
classVariable: minSize [ 100 50 ]
classVariable: maxSize [ 100 50 ]
classVariable: minimizeButton [ Button new text: '-' action: [ self minimize ] ]
classVariable: maximizeButton [ Button new text: '+' action: [ self maximize ] ]
classVariable: closeButton [ Button new text: 'X' action: [ self close ] ]
classVariable: buttons [
minimizeButton,
maximizeButton,
closeButton
]
classVariable: resizeButton [ Button new text: '>>' action: [ self resize ] ]
classVariable: resizeButtonVisible [ false ]
classVariable: resizeButtonPosition [ 'Right' ]
classVariable: resizeButtonSize [ 20 20 ]
classVariable: resizeButtonOffset【18】 [ 5 5 ]
classVariable: resizeButtonPadding [ 5 5 ]
classVariable: resizeButtonBorder [ 1 ]
classVariable: resizeButtonBorderColor【19】 [ Color black ]
classVariable: resizeButtonBackgroundColor [ Color white ]
classVariable: resizeButtonBorderWidth【21】 [ 1 ]
classVariable: resizeButtonBorderStyle【22】 [ 'Solid' ]
classVariable: resizeButtonCursor【24】 [ Cursor hand ]
classVariable: resizeButtonCursorOffset【26】 [ 5 5 ]
classVariable: resizeButtonCursorSize【27】 [ 20 20 ]
classVariable: resizeButtonCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorColor [ Color black ]
classVariable: resizeButtonCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]
classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]
Comments NOTHING