|
Suportando Novos Tipos de Categoria
A criação de novos tipos de categoria segue o mesmo processo da criação de novos tipos de ferramenta. Você cria a classe de categoria e adiciona um registro à tabela Tooltype. Geralmente, você adiciona um novo tipo de categoria porque precisa executar ações quando a categoria estiver aberta. Alguns tipos de categorias internar já fazem isso; por exemplo, uma categoria de pasta dinâmica cria itens de ferramenta no catálogo quando ele abre. Uma categoria dinâmica possui algumas características especiais que você irá explorar.
Quando você cria categorias dinâmicas, os itens na categoria não estão fisicamente representados na tabela de conteúdo da Caixa de Ferramentas. Eles estão armazenados na memória em um cursor. Se você observar na tabela de conteúdo da Caixa de Ferramentas os itens exibidos em uma categoria baseada na pasta dinâmica, você não verá esses registros. É por esse motivo que as categorias dinâmicas exibem a mensagem "Dynamic Category - clique on Category Properties to modify" na grade do item Customize Toolbox. Para criar e manipular esses itens de ferramenta virtuais, veja os métodos especial no mecanismo da Caixa de Ferramentas que salvam e restauram os itens virtuais.
Por exemplo, você pode criar uma categoria de ambiente que exibe como itens da ferramenta todos os seus conjuntos e projetos de ambiente armazenados no Environment Manager do Visual FoxPro. O Environment Manager é uma nova ferramenta no Visual FoxPro 8.0. Ele gerencia grupos de configurações de ambiente de modo que você possa rápida e facilmente alterar configurações de ambiente e executar o script para definir projetos. Você também pode associar projetos a conjuntos de ambiente. ELe é geralmente acessado a partir do Task Pane Manager, mas você também pode executar o EnvMgr.app como um aplicativo autônomo. Ele pode receber o nome do conjunto de ambiente para executar automaticamente e especificar se deseja executá-lo no modo silencioso.
Ele também poderá receber o nome de um projeto específico a ser aberto para que aplique as configurações de ambiente e abra o gerente de projeto. Se você executar no modo silencioso, o Environment Manager não exibe uma caixa de mensagem quando executar o conjunto de ambiente.
DO (HOME()+"ENVMGR.APP") WITH "Environment Set 1", .T.
Você quer que cada item na categoria seja criado dinamicamente e exiba o nome do conjunto de ambiente e quaisquer nomes de projeto lendo a tabela Environment Manager (EnvMgr.dbf). Quando o item estiver clicado, o Environment Manager é chamado, passando o ID do conjunto ou projeto. Você também pode definir duas opções na categoria: o local da tabela Environment Manager e se irá executar no modo silencioso. O local da tabela que contém as configurações de ambiente é padronizado para \Documents and Settings\UserName\Application Data\Microsoft\Visual FoxPro 8\EnvMgr.DBF, ou HOME(7)+"EnvMgr.dbf". Se essa opção estiver em branco, o local padrão é assumido.
A primeira coisa a ser feita é criar uma classe de categoria do gerente de ambiente que é subclasse de _dynamiccategory.
CREATE CLASS EnvMgrCategory OF MyToolbox.vcx AS _DynamicCategory FROM _toolbox.vcx
Ao criar seus tipos de categoria dinâmica, geralmente há dois métodos a serem anulados: OnCreateDataValues e OnRenderCategory. É no OnCreateDataValues que você especifica as opções que essa categoria deve fornecer. Essa informação é exibida na folha de propriedades da categoria. Você pode especificar uma opção a ser executada no modo silencioso e uma outra para especificar a tabela Environment Manager a ser usada. Você pode usar a tabela de recurso do Visual FoxPro para obter essa informação. No entanto, para esse exemplo, se a propriedade estiver em branco, o local padrão é assumido. Lembre-se de que, para criar essas opções, você deve chamar o método AddDataValue. O código do método OnCreatDataValues deverá ser o seguinte:
*-- Add all the default properties of a dynamic category DODEFAULT() *-- Add our additional properties THIS.AddDataValue("quietmode", .F., "Run quietly", '', .F., "cfoxcheckbox") THIS.AddDataValue("envfile", '', "Env. Manager Table", '', .F., "cfoxfilename")
Em seguida, grave o código no método OnRenderCategory para criar cada ferramenta na categoria. Primeiro consulte a tabela do gerente de ambiente para todos os projetos e conjuntos de ambiente. Para cada conjunto ou projeto encontrado, crie um objeto de ferramenta que é exibido na categoria. Ao clicar em uma ferramenta nessa categoria, execute EnvMgr.app, passando o UniqueID do item e um segundo parâmetro para indicar se deseja executar no modo silencioso. Para facilitar esse comportamento, os itens de ferramenta que você cria dinamicamente são uma instância da classe de ferramenta do aplicativo indicada na tabela ToolType em que ToolType.UniqueID = "APP". Esse tipo de ferramenta atualmente refere-se à classe _apptool na biblioteca de classe _toolbox.vcx. Como o tipo de ferramenta do aplicativo já possui o comportamento para executar um aplicativo quando clicado, você apenas precisa estabelecer a propriedade do nome do arquivo para executar o aplicativo Environment Manager. Você pode deixar a propriedade do nome do arquivo entre parênteses de modo que possa ser avaliada no tempo de execução. Você pode chamar facilmente os parâmetros do aplicativo Environment Manager. Por exemplo, para executar um conjunto de ambiente no modo silencioso, crie manualmente um item de aplicativo e estabeleça a propriedade do nome do arquivo da seguinte maneira:
(DO (HOME() + "ENVMGR.APP") WITH "_0VK0QENFH", .T.)
No entanto, quando você cria esse item de aplicativo manualmente, ele cria um registro físico na tabela de conteúdo da Caixa de Ferramentas. Essa categoria precisa criar ferramentas de aplicativo virtuais que são exibidas dinamicamente quando a categoria estiver aberta. Você pode gerenciar seus conjuntos de ambiente em um lugar, o Environment Manager, e a categoria usa as alterações automaticamente. Para criar itens de ferramenta virtuais, use dois métodos do mecanismo da Caixa de Ferramentas: GetVirtualToolObject e SaveVirtual. Esses métodos manipulam um cursor interno de ferramentas virtuais chamado VirtualCursor. Pode ser obtida uma referência do mecanismo por meio da propriedade oEngine da classe de ferramenta. Essas ferramentas devem ser adicionadas à coleção oToolCollection que é passada para o método OnRenderCategory. O código do método OnRenderCategory deverá ser o seguinte:
*-- Load the passed oToolCollection with the tool objects *-- in this category -- in this case a Tool object for *-- each environment set or project defined in the EnvMgr.dbf table. LPARAMETERS oToolCollection LOCAL oToolObject, cEnvFile, nCnt, i, oToolType, lQuietMode LOCAL cToolTypeID, cToolCaption, cToolTip, cFileName LOCAL ARRAY aEnvList[1] DODEFAULT(oToolCollection) *-- Get the value of the quietmode property lQuietMode = NVL(THIS.GetDataValue("quietmode"), .F.) *-- Get the value of the envfile property cEnvFile = THIS.EvalText(NVL(THIS.GetDataValue("envfile"), '')) IF EMPTY(cEnvFile) cEnvFile = HOME(7) + "envmgr.dbf" ENDIF IF FILE(cEnvFile) *-- Grab all Environment Sets ('E') and Projects ('P') from the *-- environment manager table SELECT UniqueID, EnvType, SetName ; FROM (cEnvFile) ; WHERE (EnvType == 'E' OR EnvType == 'P') ; ORDER BY SetName ; INTO ARRAY aEnvList nCnt = _TALLY cToolTypeID = "APP" FOR i = 1 TO nCnt *-- Create a virtual tool object that is identified in ToolType.dbf as "APP". *-- (Remember, Tooltype is where the class and class library is specified.) *-- The second parameter is the caption for the tool object and the *-- third parameter specifies the tool tip. cToolCaption = RTRIM(aEnvList[i, 3]) cToolTip = cToolCaption oToolObject = THIS.oEngine.GetVirtualToolObject(cToolTypeID, ; cToolCaption, cToolTip ) IF !ISNULL(oToolObject) IF lQuietMode *-- To run in quiet mode, pass .T. as the second parameter to EnvMgr.App cFileName = [(DO "] + HOME() + ; [EnvMgr.app" WITH "] + aEnvList[i, 1] + [", .T.)] ELSE cFileName = [(DO "] + HOME() + ; [EnvMgr.app" WITH "] + aEnvList[i, 1] + [")] ENDIF *-- Set the filename property on our virtual application tool oToolObject.SetDataValue("filename", cFileName ) *-- Save the virtual tool object in the VirtualCursor THIS.oEngine.SaveVirtual( oToolObject) *-- Add the tool to the collection so it will display in the category. oToolCollection.Add( oToolObject) ENDIF ENDFOR ENDIF RETURN
Note como a propriedade QuietMode da categoria é consultada de modo que você possa definir a propriedade do nome do arquivo no objeto da ferramenta de maneira apropriada. Você também pode criar seu próprio tipo de ferramenta dividindo em subclasse _apptool e fazer com que o código faça algo no objeto da ferramenta.
O ultimo passo é adicionar o novo tipo de categoria à tabela ToolType. Adicione um registro à tabela Tooltype e digite os valores de campo relevantes conforme mostrado na Tabela 20.
Tabela 20 Informações para adicionar um novo tipo de categoria para Environment
Manager
|
Campo
|
Valor
|
|
UNIQUEID
|
MASSI.ENVMGR
|
|
SHOWTYPE
|
C
|
|
TOOLTYPE
|
Environment
Manager
|
|
CLASSNAME
|
EnvmgrCategory
|
|
CLASSLIB
|
C:\Program
Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx
|
|
SHOWNEW
|
.T.
|
|
PROPSHEET
|
.T.
|
|
INACTIVE
|
.F.
|
Agora abra novamente a Caixa de Ferramentas e adicione uma categoria de Environment Manager selecionando Environment Manager, que está listado como uma seleção disponível na lista de tipos de categoria. Digite o nome da categoria e clique em OK. A folha de propriedade da categoria aparece de modo que você possa selecionar o local da tabela Environment Manager e especificar se deseja executar no modo silencioso (Figura 12).

Figura
12 O novo tipo de categoria que você criou exibe suas propriedades
personalizadas na caixa de diálogo Category Properties.
Abra a categoria e você verá os itens da ferramenta do aplicativo para cada conjunto e projeto de ambiente em Environment Manager (Figura 13). Clique em uma ferramenta de aplicativo para definir o ambiente.

Figura 13 O tipo de categoria Environment Manager que você criou aparece nos
conjuntos e projetos de ambiente como ferramentas virtuais do aplicativo.
Voltar para o menu
|
|