diff -r 14dc2103a631 -r ed1c9f64298a trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/propertydialog/PropertyDialogEngine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/propertydialog/PropertyDialogEngine.java Wed Jun 23 14:35:40 2010 +0300 @@ -0,0 +1,698 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +* Control logic for property dialog +* +*/ +package com.nokia.tracebuilder.engine.propertydialog; + +import java.util.ArrayList; +import java.util.List; + +import com.nokia.tracebuilder.engine.SourceContextManager; +import com.nokia.tracebuilder.engine.TraceBuilderConfiguration; +import com.nokia.tracebuilder.engine.TraceBuilderDialogs; +import com.nokia.tracebuilder.engine.TraceBuilderGlobals; +import com.nokia.tracebuilder.engine.TraceLocation; +import com.nokia.tracebuilder.engine.TraceLocationList; +import com.nokia.tracebuilder.engine.TraceObjectPropertyDialog; +import com.nokia.tracebuilder.engine.TraceObjectPropertyDialogConfiguration; +import com.nokia.tracebuilder.engine.TraceObjectPropertyDialogEnabler; +import com.nokia.tracebuilder.engine.TraceObjectPropertyDialogFlag; +import com.nokia.tracebuilder.engine.TraceObjectPropertyDialogTemplate; +import com.nokia.tracebuilder.engine.TraceBuilderErrorCodes.TraceBuilderErrorCode; +import com.nokia.tracebuilder.engine.utils.TraceUtils; +import com.nokia.tracebuilder.model.Trace; +import com.nokia.tracebuilder.model.TraceBuilderException; +import com.nokia.tracebuilder.model.TraceConstantTable; +import com.nokia.tracebuilder.model.TraceConstantTableEntry; +import com.nokia.tracebuilder.model.TraceGroup; +import com.nokia.tracebuilder.model.TraceModel; +import com.nokia.tracebuilder.model.TraceModelExtension; +import com.nokia.tracebuilder.model.TraceObject; +import com.nokia.tracebuilder.model.TraceObjectUtils; +import com.nokia.tracebuilder.model.TraceParameter; +import com.nokia.tracebuilder.rules.ReadOnlyObjectRule; +import com.nokia.tracebuilder.rules.TraceParameterRestrictionRule; + +/** + * Control logic for property dialog. Separated from TraceBuilder, since it was + * getting too complex + * + */ +public class PropertyDialogEngine implements PropertyDialogConfigurationNames { + + /** + * Properties dialog is used to add and edit trace objects + */ + private TraceObjectPropertyDialog propertyDialog; + + /** + * Interface which is used to configure the property dialog + */ + private TraceObjectPropertyDialogConfiguration propertyDialogConfiguration; + + /** + * Property dialog verifier + */ + private PropertyDialogVerifier propertyDialogVerifier; + + /** + * Trace model + */ + private TraceModel model; + + /** + * Constructor + * + * @param model + * the trace model + * @param dialogConfiguration + * dialog configuration interface + */ + public PropertyDialogEngine(TraceModel model, + TraceObjectPropertyDialogConfiguration dialogConfiguration) { + this.model = model; + propertyDialogConfiguration = dialogConfiguration; + propertyDialogVerifier = new PropertyDialogVerifier(model, + propertyDialog); + } + + /** + * Changes the property dialog + * + * @param propertyDialog + * the new property dialog + */ + public void setPropertyDialog(TraceObjectPropertyDialog propertyDialog) { + this.propertyDialog = propertyDialog; + propertyDialogVerifier.setPropertyDialog(propertyDialog); + } + + /** + * Shows "Add Trace" dialog. + * + * @param group + * group proposal + * @param name + * name proposal + * @param value + * value proposal + * @param enabler + * dialog enabler interface + * @return the new trace + */ + public Trace showAddTraceDialog(TraceGroup group, String name, + String value, PropertyDialogEnabler enabler) { + return showAddTraceDialog(group, name, value, null, enabler); + } + + /** + * Shows "Add Trace" dialog. + * + * @param group + * group proposal + * @param name + * name proposal + * @param value + * value proposal + * @param extensions + * extensions for the next object + * @param enabler + * dialog enabler interface + * @return the new trace + */ + public Trace showAddTraceDialog(TraceGroup group, String name, + String value, List extensions, + PropertyDialogEnabler enabler) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + // If a group has been selected, the selection is set to the dialog + int id; + if (group != null) { + id = group.getNextTraceID(); + } else { + id = 1; + } + if (name == null) { + name = config.getText(PROPERTY_DIALOG_TRACE_NAME); + } + if (value == null) { + value = config.getText(PROPERTY_DIALOG_TRACE_TEXT); + } + if (group == null) { + group = model.findGroupByName(config + .getText(PROPERTY_DIALOG_TRACE_GROUP)); + } + name = TraceObjectUtils.modifyDuplicateTraceName(model, + TraceUtils.convertName(name)).getData(); + setAddDialogDefaults(TraceObjectPropertyDialog.ADD_TRACE, id, name, + value, group, enabler); + propertyDialog.setEnabler(enabler); + CreateTraceCallback callback = new CreateTraceCallback(model, + extensions); + showDialog(callback); + return callback.getTrace(); + } + + /** + * Shows the instrumenter dialog + * + * @param target + * the selected group + * @param enabler + * dialog enabler interface + * @param callback + * callback processing the instrumentation + */ + public void showInstrumenterDialog(TraceGroup target, + PropertyDialogEnabler enabler, RunInstrumenterCallback callback) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + String name = config.getText(PROPERTY_DIALOG_INSTRUMENTER_NAME_FORMAT); + if (name == null || name.length() == 0) { + name = TraceUtils.getDefaultNameFormat(); + } + String trace = config + .getText(PROPERTY_DIALOG_INSTRUMENTER_TRACE_FORMAT); + if (trace == null || trace.length() == 0) { + trace = TraceUtils.getDefaultTraceFormat(); + } + if (target == null) { + target = model.findGroupByName(config + .getText(PROPERTY_DIALOG_INSTRUMENTER_TRACE_GROUP)); + } + setAddDialogDefaults(TraceObjectPropertyDialog.INSTRUMENTER, 0, name, + trace, target, enabler); + SourceContextManager manager = TraceBuilderGlobals + .getSourceContextManager(); + manager.setInstrumenting(true); + try { + showDialog(callback); + } finally { + manager.setInstrumenting(false); + } + } + + /** + * Shows "Add Parameter" dialog + * + * @param trace + * owner of the new parameter + * @param enabler + * dialog enabler interface + * @return the new parameter + * @throws TraceBuilderException + * if dialog cannot be shown + */ + public TraceParameter showAddParameterDialog(Trace trace, + PropertyDialogEnabler enabler) throws TraceBuilderException { + TraceParameter retval = null; + // Trace rules are checked first + TraceParameterRestrictionRule restriction = trace + .getExtension(TraceParameterRestrictionRule.class); + ReadOnlyObjectRule readOnly = trace + .getExtension(ReadOnlyObjectRule.class); + if (readOnly == null + && (restriction == null || restriction.canAddParameters())) { + int result = PropertyDialogCallback + .showLocationConfirmationQuery(trace); + if (result == TraceBuilderDialogs.OK) { + retval = internalShowAddParameterDialog(trace, enabler); + } + } else { + throw new TraceBuilderException( + TraceBuilderErrorCode.PARAMETER_ADD_NOT_ALLOWED); + } + return retval; + } + + /** + * Shows "Select component" dialog + */ + public void showSelectComponentDialog() { + + if (propertyDialog != null) { + + // Create enabler + PropertyDialogEnabler enabler = new PropertyDialogEnabler( + PropertyDialogEnabler.ENABLE_TARGET); + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + String name = config.getText(PROPERTY_DIALOG_COMPONENT_NAME); + setAddDialogDefaults(TraceObjectPropertyDialog.SELECT_COMPONENT, 0, + name, null, model, enabler); + // Set default target to be same as previous software component + propertyDialog.setTarget(TraceBuilderGlobals + .getPreviousSoftwareComponentName()); + showDialog(new SelectComponentCallback(model)); + } + } + + /** + * Shows "Add Parameter" dialog + * + * @param trace + * owner of the new parameter + * @param enabler + * dialog enabler interface + * @return the new parameter + */ + private TraceParameter internalShowAddParameterDialog(Trace trace, + PropertyDialogEnabler enabler) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + int id = trace.getNextParameterID(); + // Parameter proposal defaults to last used value + String name = config.getText(PROPERTY_DIALOG_PARAMETER_NAME); + String type = config.getText(PROPERTY_DIALOG_PARAMETER_TYPE); + setAddDialogDefaults(TraceObjectPropertyDialog.ADD_PARAMETER, id, + TraceObjectUtils.modifyDuplicateParameterName(trace, name) + .getData(), null, trace, enabler); + propertyDialog.setValue(type); + TraceLocationList list = trace.getExtension(TraceLocationList.class); + if (list != null && list.hasLocations()) { + TraceLocation loc = (TraceLocation) list.iterator().next(); + if (loc.getParameterCount() > trace.getParameterCount()) { + String proposal = loc.getParameter(trace.getParameterCount()); + if (proposal.length() > 0) { + propertyDialog.setName(proposal); + propertyDialog.setValue(proposal); + } + } + } + CreateParameterCallback callback = new CreateParameterCallback(model, + trace); + showDialog(callback); + return callback.getParameter(); + } + + /** + * Shows "Add Constant" dialog + * + * @param table + * target constant table + * @param enabler + * dialog enabler interface + */ + public void showAddConstantDialog(TraceConstantTable table, + PropertyDialogEnabler enabler) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + String name = config.getText(PROPERTY_DIALOG_CONSTANT_NAME); + int id = 0; + if (table != null) { + id = table.getNextEntryID(); + } + setAddDialogDefaults(TraceObjectPropertyDialog.ADD_CONSTANT, id, + TraceObjectUtils.modifyDuplicateConstantName(table, name) + .getData(), null, table, enabler); + showDialog(new CreateConstantCallback(model)); + } + + /** + * Shows the "Edit Group" dialog + * + * @param group + * group to be edited + */ + public void showEditGroupDialog(TraceGroup group) { + int result = PropertyDialogCallback + .showLocationConfirmationQuery(group); + if (result == TraceBuilderDialogs.OK) { + setEditDialogDefaults(TraceObjectPropertyDialog.EDIT_GROUP, group); + showDialog(new UpdateGroupCallback(model, group)); + } + } + + /** + * Shows the "Edit Trace" dialog + * + * @param trace + * trace to be edited + */ + public void showEditTraceDialog(Trace trace) { + int result = PropertyDialogCallback + .showLocationConfirmationQuery(trace); + if (result == TraceBuilderDialogs.OK) { + setEditDialogDefaults(TraceObjectPropertyDialog.EDIT_TRACE, trace); + propertyDialog.setValue(trace.getTrace()); + showDialog(new UpdateTraceCallback(model, trace)); + } + } + + /** + * Shows the "Edit Constant Table" dialog + * + * @param table + * the table to be edited + */ + public void showEditConstantTableDialog(TraceConstantTable table) { + setEditDialogDefaults(TraceObjectPropertyDialog.EDIT_CONSTANT_TABLE, + table); + showDialog(new UpdateConstantTableCallback(model, table)); + } + + /** + * Shows the "Edit Constant" dialog + * + * @param entry + * entry to be edited + */ + public void showEditConstantDialog(TraceConstantTableEntry entry) { + setEditDialogDefaults(TraceObjectPropertyDialog.EDIT_CONSTANT, entry); + showDialog(new UpdateConstantCallback(model, entry)); + } + + /** + * Sets the default values for the dialog + * + * @param dialogType + * the dialog type + * @param id + * value for ID field + * @param name + * value for name field + * @param value + * value for value field + * @param target + * the target object + * @param enabler + * dialog enabler interface + */ + private void setAddDialogDefaults(int dialogType, int id, String name, + String value, TraceObject target, PropertyDialogEnabler enabler) { + ArrayList flags = initFlags(dialogType, + enabler); + ArrayList templates = initTemplates( + dialogType, enabler); + TraceObjectPropertyDialogTemplate selectedTemplate = findTemplateByTitle( + dialogType, templates); + propertyDialog.setVerifier(propertyDialogVerifier); + propertyDialog.setTargetObject(target); + propertyDialog.setEnabler(enabler); + propertyDialog.setDialogType(dialogType); + propertyDialog.setFlags(flags); + propertyDialog.setTemplates(templates, selectedTemplate); + propertyDialog.setID(id); + propertyDialog.setName(name); + propertyDialog.setValue(value); + } + + /** + * Creates the dialog templates array + * + * @param dialogType + * the dialog type + * @param enabler + * the dialog enabler interface + * @return the templates array + */ + private ArrayList initTemplates( + int dialogType, PropertyDialogEnabler enabler) { + ArrayList templates; + if (enabler == null || enabler.isTemplateEnabled()) { + templates = new ArrayList(); + addViewTemplates(dialogType, templates); + } else { + // If enabler interface exists and disables templates, the templates + // are not added to the dialog + templates = null; + } + return templates; + } + + /** + * Creates the dialog flags array + * + * @param dialogType + * the dialog type + * @param enabler + * dialog enabler interface + * @return the flags array + */ + private ArrayList initFlags(int dialogType, + PropertyDialogEnabler enabler) { + ArrayList flags; + if (enabler == null || enabler.isFlagsEnabled()) { + flags = new ArrayList(); + propertyDialogConfiguration.addViewFlags(flags, dialogType); + } else { + // If enabler interface exists and disables flags, the flags + // are not added to the dialog + flags = null; + } + if (flags != null) { + String flagPrefix = null; + switch (dialogType) { + case TraceObjectPropertyDialog.ADD_TRACE: + flagPrefix = PROPERTY_DIALOG_TRACE_FLAG; + break; + case TraceObjectPropertyDialog.ADD_PARAMETER: + flagPrefix = PROPERTY_DIALOG_PARAMETER_FLAG; + break; + case TraceObjectPropertyDialog.ADD_CONSTANT: + flagPrefix = PROPERTY_DIALOG_CONSTANT_FLAG; + break; + case TraceObjectPropertyDialog.INSTRUMENTER: + flagPrefix = PROPERTY_DIALOG_INSTRUMENTER_FLAG; + break; + } + // The flag values are set to what has been stored into preferences + if (flagPrefix != null) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + for (TraceObjectPropertyDialogFlag flag : flags) { + String flagName = flagPrefix + flag.getText(); + if (config.hasEntry(flagName)) { + flag.setEnabled(config.getFlag(flagName)); + } + } + } + } + return flags; + } + + /** + * Finds a template from given list by title stored into configuration + * + * @param dialogType + * the dialog type + * @param templates + * the templates list + * @return the template that should be activated + */ + private TraceObjectPropertyDialogTemplate findTemplateByTitle( + int dialogType, List templates) { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + String templateTitle = null; + switch (dialogType) { + case TraceObjectPropertyDialog.ADD_TRACE: + templateTitle = config.getText(PROPERTY_DIALOG_TRACE_TEMPLATE); + break; + case TraceObjectPropertyDialog.ADD_PARAMETER: + templateTitle = config.getText(PROPERTY_DIALOG_PARAMETER_TEMPLATE); + break; + case TraceObjectPropertyDialog.ADD_CONSTANT: + templateTitle = config.getText(PROPERTY_DIALOG_CONSTANT_TEMPLATE); + break; + case TraceObjectPropertyDialog.INSTRUMENTER: + templateTitle = config + .getText(PROPERTY_DIALOG_INSTRUMENTER_TEMPLATE); + break; + } + // Selects the template which has the title stored into preferences + TraceObjectPropertyDialogTemplate template = null; + if (templateTitle != null && templates != null) { + for (TraceObjectPropertyDialogTemplate temp : templates) { + if (temp.getTitle().equals(templateTitle)) { + template = temp; + break; + } + } + } + return template; + } + + /** + * Adds the templates to "Add" dialog + * + * @param dialogType + * the dialog type + * @param templates + * the list of templates + */ + private void addViewTemplates(int dialogType, + ArrayList templates) { + propertyDialogConfiguration.addViewTemplates(templates, dialogType); + if (dialogType != TraceObjectPropertyDialog.INSTRUMENTER) { + // Removes all templates that are not available in current context + // Instrumenter affects multiple contexts, so templates are always + // available at this point + for (int i = 0; i < templates.size(); i++) { + TraceObjectPropertyDialogTemplate template = templates.get(i); + if (template instanceof ContextBasedTemplate) { + if (!((ContextBasedTemplate) template) + .isAvailableInContext(TraceBuilderGlobals + .getSourceContextManager().getContext())) { + templates.remove(i); + i--; + } + } + } + } + } + + /** + * Initializes the edit dialog with values from object + * + * @param dialogType + * the dialog type + * @param object + * the object to be edited + */ + private void setEditDialogDefaults(int dialogType, TraceObject object) { + ArrayList list = new ArrayList(); + propertyDialogConfiguration.addViewFlags(list, dialogType); + propertyDialog.setVerifier(propertyDialogVerifier); + propertyDialog.setTargetObject(object); + propertyDialog.setEnabler(object + .getExtension(TraceObjectPropertyDialogEnabler.class)); + propertyDialog.setDialogType(dialogType); + propertyDialog.setFlags(list); + propertyDialog.setTemplates(null, null); + propertyDialog.setID(object.getID()); + propertyDialog.setName(object.getName()); + propertyDialog.setValue(null); + } + + /** + * Shows the property dialog + * + * @param callback + * the callback for OK processing + */ + private void showDialog(PropertyDialogEngineCallback callback) { + TraceBuilderErrorCode valid; + do { + int res = propertyDialog.open(); + if (res == TraceObjectPropertyDialog.OK) { + valid = TraceBuilderErrorCode.OK; + try { + callback.okSelected(propertyDialog); + saveData(); + } catch (TraceBuilderException e) { + valid = (TraceBuilderErrorCode) e.getErrorCode(); + TraceBuilderGlobals.getEvents().postError(e); + } + } else { + valid = TraceBuilderErrorCode.OK; + } + } while (valid != TraceBuilderErrorCode.OK); + } + + /** + * Saves the data into properties for later use + */ + private void saveData() { + TraceBuilderConfiguration config = TraceBuilderGlobals + .getConfiguration(); + String templateTitle = null; + TraceObjectPropertyDialogTemplate template = propertyDialog + .getTemplate(); + // Template is saved based on localized title -> Not so good but works + if (template != null) { + templateTitle = template.getTitle(); + } + if (templateTitle == null) { + templateTitle = ""; //$NON-NLS-1$ + } + String flagPrefix = getFlagPrefix(config, templateTitle); + if (flagPrefix != null) { + List flags = propertyDialog + .getFlags(); + if (flags != null) { + for (int i = 0; i < flags.size(); i++) { + TraceObjectPropertyDialogFlag flag = flags.get(i); + config.setFlag(flagPrefix + flag.getText(), flag + .isEnabled()); + } + } + } + } + + /** + * Gets the prefix for flags and saves other properties + * + * @param config + * the configuration + * @param templateTitle + * the template title + * @return the prefix + */ + private String getFlagPrefix(TraceBuilderConfiguration config, + String templateTitle) { + String flagPrefix = null; + // Each dialog type is separately saved + switch (propertyDialog.getDialogType()) { + case TraceObjectPropertyDialog.ADD_TRACE: + config + .setText(PROPERTY_DIALOG_TRACE_NAME, propertyDialog + .getName()); + config.setText(PROPERTY_DIALOG_TRACE_TEXT, propertyDialog + .getValue()); + config.setText(PROPERTY_DIALOG_TRACE_TEMPLATE, templateTitle); + config.setText(PROPERTY_DIALOG_TRACE_GROUP, propertyDialog + .getTarget()); + flagPrefix = PROPERTY_DIALOG_TRACE_FLAG; + break; + case TraceObjectPropertyDialog.ADD_PARAMETER: + config.setText(PROPERTY_DIALOG_PARAMETER_NAME, propertyDialog + .getName()); + config.setText(PROPERTY_DIALOG_PARAMETER_TYPE, propertyDialog + .getValue()); + config.setText(PROPERTY_DIALOG_PARAMETER_TEMPLATE, templateTitle); + flagPrefix = PROPERTY_DIALOG_PARAMETER_FLAG; + break; + case TraceObjectPropertyDialog.SELECT_COMPONENT: + config.setText(PROPERTY_DIALOG_COMPONENT_NAME, propertyDialog + .getName()); + config.setText(PROPERTY_DIALOG_SELECT_COMPONENT_TEMPLATE, + templateTitle); + flagPrefix = PROPERTY_DIALOG_COMPONENT_FLAG; + break; + case TraceObjectPropertyDialog.ADD_CONSTANT: + config.setText(PROPERTY_DIALOG_CONSTANT_NAME, propertyDialog + .getName()); + config.setText(PROPERTY_DIALOG_CONSTANT_TEMPLATE, templateTitle); + flagPrefix = PROPERTY_DIALOG_CONSTANT_FLAG; + break; + case TraceObjectPropertyDialog.INSTRUMENTER: + config.setText(PROPERTY_DIALOG_INSTRUMENTER_NAME_FORMAT, + propertyDialog.getName()); + config.setText(PROPERTY_DIALOG_INSTRUMENTER_TRACE_FORMAT, + propertyDialog.getValue()); + config + .setText(PROPERTY_DIALOG_INSTRUMENTER_TEMPLATE, + templateTitle); + flagPrefix = PROPERTY_DIALOG_INSTRUMENTER_FLAG; + config.setText(PROPERTY_DIALOG_INSTRUMENTER_TRACE_GROUP, + propertyDialog.getTarget()); + break; + } + return flagPrefix; + } +} \ No newline at end of file