protected void setEditorLanguageObject(ILanguageObject theEditorLangObj) {
    getEditor().setLanguageObject(savedSelection);

    if (!editor.isEnabled()) {
      editor.setEnabled(true);
    }
  }
  @Override
  public void create() {
    super.create();

    editor = createEditor(pnlEditorDetail);
    editor
        .getModel()
        .addModelListener(
            new ILanguageObjectEditorModelListener() {
              public void modelChanged(LanguageObjectEditorModelEvent theEvent) {
                handleModelChanged();
              }
            });

    lblTitle.setText(editor.getTitle());

    Composite pnlEditorButtons = new Composite(pnlEditor, SWT.NONE);
    pnlEditorButtons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
    pnlEditorButtons.setLayout(new GridLayout());

    //
    // pnlEditorButtons contents
    //

    btnSet = new Button(pnlEditorButtons, SWT.NONE);
    btnSet.setEnabled(false);
    btnSet.setText(Util.getString(PREFIX + "btnSet")); // $NON-NLS-1$
    btnSet.setToolTipText(Util.getString(PREFIX + "btnSet.tip")); // $NON-NLS-1$
    btnSet.addSelectionListener(
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent theEvent) {
            handleSetSelected();
          }
        });

    btnReset = new Button(pnlEditorButtons, SWT.NONE);
    btnReset.setEnabled(false);
    btnReset.setText(Util.getString(PREFIX + "btnReset")); // $NON-NLS-1$
    btnReset.setToolTipText(Util.getString(PREFIX + "btnReset.tip")); // $NON-NLS-1$
    btnReset.addSelectionListener(
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent theEvent) {
            handleResetSelected();
          }
        });

    setLanguageObject(null); // needed to establish the viewer input

    // select root tree node after all construction is finished
    Display.getDefault()
        .asyncExec(
            new Runnable() {
              public void run() {
                treeViewer.selectRoot();
              }
            });
  }
  protected void handleDeleteSelected() {
    editor.clear();
    treeViewer.deleteSelection();

    // update SQL text
    setCurrentSql(treeViewer.getLanguageObject());

    editor.acceptFocus();
  }
  void handleModelChanged() {
    boolean isEnabled = false;
    boolean isComplete = false;
    boolean hasChanged = false;
    isEnabled = editor.isEnabled();
    if (isEnabled) {
      isComplete = editor.isComplete();
    }
    if (isComplete) {
      hasChanged = editor.hasChanged();
    }
    boolean state = (isEnabled && isComplete && hasChanged);
    btnSet.setEnabled(state);
    btnReset.setEnabled(state);

    setCurrentSql(treeViewer.getLanguageObject());

    // set enable/disable status of buttons
    setEnabledStatus();
  }
  protected void handleTreeSelection() {
    IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
    Object selectedObj = selection.getFirstElement();

    if (selectedObj == null) {
      savedSelection = null;

      if (editor.isEnabled()) {
        editor.setEnabled(false);
      }
    } else {
      // selection with either be a LanguageObject or an Undefined object (String)
      savedSelection =
          (selectedObj instanceof ILanguageObject) ? (ILanguageObject) selectedObj : null;
    }

    setEditorLanguageObject(savedSelection);

    // set enable/disable status of buttons
    setEnabledStatus();
  }
  protected void handleSetSelected() {
    editor.save();

    // need the editor's language object in order to update tree.
    // the language object should never be null. if it was this handler should not have been called
    ILanguageObject langObj = editor.getLanguageObject();

    CoreArgCheck.isNotNull(
        langObj,
        Util.getString(
            PREFIX + "nullLangObj", // $NON-NLS-1$
            new Object[] {"handleSetSelected"})); // $NON-NLS-1$

    // update tree
    treeViewer.modifySelectedItem(langObj, false);

    // update SQL text
    setCurrentSql(treeViewer.getLanguageObject());

    // put focus back on editor from the set button
    editor.acceptFocus();
  }
  protected void handleResetSelected() {
    editor.reset();

    // put focus back on editor from the reset button
    editor.acceptFocus();
  }