PBToolboxAI v4 ← Site

dockcontainer — u_pbt_dockcontainer #

← Referência dos componentes · Índice do guia

Painéis acopláveis ao estilo do Visual Studio: acoplagem por arrastar e largar, empilhamento em separadores, divisores redimensionáveis, janelas flutuantes, ocultação automática — e gravação/reposição da disposição.

▶ Ver ao vivo — Aplicação de demonstração, mosaico Dock container: a pré-visualização, o código que o produz e esta página, lado a lado.


Em resumo #

Userobjectu_pbt_dockcontainer
Classe de itemsn_pbt_dock_panel (um painel)
Serve paraDar a uma window PowerBuilder a ergonomia de um IDE moderno: o próprio utilizador organiza os seus painéis e a disposição é reencontrada na sessão seguinte

Tal como em tab, cada painel aloja um controlo PowerBuilder verdadeiro (dragobject): userobject, DataWindow ou outro componente PBToolboxAI. Ver Alojar controlos reais do PowerBuilder.


Início rápido #

// event open da window : os controlos de painel ja estao colocados sobre ela
uo_dock.of_add_panel(/*key*/ "document", /*position*/ "", /*relative_to*/ "", /*size*/ 0, /*title*/ "Document", /*content*/ uo_editor)

// O explorador, acoplado ao inicio do documento, com 260 pixels
uo_dock.of_add_panel(/*key*/ "explorer", /*position*/ uo_dock.POSITION_START, /*relative_to*/ "document", /*size*/ 260, /*title*/ "Explorador", /*content*/ uo_tree)

// As propriedades, acopladas ao fim do documento, com 300 pixels
uo_dock.of_add_panel(/*key*/ "properties", /*position*/ uo_dock.POSITION_END, /*relative_to*/ "document", /*size*/ 300, /*title*/ "Propriedades", /*content*/ uo_props)

// A zona central : nao pode ser fechada pela acoplagem, nem flutuar, nem ser ocultada
uo_dock.is_main = "document"

Propriedades #

PropriedadeTipoPredefiniçãoFunção
is_mainstring""Chave do painel principal: a zona de documento central, que não pode ser ocultada nem destacada, e sobre a qual nenhum painel é empilhado. Definida antes de adicionar esse painel, é guardada e aplicada no seu of_add_panel; "" retira o painel principal
ib_veto_closebooleanfalseOpt-in: perguntar antes de um painel se fechar — a cruz do seu cabeçalho, Fechar / Fechar os outros no menu, a cruz de um painel deslizante e of_close_panel (dispara ue_panel_closing, que pode recusar; uma ordem recusada devolve -4). Desativado por omissão, como todo evento cancelável da biblioteca: defina true para manter aberto um painel com trabalho não guardado
is_theme_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)
is_tooltipstring""Tooltip simples apresentado ao passar sobre o componente
is_super_tooltip_titlestring""Título do tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido

Posições de acoplagem #

As constantes do componente alimentam as_position em of_add_panel e of_move_panel:

ConstanteValorEfeito
POSITION_START"start"O novo painel acopla-se do lado do início de leitura do painel de referência (à esquerda numa escrita da esquerda para a direita)
POSITION_END"end"… do lado do fim de leitura
POSITION_TOP"top"… por cima
POSITION_BOTTOM"bottom"… por baixo
POSITION_STACK"stack"O painel é empilhado em separador sobre o painel de referência. Valor adotado se as_position estiver vazio

Propriedades de um painel — n_pbt_dock_panel #

Obtidas através de of_panel(chave).

