/// <summary> /// Botão "Validate" clicado, este código é chamado em resposta ao "click" /// </summary> /// <param name="resourceData">Dados do recurso</param> /// <param name="errorMsg"></param> /// <returns></returns> public bool ValidateResource(IReadOnlyResourceConfiguration resourceData, out string errorMsg) { //errorMsg should be set to null in case there is no error errorMsg = null; //This method receives read-only copy of the Resource. //String myProperty = serviceData.GetPropertyValue("ServicePropertyName"); //You should open your own dialog here with the success/failure message String cUrlRemoteSite = resourceData.GetPropertyValue(CUrlConfigData.CURL_RSRC_KEY_NAME); // Validação básica, para fins didáticos apenas if (string.IsNullOrEmpty(cUrlRemoteSite)) { errorMsg = @"Site Url/Uri must be set"; } else if (cUrlRemoteSite.Trim().StartsWith(@"/") || cUrlRemoteSite.Trim().EndsWith(@"/")) { errorMsg = "Site Url/Uri must not start or end with \"/\""; } if (string.IsNullOrEmpty(errorMsg)) { MessageBox.Show("Resource Url is OK!", "Resource Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); } //Method should return true for success and false for failure return(string.IsNullOrEmpty(errorMsg)); }
/// <summary> /// Chamado pelo Studio quando é necessário "configurar" o componente /// </summary> /// <param name="dataObject">Deve ser atualizado com uma instância do objetoi de "configuração"</param> /// <param name="utils">Recebe um objeto do xpi Studio com diversas ferramentas disponíveis para uso nesta interface (UI)</param> /// <param name="resourceData">Recebe um objeto do xpi Studio com dados do recurso associado ao componente</param> /// <param name="navigateTo">Quando <> de NULL, indica que foi ativado pelo "Finder" do xpi Studio</param> /// <param name="configurationChanged">Deve ser atualizado com TRUE/FALSE para avisar se alguma configuração foi alterada</param> /// <returns></returns> public bool?Configure(ref object dataObject, ISDKStudioUtils utils, IReadOnlyResourceConfiguration resourceData, object navigateTo, out bool configurationChanged) { bool?confirmed = new bool?(false); // Guarda a instância destes utilitários/ferramentas, para uso em outros métodos (se necessário) _utils = utils; _rsrcData = resourceData; // Handling dataObject null situation (1st config for example) if (!(dataObject is CUrlConfigData)) { dataObject = CreateDataObject(); } CUrlConfigData adaptorData = dataObject as CUrlConfigData; // Cópia de trabalho do objeto CUrlConfigData adaptorDataWorkObject = new CUrlConfigData { additionalCurlFlags = adaptorData.additionalCurlFlags, dataToSend = adaptorData.dataToSend, exitCodeCUrl = adaptorData.exitCodeCUrl, finalCUrlCmd = adaptorData.finalCUrlCmd, finalSiteUrl = adaptorData.finalSiteUrl, headersToSend = adaptorData.headersToSend, httpResultCode = adaptorData.httpResultCode, httpResultText = adaptorData.httpResultText, httpVerb = adaptorData.httpVerb, keepWorkingFiles = adaptorData.keepWorkingFiles, outputCUrl = adaptorData.outputCUrl, outputData = adaptorData.outputData, outputHeaders = adaptorData.outputHeaders, urlDynAddition = adaptorData.urlDynAddition, isConfigured = adaptorData.isConfigured }; configurationChanged = false; //Indicate a change in configuration resulting in dirty state // Abre e exibe a tela de configuração uiForm frm = new uiForm(); frm.ConfigurationChanged = !adaptorDataWorkObject.isConfigured.GetLogical(); // Se nunca fez a configuração antes, a 1a vez é considerada: configuração alterada confirmed = new bool?(frm.Configure(ref adaptorDataWorkObject, utils, resourceData, navigateTo) == DialogResult.OK); if (confirmed.HasValue && confirmed.Value) { // Fechou pelo botão OK configurationChanged = frm.ConfigurationChanged; if (configurationChanged) { // Atualiza o objeto de configuração de retorno #region adaptorData.additionalCurlFlags = adaptorDataWorkObject.additionalCurlFlags; adaptorData.dataToSend = adaptorDataWorkObject.dataToSend; adaptorData.exitCodeCUrl = adaptorDataWorkObject.exitCodeCUrl; adaptorData.finalCUrlCmd = adaptorDataWorkObject.finalCUrlCmd; adaptorData.finalSiteUrl = adaptorDataWorkObject.finalSiteUrl; adaptorData.headersToSend = adaptorDataWorkObject.headersToSend; adaptorData.httpResultCode = adaptorDataWorkObject.httpResultCode; adaptorData.httpResultText = adaptorDataWorkObject.httpResultText; adaptorData.httpVerb = adaptorDataWorkObject.httpVerb; adaptorData.keepWorkingFiles = adaptorDataWorkObject.keepWorkingFiles; adaptorData.outputCUrl = adaptorDataWorkObject.outputCUrl; adaptorData.outputData = adaptorDataWorkObject.outputData; adaptorData.outputHeaders = adaptorDataWorkObject.outputHeaders; adaptorData.urlDynAddition = adaptorDataWorkObject.urlDynAddition; adaptorData.isConfigured.SetLogical(true); #endregion // dataObject = adaptorData; } } // return(confirmed); // confirmed; //se retornar TRUE, o Studio abre o "DataMapper" interno para continuar a configuração. Se retornar FALSE, não abre. }
/// <summary> /// Não usaremos, mas aqui podemos adicionar código extra para usar no "Checker", quando ele estiver validando o nosso componente /// Retornando NULL, o checker terá o comportamnto padrão /// </summary> /// <param name="data"></param> /// <param name="resourceData"></param> /// <returns></returns> public ICheckerResult Check(ref object data, IReadOnlyResourceConfiguration resourceData) { // return(null); // can be used to return additional results o the builds in checker mechanism }
/// <summary> /// Inicializa o "form" com os dados das propriedades que devem ser exibidas/editadas /// E exibe-o, para permitir a edição /// </summary> /// <param name="dataObject"></param> /// <param name="utils"></param> /// <param name="resourceData"></param> /// <param name="navigateTo"></param> public DialogResult Configure(ref CUrlConfigData cfgData, ISDKStudioUtils utils, IReadOnlyResourceConfiguration resourceData, object navigateTo) { DialogResult result = DialogResult.Cancel; string sysPropStudioDesignMode = utils.GetSystemProperty("IsStudioInDesignMode"); _cfgData = cfgData; _cfgDataDetails = _cfgData.GetDetails(); _utils = utils; _resourceData = resourceData; _isDesigning = sysPropStudioDesignMode.ToUpper().StartsWith("Y") || sysPropStudioDesignMode.ToUpper().StartsWith("T") || sysPropStudioDesignMode.ToUpper().StartsWith("1"); // Adiciona as colunas (6: Id, Property, Description, Type, Direction, Value) DoubleBufferedDataGridView(dataGridViewEditProperties, true); dataGridViewEditProperties.Columns.Clear(); dataGridViewEditProperties.ColumnHeadersDefaultCellStyle.BackColor = Color.FromKnownColor(KnownColor.Control); dataGridViewEditProperties.EnableHeadersVisualStyles = false; for (int i = 0; i <= COLUMN_MAX; i++) { if (!(i == COLUMN_BUTTON)) { DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.AutoIncrement = false; column.ReadOnly = false; // Coluna da tabela if (i == COLUMN_ID) { // Coluna #1 column.ColumnName = "Id"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = true; } else if (i == COLUMN_NAME) { // Coluna #2 column.ColumnName = "Property"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = true; } else if (i == COLUMN_DESCRIPTION) { // Coluna #3 column.ColumnName = "Description"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = false; } else if (i == COLUMN_TYPE) { // Coluna #4 column.ColumnName = "Type"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = false; } else if (i == COLUMN_DIRECTION) { // Coluna #5 column.ColumnName = "Direction"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = false; } else if (i == COLUMN_BUTTON) { // Coluna #7 } else { // Coluna #6 column.ColumnName = "Value"; column.Caption = column.ColumnName; column.AutoIncrement = false; column.Unique = false; } // _editTable.Columns.Add(column); } } // "Liga" a tabela ao Grid dataGridViewEditProperties.DataSource = _editTable; // Ajusta a aparência e comportamento (default) das colunas for (int i = 0; i <= COLUMN_MAX; i++) { DataGridViewColumn gCol = dataGridViewEditProperties.Columns[i]; // Coluna da tabela if (i == COLUMN_ID) { // Coluna #1 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 30; } else if (i == COLUMN_NAME) { // Coluna #2 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 170; } else if (i == COLUMN_DESCRIPTION) { // Coluna #3 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 300; } else if (i == COLUMN_TYPE) { // Coluna #4 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 80; } else if (i == COLUMN_DIRECTION) { // Coluna #5 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 60; } else if (i == COLUMN_BUTTON) { // Coluna #7 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 30; gCol.HeaderText = string.Empty; } else { // Coluna #6 gCol.SortMode = DataGridViewColumnSortMode.NotSortable; gCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; gCol.ReadOnly = true; gCol.Frozen = true; gCol.Width = 410; // Adiciona o botão (7a coluna) DataGridViewButtonColumn gNewCol = new DataGridViewButtonColumn(); gNewCol.SortMode = DataGridViewColumnSortMode.NotSortable; gNewCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; gNewCol.ReadOnly = true; gNewCol.Frozen = true; gNewCol.Width = 30; gNewCol.Text = "..."; gNewCol.HeaderText = string.Empty; gNewCol.UseColumnTextForButtonValue = true; dataGridViewEditProperties.Columns.Insert(i + 1, gNewCol); } } // Adiciona as linhas (Uma para cada propriedade) // São 6 colunas: Id, Property, Description, Type, Direction e Value foreach (CUrlConfigDataDetail propDet in _cfgDataDetails) { if (propDet.PropertyAcceptExpressionEditor || propDet.PropertyAcceptVariablesSelector) { DataRow row = _editTable.NewRow(); row[COLUMN_ID] = propDet.PropertyId.ToString(); row[COLUMN_NAME] = propDet.PropertyDisplayText; row[COLUMN_DESCRIPTION] = propDet.PropertyHint; row[COLUMN_TYPE] = propDet.PropertyMagicType.ToUpper(); row[COLUMN_DIRECTION] = (propDet.PropertyIsInput && propDet.PropertyIsOutput) ? "[In/Out]" : ((propDet.PropertyIsInput) ? "[In]" : ((propDet.PropertyIsOutput) ? "[Out]" : string.Empty)); row[COLUMN_VALUE] = (propDet.PropertyValue == null) ? string.Empty : propDet.PropertyValue.ToString(); // _editTable.Rows.Add(row); } } // Completar algumas informações string iconFile = _utils.GetSystemProperty("ConnectorPath") + "\\icons\\curl.gif"; if (File.Exists(iconFile)) { pictureBoxLogo.ImageLocation = iconFile; } new ToolTip().SetToolTip(pictureBoxLogo, iconFile); // Cehcar se a ação é "normal" ou veio de um "MoveTo" if (!(navigateTo == null)) { if (Int32.TryParse(navigateTo.ToString(), out _initialSelectedRow)) { _initialSelectedRow--; lblNavigateTo.Text = "Direct \"Move To\" to property id: #" + navigateTo.ToString(); } } lblRsrcInfo.Text = resourceData.ResourceName + GetResourceValue(resourceData.ResourceName, Path.Combine(_utils.GetSystemProperty("ProjectPath"), "Resources.xml")); // Só permite confirmar a edição, qdo o Studio está em "Design Mode" btnOk.Enabled = _isDesigning; // Exibir o FORM result = this.ShowDialog(); // return(result); }