BBMIG Administrador de Diseño
Introducción
BBMig es un gestor de diseño potente y flexible construida sobre la biblioteca MigLayout código abierto. Al integrar el controlador de distribución, en sus aplicaciones gráficas, puede asegurarse de que sus interfaces de usuario se ajustan al espacio de pantalla disponible en la adhesión a las limitaciones definidas para los contenedores, filas y columnas. Esto se traduce en controles GUI que son de tamaño automáticamente y posicionado dentro de la ventana, sin importar el tamaño de la ventana o de la plataforma sobre la cual se ejecuta el programa. BBMig utiliza restricciones basadas en cadena, lo que hace el código de diseño portátil, conciso, legible y fácil de implementar.
Además de controlar la disposición de los mandos, BBMig también proporciona la capacidad de escalar diseños. Esto hace que sea posible para hacer un zoom dentro y fuera de una forma similar a como los navegadores pueden hacer zoom en una página para agrandar el texto por lo que es más fácil de leer. El escalado de la disposición en el efecto aleja, disminuyendo el tamaño de las ventanas y sus controles para consumir menos espacio en la pantalla.
BBMig también ofrece el manejo opcional de la plataforma de la justificación etiqueta específica y secuenciación botón estándar. Esto simplifica la tarea de proporcionar diseños de control que son consistentes con la plataforma de destino sin tener que consultar el sistema operativo de destino o proporcionar cualquier lógica de código extra. Etiquetas, como "ayuda", "bien" Nombre, y 'cancelar' aseguran que los botones en las capturas de pantalla a continuación se colocarán de acuerdo con las directrices de la interfaz de usuario del sistema operativo de destino.
La tercera pantalla con las líneas rojas y azules punteadas muestra cómo el modo de depuración de BBMig se puede utilizar para visualizar fácilmente los límites de las células y los componentes de la rejilla del gestor de diseño, respectivamente.
Programa de Ejemplo corriendo en OS X, con el botón Ayuda a la izquierda
Programa de Ejemplo corriendo en Windows con el botón Ayuda a la derecha
Programa de Ejemplo en Modo Depuración
Los siguientes enlaces proveen información útil sobre la librería MigLayout.
Aunque el código de implementación BBJ sería ligeramente diferente, toda la información contenida en los documentos se refieren a conceptos y limitaciones de aplicación inmediata a BBMig.
Ejemplo Programa BBj
use com.basiscomponents.ui.layout.BBMigPane
use net.miginfocom.layout.PlatformDefaults
use java.util.HashMap
use java.util.Iterator
rem test code when run
rem debug = BBjAPI().TRUE
new bbmigtest(debug)
release
class public bbmigtest
field private BBjAPI API! = BBjAPI()
field private BBjNumber TRUE = BBjAPI().TRUE
field private BBjNumber FALSE = BBjAPI().FALSE
field private BBjSysGui SysGui! = BBjAPI().openSysGui("X0")
field private BBjNumber debug = BBjAPI().FALSE
field private BBjTopLevelWindow Window!
field private BBMigPane Layout!
field private BBjChildWindow cWindow!
field private BBMigPane cLayout!
field private BBjStaticText lFirstName!
field private BBjInputE iFirstName!
field private BBjStaticText lSurname!
field private BBjInputE iSurname!
field private BBjStaticText lAddress!
field private BBjInputE iAddress!
field private BBjMenuButton bOk!
field private BBjMenuButton bCancel!
field private BBjMenuButton bHelp!
field public BBjNumber ActiveResize = BBjAPI().FALSE
method public bbmigtest()
#bbmigtest(BBjAPI().FALSE())
methodend
method public bbmigtest(BBjNumber debug)
#debug = debug
if #debug then
print 'show',
rem test platforms (NOTE: setting sticks til reset or JVM re-started)
rem PlatformDefaults.setPlatform(PlatformDefaults.WINDOWS_XP)
rem PlatformDefaults.setPlatform(PlatformDefaults.MAC_OSX)
rem PlatformDefaults.setPlatform(PlatformDefaults.GNOME)
print "Platform=",
switch PlatformDefaults.getPlatform()
case PlatformDefaults.WINDOWS_XP
print "Windows",
break
case PlatformDefaults.MAC_OSX
print "Mac OS X",
break
case PlatformDefaults.GNOME
print "Gnome",
break
case default
print "Unknown",
break
swend
print " (real os=",System.getProperty("os.name"),"), Default DPI=",
: PlatformDefaults.getDefaultDPI()
else
print 'hide',
endif
#constructForm()
#show()
methodend
method public void show()
#Window!.setCallback(#Window!.ON_CLOSE, #this!, "closeWindow")
#Window!.setCallback(#Window!.ON_RESIZE, #this!, "windowResize")
#Window!.setCallback(#Window!.ON_SCREEN_RESIZE, #this!, "screenResize")
#Window!.setCallback(#Window!.ON_MOUSE_SCROLL, #this!, "mouseScroll")
#cWindow!.setCallback(#cWindow!.ON_MOUSE_SCROLL, #this!, "mouseScroll")
#resizeTimerEvent(null())
#Window!.setVisible(#TRUE)
#Window!.focus()
process_events
methodend
method public void closeWindow(BBjCloseEvent ev!)
release
methodend
method public void windowResize(BBjResizeEvent p_event!)
if !(#ActiveResize)
#ActiveResize = #TRUE
#API!.createTimer("ResizeEventTimer", .2, #this!, "resizeTimerEvent")
endif
methodend
method public void screenResize(BBjScreenResizeEvent p_event!)
if !(#ActiveResize)
#ActiveResize = #TRUE
#API!.createTimer("ResizeEventTimer", .2, #this!, "resizeTimerEvent")
endif
methodend
method public void resizeTimerEvent(BBjTimerEvent p_event!)
#SysGui!.setRepaintEnabled(#FALSE)
#Layout!.layoutChildren()
#cLayout!.layoutChildren()
#SysGui!.setRepaintEnabled(#TRUE)
#API!.removeTimer("ResizeEventTimer",err=*next)
#ActiveResize = #FALSE
methodend
method public void mouseScroll(BBjScrollWheelEvent p_event!)
if p_event!.isControlDown() or p_event!.isCmdDown() then
scale = num(cast(HashMap, #Window!.getUserData()).get("scale"))
if p_event!.getScrollDirection() then
scale = scale + (p_event!.getWheelRotation() / 10)
else
scale = scale - (p_event!.getWheelRotation() / 10)
endif
if scale >= 0.5 and scale <= 4.0 then
#Layout!.scaleLayout(scale, #SysGui!)
#cLayout!.scaleLayout(scale, #SysGui!)
cast(HashMap, #Window!.getUserData()).put("scale", scale)
endif
endif
methodend
method public void constructForm()
WinFlags$=$00000000$
WinFlags$=IOR(WinFlags$,$00000001$); rem Resizable
WinFlags$=IOR(WinFlags$,$00000002$); rem Include close box
rem WinFlags$=IOR(WinFlags$,$00000004$); rem Horizontal scroll bar
rem WinFlags$=IOR(WinFlags$,$00000008$); rem Vertical scroll bar
WinFlags$=IOR(WinFlags$,$00000010$); rem Initially invisible
rem WinFlags$=IOR(WinFlags$,$00000020$); rem Initially disabled
WinFlags$=IOR(WinFlags$,$00000080$); rem Max-/Minimizable
rem WinFlags$=IOR(WinFlags$,$00000100$); rem Initially minimized
rem WinFlags$=IOR(WinFlags$,$00000800$); rem Include menu bar
rem WinFlags$=IOR(WinFlags$,$00001000$); rem Initially maximized
rem WinFlags$=IOR(WinFlags$,$00002000$); rem No menu separator line
WinFlags$=IOR(WinFlags$,$00010000$); rem Keyboard navigation
rem WinFlags$=IOR(WinFlags$,$00020000$); rem Always on top
rem WinFlags$=IOR(WinFlags$,$00040000$); rem Dialog border
WinFlags$=IOR(WinFlags$,$00080000$); rem Behave as a dialog
rem WinFlags$=IOR(WinFlags$,$00100000$); rem Auto-arrange controls
WinFlags$=IOR(WinFlags$,$00400000$); rem Custom color palette
WinFlags$=IOR(WinFlags$,$00800000$); rem <Enter> behaves as <Tab>
rem WinFlags$=IOR(WinFlags$,$01000000$); rem No window title bar
WinFlags$=IOR(WinFlags$,$04000000$); rem Auto-manage SYSCOLOR events
rem WinFlags$=IOR(WinFlags$,$20000000$); rem (VPRO5) Report mouse right button
rem WinFlags$=IOR(WinFlags$,$40000000$); rem MDI group-modal
#Window! = #SysGui!.addWindow(
: #SysGui!.getAvailableContext(),400,400,400,400,
: "BBMigPane Layout Test",WinFlags$)
#Window!.setName("window")
#Window!.setUserData(new HashMap())
cast(HashMap, #Window!.getUserData()).put("scale",1.0)
declare BBjFont font!
font_size = 12
font! = #SysGui!.makeFont("Dialog",font_size,#SysGui!.PLAIN)
font_height = iff(font!.getStyle()=#SysGui!.BOLD,int(font_size*1.1),font_size)
#Window!.setFont(font!)
if #debug then #Window!.setTrack(BBjAPI().FALSE)
#Layout! = new BBMigPane(#Window!,
: "insets dialog"+iff(#debug,", debug",""),
: "[align label]rel[grow,fill]unrel[align label]rel[grow,fill]",
: "")
declare BBjVector tx!
declare BBjVector tm!
tx! = #API!.makeVector()
tidFirstName = 0; tx!.add(tidFirstName, "First Name:")
tidSurname = 1; tx!.add(tidSurname, "Surname:")
tidAddress = 2; tx!.add(tidAddress, "Address:")
tidOk = 3; tx!.add(tidOk, "OK")
tidCancel = 4; tx!.add(tidCancel, "Cancel")
tidHelp = 5; tx!.add(tidHelp, "Help")
tm! = #SysGui!.getMeasures(tx!)
declare BBjColor lbl_bkcolor!
lbl_bkcolor! = #API!.makeColor(#SysGui!.YELLOW)
setlblbkcolor = #debug
rem label width/height padding, input control width/height padding
lwpad=0,lhpad=8,iwpad=8,ihpad=8
#lFirstName! = #Window!.addStaticText(#Window!.getAvailableControlID(),0,0,
: num(tm!.get(tidFirstName))+lwpad,font_height+lhpad,
: str(tx!.get(tidFirstName)))
#lFirstName!.setName("lFirstName")
#lFirstName!.setOpaque(#FALSE)
#lFirstName!.setFont(font!)
if setlblbkcolor then #lFirstName!.setBackColor(lbl_bkcolor!)
#Layout!.add(#lFirstName!)
#iFirstName! = #Window!.addInputE(#Window!.getAvailableControlID(),0,0,
: 100,font_height+ihpad,"")
#iFirstName!.setName("iFirstName")
#iFirstName!.setFont(font!)
#Layout!.add(#iFirstName!)
#lSurname! = #Window!.addStaticText(#Window!.getAvailableControlID(),0,0,
: num(tm!.get(tidSurName))+lwpad,font_height+lhpad,str(tx!.get(tidSurName)))
#lSurname!.setName("lSurname")
#lSurname!.setOpaque(#FALSE)
#lSurname!.setFont(font!)
if setlblbkcolor then #lSurname!.setBackColor(lbl_bkcolor!)
#Layout!.add(#lSurname!)
#iSurname! = #Window!.addInputE(#Window!.getAvailableControlID(),0,0,
: 100,font_height+ihpad,"")
#iSurname!.setName("iSurname")
#iSurname!.setFont(font!)
#Layout!.add(#iSurname!, "wrap")
#lAddress! = #Window!.addStaticText(#Window!.getAvailableControlID(),0,0,
: num(tm!.get(tidAddress))+lwpad,font_height+lhpad,str(tx!.get(tidAddress)))
#lAddress!.setName("lAddress")
#lAddress!.setOpaque(#FALSE)
#lAddress!.setFont(font!)
if setlblbkcolor then #lAddress!.setBackColor(lbl_bkcolor!)
#Layout!.add(#lAddress!)
#iAddress! = #Window!.addInputE(#Window!.getAvailableControlID(),0,0,
: 200,font_height+ihpad,"")
#iAddress!.setName("iAddress")
#iAddress!.setFont(font!)
#Layout!.add(#iAddress!, "spanx, wrap unrel:push")
rem child window (pane) for the buttons to test button tags
cWinFlags$=$00000000$
rem cWinFlags$=IOR(cWinFlags$,$00000004$); rem Allow horizontal scroll bar
rem cWinFlags$=IOR(cWinFlags$,$00000008$); rem Allow vertical scroll bar
rem cWinFlags$=IOR(cWinFlags$,$00000010$); rem Initially invisible
rem cWinFlags$=IOR(cWinFlags$,$00000020$); rem Initially disabled
cWinFlags$=IOR(cWinFlags$,$00000800$); rem No border
cWinFlags$=IOR(cWinFlags$,$00010000$); rem Keyboard navigation
rem cWinFlags$=IOR(cWinFlags$,$00100000$); rem Auto-arrange controls
rem cWinFlags$=IOR(cWinFlags$,$00200000$); rem Dock in parent frame
cWinFlags$=IOR(cWinFlags$,$00800000$); rem <Enter> behaves as <Tab>
rem cWinFlags$=IOR(cWinFlags$,$01000000$); rem Recessed client edge
rem cWinFlags$=IOR(cWinFlags$,$02000000$); rem Raised edge
#cWindow! = #Window!.addChildWindow(#Window!.getAvailableControlID(),0,0,
: #Window!.getWidth(),25,"",cWinFlags$,#SysGui!.getAvailableContext())
#cWindow!.setName("cWindow")
#cWindow!.setFont(font!)
declare BBjColor btn_bkcolor!
btn_bkcolor! = #API!.makeColor(#SysGui!.CYAN)
setbtnbkcolor = #debug
if #debug then #cWindow!.setTrack(BBjAPI().FALSE)
#cLayout! = new BBMigPane(#cWindow!, "nogrid, fill"+iff(#debug,", debug",""))
bwpad=16,bhpad=16; rem button width/height padding
#bHelp! = #cWindow!.addMenuButton(#cWindow!.getAvailableControlID(),0,0,
: num(tm!.get(tidHelp))+bwpad,font_height+bhpad,str(tx!.get(tidHelp)))
#bHelp!.setName("bHelp")
#bHelp!.setBorderPainted(#TRUE)
#bHelp!.setFont(font!)
if setbtnbkcolor then #bHelp!.setBackColor(btn_bkcolor!)
#cLayout!.add(#bHelp!,"sg,tag help");rem there is also a "tag help2"
#bOk! = #cWindow!.addMenuButton(#cWindow!.getAvailableControlID(),0,0,
: num(tm!.get(tidOk))+bwpad,font_height+bhpad,str(tx!.get(tidOk)))
#bOk!.setName("bOk")
#bOk!.setBorderPainted(#TRUE)
#bOk!.setFont(font!)
if setbtnbkcolor then #bOk!.setBackColor(btn_bkcolor!)
#cLayout!.add(#bOk!,"sg,tag ok")
#bCancel! = #cWindow!.addMenuButton(#cWindow!.getAvailableControlID(),0,0,
: num(tm!.get(tidCancel))+bwpad,font_height+bhpad,str(tx!.get(tidCancel)))
#bCancel!.setName("bCancel")
#bCancel!.setBorderPainted(#TRUE)
#bCancel!.setFont(font!)
if setbtnbkcolor then #bCancel!.setBackColor(btn_bkcolor!)
#cLayout!.add(#bCancel!,"sg,tag cancel")
#cLayout!.layoutChildren()
#Layout!.add(#cWindow!, "south")
methodend
classend