PropriedadeTipoPredefiniçãoFunção
is_titlestring""Título apresentado no separador do painel; vazio (nenhum título dado), o separador mostra a chave e o painel principal não tem cabeçalho — dar-lhe um título depois fá-lo aparecer. Aceita a formatação com etiquetas
is_short_titlestring""Forma curta do título, para os locais onde falta espaço: a calha de um painel afixado (sempre — é uma faixa estreita) e o separador de uma pilha, mas apenas quando o título completo já não cabe, o que é medido e não adivinhado. O cabeçalho do painel mantém o título completo. "" = sem forma curta
ib_visiblebooleantrueMostra ou oculta este painel. O painel principal não se oculta; ocultar um painel flutuante fecha a sua janela, e ele regressará acoplado ao seu lugar
ib_pinnedbooleantruetrue = fixado no lugar; false = todo o grupo do painel (separadores incluídos) recolhe-se em patilhas junto ao bordo. Uma patilha expande o seu painel ao passar o ponteiro (após 400 ms) ou de imediato com um clique; aberto ao passar o ponteiro, recolhe-se quando o rato o deixa sem que o foco lá esteja, aberto com um clique permanece até um clique noutro sítio. o botão de pionés do cabeçalho dispara ue_panel_pinned para cada painel do grupo, e também definir ib_pinned pelo código (uma ordem dispara-o como o gesto)
ib_closablebooleantrueO utilizador pode fechar este painel (cruz do cabeçalho, cruz do painel deslizante, Fechar / Fechar os outros no menu)? Definida ao adicionar com of_add_panel(…, ab_closable), alterável a qualquer momento: a cruz e as entradas do menu acompanham de imediato. of_close_panel recusa (-5) um painel não fechável
is_header_colorstring""Cor do cabeçalho deste painel. Vazio = o tema decide; HEADER_COLOR_ACCENT acompanha o acento do tema (e continua a acompanhá-lo após uma mudança de tema, o que um código fixo não faria); caso contrário um #rrggbb. A cor de texto legível é calculada
is_border_colorstring""Cor do contorno deste painel, mesma gramática. Contorna a moldura e o cabeçalho, que têm cada um o seu: colorir apenas um deixa uma emenda visível. Acompanha o painel no seu painel deslizante
is_tooltipstring""Tooltip simples apresentado ao passar sobre o item
is_super_tooltip_titlestring""Título do tooltip enriquecido do item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido do item (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido do item
il_back_colorlong-1Fundo do separador DESTE painel numa pilha, e da sua patilha no bordo depois de desafixado (-1 = o do componente, que segue o tema). O cabeçalho de um painel sozinho usa is_header_color
il_text_colorlong-1Cor do texto do separador e da patilha DESTE painel (-1 = a do componente)
il_back_color_hoverlong-1Fundo do separador e da patilha DESTE painel ao passar (-1 = o do componente)
il_text_color_hoverlong-1Cor do texto do separador e da patilha DESTE painel ao passar (-1 = a do componente)
il_accentlong-1Destaque DESTE painel (-1 = destaque do componente); o cabeçalho segue-o quando is_header_color vale HEADER_COLOR_ACCENT

Métodos #

MétodoFunção
of_add_panel (string as_key, string as_position, string as_relative_to, integer ai_size, string as_title, dragobject ado_content)Adiciona um painel fechável e aloja o controlo. as_relative_to = chave do painel contra o qual se acopla (vazio = a raiz); ai_size = tamanho inicial em píxeis (0 = automático). Devolve 0 depois de aplicado, -5 perante uma chave vazia, já usada ou contendo / ou uma barra vertical, um controlo já alojado, um as_relative_to desconhecido ou um empilhamento (POSITION_STACK) sobre o painel principal, ou uma posição desconhecida — nada é tocado, -6 em modo de demonstração quando o dock já tem os seus três painéis (o controlo fica no seu lugar, visível), -2 se o componente não estiver criado
of_add_panel (…, boolean ab_closable)Idem, com ab_closable = false para um painel sem botão de fecho. Devolve 0 depois de aplicado, -5 perante uma chave vazia, já usada ou contendo / ou uma barra vertical, um controlo já alojado, um as_relative_to desconhecido ou um empilhamento (POSITION_STACK) sobre o painel principal, ou uma posição desconhecida — nada é tocado, -6 em modo de demonstração quando o dock já tem os seus três painéis (o controlo fica no seu lugar, visível), -2 se o componente não estiver criado
of_select_panel (string as_key)Torna um painel visível: em primeiro plano na sua pilha, o seu painel deslizante aberto quando o grupo está recolhido, a sua janela trazida para a frente quando flutua. Quando um painel acoplado passa para primeiro plano na sua pilha, segue ue_panel_selected, como num clique no seu separador. Devolve 0 depois de aplicado, -5 perante uma chave desconhecida ou um painel OCULTO (mostrá-lo é o papel de ib_visible), -2 se o componente não estiver criado
of_move_panel (string as_key, string as_target, string as_position)Reorganiza a partir do código, exatamente como se o utilizador tivesse arrastado o separador. Devolve 0 depois de aplicado, -5 perante uma chave desconhecida, um destino (as_target) desconhecido uma posição desconhecida, um empilhamento sobre o painel principal ou um empilhamento DO painel principal, -2 se o componente não estiver criado
of_move_panel (string as_key, string as_target, string as_position, integer ai_index)O mesmo, indicando a posição do painel na pilha do destino (1 = primeiro, 0 o menos = último). Só uma pilha é uma lista ordenada: o índice é ignorado para POSITION_START / END / TOP / BOTTOM. Devolve 0 depois de aplicado, -5 perante uma chave desconhecida, um destino (as_target) desconhecido uma posição desconhecida, um empilhamento sobre o painel principal ou um empilhamento DO painel principal, -2 se o componente não estiver criado
of_float_panel (string as_key)Destaca o painel numa verdadeira janela flutuante deslocável e redimensionável; um painel já destacado antes recupera o lugar da sua janela. Ao fechá-la, o painel volta a acoplar-se (ue_panel_docked). Não o painel principal (is_main): é a zona de documento à volta da qual os outros se dispõem, constrói o seu próprio cabeçalho, e não pode ser nem destacado, nem ocultado, nem fechado. Segue ue_panel_floated, como para o botão do cabeçalho, o duplo clique no cabeçalho ou no separador, ou Destacar no menu do clique direito. Devolve 0 depois de aplicado, -5 perante uma chave desconhecida, o painel principal ou um painel OCULTO, -2 se o componente não estiver criado
of_close_panel (string as_key)Fecha o painel como a sua cruz: fica oculto (ib_visible = true volta a mostrá-lo) e segue ue_panel_closed. Com ib_veto_close = true, ue_panel_closing é colocado primeiro. Devolve 0 depois de aplicado, -4 quando o seu ue_panel_closing recusou (o painel fica), -5 perante uma chave desconhecida, o painel principal, um painel oculto ou não fechável (ib_closable = false), -2 se o componente não estiver criado
of_notify_panel (string as_key)Assinala conteúdo novo: se o painel não estiver visível, o respetivo separador apresenta um contador de elementos não vistos, apagado ao selecioná-lo. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_clear_notify (string as_key)Apaga esse contador sem mostrar o painel. Selecionar o separador era a única outra forma, o que é errado quando o seu código sabe que o próprio conteúdo desapareceu. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_remove_panel (string as_key)Retira o painel e devolve o controlo à window de origem, no seu lugar, com o seu tamanho e com a visibilidade que tinha antes de of_add_panel. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_get_layout ( )Devolve a disposição atual (árvore das divisões, rácios, separadores, visibilidade, painéis flutuantes e lugar da sua janela) sob a forma de uma cadeia, para armazenar em ficheiro, base de dados ou registo
of_set_layout (string as_json)Repõe uma disposição obtida através de of_get_layout. Os painéis têm de ter sido recriados antes da chamada; os que estiverem ausentes da disposição — ou todos, se ela não conhecer nenhum — juntam-se a um grupo ao lado dos outros, nunca ao painel principal. Os painéis flutuantes recuperam a sua janela no seu lugar, trazida de volta para um ecrã se o deles desapareceu; uma disposição que não nomeia nenhum painel principal mantém o atual. Devolve 0 depois de aplicado, -5 perante um texto que não é uma disposição (não é JSON, ou sem tree): o dock fica então como está, -2 se o componente não estiver criado
of_panel (string as_key)Handle n_pbt_dock_panel do painel (criado no primeiro acesso)
of_refresh_panel (string as_key)Atualiza a representação de um painel construído fora do ecrã, sem cintilação. Devolve 0, -5 se a chave não designar nenhum painel, -2 se o componente não estiver criado
of_relayout ( )Recalcula e volta a publicar todas as zonas para que os controlos alojados sejam reposicionados. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_reset ( )Esvazia o contentor: cada controlo alojado é devolvido à respetiva window de origem, os handles de painéis são libertados e a disposição memorizada é apagada. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_set_redraw (boolean)Agrupa uma rajada de modificações numa única representação. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_save_as_png (string) · of_save_as_jpg (string)Exporta a representação como imagem. Devolve 0 depois de a imagem ser escrita, -4 se a escrita falhar, -2 se o componente não estiver criado

Eventos #

EventoAcionado quando
ue_panel_selected (string as_key)Um painel acoplado passa para primeiro plano no seu grupo: clique no separador ou no cabeçalho, setas da faixa de separadores, ou of_select_panel (uma ordem do seu código também o dispara)
ue_panel_closed (string as_key)Um painel é fechado: a cruz do seu cabeçalho, Fechar ou Fechar os outros no menu do clique direito sobre o cabeçalho ou o separador, a cruz de um painel deslizante, ou of_close_panel (uma ordem do seu código também o dispara). O painel fica oculto (ib_visible = true volta a mostrá-lo); com ib_veto_close = true, só depois de ue_panel_closing o ter permitido
ue_panel_closing (string as_key) → booleanCancelável, colocado antes de um painel se fechar — a cruz do seu cabeçalho, Fechar ou Fechar os outros no menu (uma pergunta por painel), a cruz de um painel deslizante, ou of_close_panel —, e só quando ib_veto_close = true (desativado por omissão). Devolva false para manter o painel aberto (trabalho não guardado): ue_panel_closed não se segue, e of_close_panel devolve -4
ue_panel_pinned (string as_key, boolean ab_pinned)Um painel é fixado (true) ou desafixado em ocultação automática (false): botão de pionés do cabeçalho, botão de acoplar do painel deslizante, ou ib_pinned definido pelo seu código (uma ordem também o dispara)
ue_panel_floated (string as_key)Um painel é destacado numa janela flutuante: botão do cabeçalho, duplo clique no cabeçalho ou no separador, Destacar no menu do clique direito, ou of_float_panel (uma ordem do seu código também o dispara). Uma disposição reposta (of_set_layout) não dispara nada
ue_panel_docked (string as_key)O UTILIZADOR volta a acoplar um painel flutuante: fecha a sua janela, ou faz duplo clique na sua barra de título — o painel regressa ao seu lugar
ue_layout_changed (string as_json)A disposição foi alterada (arrastamento, redimensionamento, acoplagem, uma janela flutuante deslocada ou redimensionada, mas também um painel fechado, ocultado, selecionado, renomeado, ou outro painel principal). O parâmetro transporta a nova disposição, pronta a ser gravada
ue_ready ( )O componente terminou o carregamento; tudo o que foi enviado antes foi reproduzido
ue_runtime_missing ( )O runtime WebView2 está ausente: o componente permanece vazio
ue_bg_color (long al_color)O componente calculou a cor de fundo do respetivo tema; o userobject já a adotou (backcolor)

Com o rato #

Para além de arrastar separadores e divisores, três gestos atuam sobre um painel — nunca sobre o painel principal:

GestoEfeito
Duplo clique no cabeçalho de um grupo ou num separadorDestaca o painel (para o cabeçalho: o painel ativo do grupo) numa janela flutuante — ue_panel_floated
Duplo clique na barra de título de uma janela flutuanteVolta a acoplar o painel no seu lugar, como a cruz da janela — ue_panel_docked
Clique direito no cabeçalho ou num separadorMenu Destacar / Fechar / Fechar os outros (os outros painéis fecháveis do mesmo grupo). Uma entrada que nada pode fazer fica a cinzento; com ib_veto_close = true, cada fecho coloca ue_panel_closing — uma pergunta por painel

Com o teclado #

O conteúdo de um painel é um verdadeiro controlo PowerBuilder: aí o teclado pertence ao seu código, como em qualquer janela. Aquilo de que o componente trata é o seu próprio invólucro — cabeçalhos, separadores, divisores:

TeclaEfeito
Setas sobre um separadorPassam ao painel anterior / seguinte do grupo e selecionam-no. Uma banda de separadores é uma única paragem de tabulação
Home / End sobre um separadorPrimeiro / último painel do grupo
Setas sobre um divisorDeslocam a separação em 2 %, apenas no eixo do divisor
Page Up / Page Down sobre um divisorO mesmo, em passos de 10 %
EscFecha o painel deslizante aberto a partir de um botão de margem

Um divisor é um separator focável que anuncia a sua posição; os botões do cabeçalho (destacar, ocultar, fechar) têm um nome, e o painel ativo de um grupo está marcado com aria-selected. Uma deslocação com o teclado é comunicada em ue_layout_changed exatamente como um arrastamento com o rato.


Exemplos #

Uma window ao estilo de um IDE #

// event open : cada conteudo e um controlo PB verdadeiro colocado sobre a window
uo_dock.of_add_panel(/*key*/ "document", /*position*/ "", /*relative_to*/ "", /*size*/ 0, /*title*/ "Document", /*content*/ uo_editor)
uo_dock.of_add_panel(/*key*/ "explorer", /*position*/ uo_dock.POSITION_START, /*relative_to*/ "document", /*size*/ 260, /*title*/ "Explorador", /*content*/ uo_tree)
uo_dock.of_add_panel(/*key*/ "properties", /*position*/ uo_dock.POSITION_END, /*relative_to*/ "document", /*size*/ 300, /*title*/ "Propriedades", /*content*/ uo_props)
uo_dock.of_add_panel(/*key*/ "output", /*position*/ uo_dock.POSITION_BOTTOM, /*relative_to*/ "document", /*size*/ 200, /*title*/ "Saida", /*content*/ uo_console)

// Um segundo painel empilhado em separador sobre "properties"
uo_dock.of_add_panel(/*key*/ "help", /*position*/ uo_dock.POSITION_STACK, /*relative_to*/ "properties", /*size*/ 0, /*title*/ "Ajuda", /*content*/ uo_help)

// O documento e a zona central
uo_dock.is_main = "document"

Memorizar e repor a disposição do utilizador #

// event close da window : gravar aquilo que o utilizador organizou
string ls_layout
ls_layout = uo_dock.of_get_layout()
of_save_setting(/*name*/ "main_dock", /*value*/ ls_layout)
// event open : RECRIAR primeiro os paineis, repor a disposicao depois
string ls_layout

// Primeiro os paineis : os of_add_panel acima
of_create_panels()

// Depois a disposicao guardada no ultimo fecho, se existir
ls_layout = of_read_setting(/*name*/ "main_dock")
if ls_layout <> "" then uo_dock.of_set_layout(/*json*/ ls_layout)

A ordem é imperativa: of_set_layout não cria nenhum painel, limita-se a recolocar os que já existem.

Acompanhar as alterações continuamente #

// event ue_layout_changed de uo_dock : (string as_json)
// Gravacao imediata, sem esperar pelo fecho da window.
of_save_setting(/*name*/ "main_dock", /*value*/ as_json)

Comandar um painel através do respetivo handle #

// Local variables
n_pbt_dock_panel lnv_panel

// O painel das propriedades : um titulo que conta as alteracoes, recolhido no seu bordo
lnv_panel = uo_dock.of_panel(/*key*/ "properties")
lnv_panel.is_title  = "Propriedades (3 modificadas)"
lnv_panel.ib_pinned = false        // recolhe-se numa patilha junto ao bordo
// Ocultar um painel reservado aos administradores
uo_dock.of_panel(/*key*/ "audit").ib_visible = gb_administrator

Chamar a atenção para um painel em segundo plano #

// Um processamento em segundo plano escreveu na consola : assinalar sem roubar o foco
uo_dock.of_notify_panel(/*key*/ "output")

Reorganizar a partir do código #

// Deslocar um painel como se o utilizador tivesse arrastado o seu separador
uo_dock.of_move_panel(/*key*/ "output", /*target*/ "document", /*position*/ "bottom")

// Empilha-lo em separador sobre outro painel
uo_dock.of_move_panel(/*key*/ "help", /*target*/ "properties", /*position*/ "stack")

Destacar um painel para um segundo ecrã #

// Janela flutuante nativa : o utilizador pode coloca-la noutro ecra
uo_dock.of_float_panel(/*key*/ "properties")
// event ue_panel_docked de uo_dock : (string as_key)
// O utilizador voltou a fechar a janela flutuante : o painel regressou.
of_log(/*msg*/ "Painel novamente acoplado: " + as_key)

Fechar corretamente um painel #

// event ue_panel_closed de uo_dock : (string as_key)
// Retirar tambem o painel do contentor para libertar o controlo alojado.
uo_dock.of_remove_panel(/*key*/ as_key)

Recusar o fecho de um painel com trabalho não guardado #

// event open da window : perguntar antes de um painel se fechar (desativado por omissao)
uo_dock.ib_veto_close = true

// ue_panel_closing event of uo_dock : (string as_key) returns boolean
// O editor ainda tem alteracoes nao guardadas : o seu painel fica aberto.
if as_key = "editor" then
    if ib_editor_modified then return false
end if
return true

// O seu codigo coloca a mesma pergunta : -4 quando e recusada
if uo_dock.of_close_panel(/*key*/ "editor") = -4 then
    st_status.Text = "Guarde o documento antes de fechar o editor."
end if

Boas práticas #

Herdado da base comum #

Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.

MembrosFunçãoDetalhado em
of_count · of_keys_at · of_hasPercorrer o que o componente contém3.2 Os items
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.1 O motor de propriedades

Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.


← Referência dos componentes · Índice do guia