private void createSysnonymListColumne() {

    TableViewColumnDefine[] tableColumnDef =
        new TableViewColumnDefine[] { //
          new TableViewColumnDefine(
              "SYNONYM_NAME",
              Messages.get().TadpoleSynonymComposite_5,
              100,
              SWT.LEFT) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "TABLE_OWNER",
              Messages.get().TadpoleSynonymComposite_7,
              60,
              SWT.LEFT) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "OBJECT_TYPE",
              Messages.get().TadpoleSynonymComposite_9,
              70,
              SWT.CENTER) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "TABLE_NAME",
              Messages.get().TadpoleSynonymComposite_11,
              100,
              SWT.LEFT) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "COMMENTS", Messages.get().TadpoleSynonymComposite_13, 100, SWT.LEFT) // //$NON-NLS-1$
        };

    ColumnHeaderCreator.createColumnHeader(synonymListViewer, tableColumnDef);

    synonymListViewer.setContentProvider(new ArrayContentProvider());
    synonymListViewer.setLabelProvider(new DefaultLabelProvider(synonymListViewer));
  }
  private void createSynonymDetailColumne() {
    TableViewColumnDefine[] tableColumnDef =
        new TableViewColumnDefine[] { //
          new TableViewColumnDefine(
              "COLUMN_ID",
              Messages.get().TadpoleSynonymComposite_15,
              50,
              SWT.RIGHT) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "COLUMN_NAME",
              Messages.get().TadpoleSynonymComposite_17,
              100,
              SWT.LEFT) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "DATA_TYPE",
              Messages.get().TadpoleSynonymComposite_19,
              80,
              SWT.CENTER) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "NULLABLE",
              Messages.get().TadpoleSynonymComposite_21,
              60,
              SWT.CENTER) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "KEY", Messages.get().TadpoleSynonymComposite_23, 50, SWT.CENTER) // //$NON-NLS-1$
          ,
          new TableViewColumnDefine(
              "COMMENTS", Messages.get().TadpoleSynonymComposite_25, 100, SWT.LEFT) // //$NON-NLS-1$
        };

    ColumnHeaderCreator.createColumnHeader(synonymColumnViewer, tableColumnDef);

    synonymColumnViewer.setContentProvider(new ArrayContentProvider());
    synonymColumnViewer.setLabelProvider(new DefaultLabelProvider(synonymColumnViewer));
  }
  /**
   * 정보를 최신으로 리프레쉬합니다.
   *
   * @param strObjectName
   */
  public void refreshSynonym(
      final UserDBDAO selectUserDb, final boolean boolRefresh, final String strObjectName) {
    if (!boolRefresh) if (selectUserDb == null) return;
    this.userDB = selectUserDb;

    Job job =
        new Job(Messages.get().MainEditor_45) {
          @Override
          public IStatus run(IProgressMonitor monitor) {
            monitor.beginTask("Connect database", IProgressMonitor.UNKNOWN); // $NON-NLS-1$

            try {
              showSynonyms = getSynonymList(userDB);
            } catch (Exception e) {
              logger.error("Synonym Referesh", e); // $NON-NLS-1$

              return new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage());
            } finally {
              monitor.done();
            }

            return Status.OK_STATUS;
          }
        };

    job.addJobChangeListener(
        new JobChangeAdapter() {

          public void done(IJobChangeEvent event) {
            final IJobChangeEvent jobEvent = event;

            getSite()
                .getShell()
                .getDisplay()
                .asyncExec(
                    new Runnable() {
                      public void run() {
                        if (jobEvent.getResult().isOK()) {
                          synonymListViewer.setInput(showSynonyms);
                          synonymListViewer.refresh();
                          TableUtil.packTable(synonymListViewer.getTable());

                          // select tabitem
                          getTabFolderObject().setSelection(tbtmSynonym);

                          selectDataOfTable(strObjectName);
                        } else {
                          if (showSynonyms != null) showSynonyms.clear();
                          synonymListViewer.setInput(showSynonyms);
                          synonymListViewer.refresh();
                          TableUtil.packTable(synonymListViewer.getTable());

                          Status errStatus =
                              new Status(
                                  IStatus.ERROR,
                                  Activator.PLUGIN_ID,
                                  jobEvent.getResult().getMessage(),
                                  jobEvent.getResult().getException()); // $NON-NLS-1$
                          ExceptionDetailsErrorDialog.openError(
                              null,
                              "Error",
                              Messages.get().ExplorerViewer_86,
                              errStatus); //$NON-NLS-1$
                        }
                      }
                    }); // end display.asyncExec
          } // end done
        }); // end job

    job.setName(userDB.getDisplay_name());
    job.setUser(true);
    job.schedule();
  }
  private void createWidget(final CTabFolder tabFolderObject) {
    tbtmSynonym = new CTabItem(tabFolderObject, SWT.NONE);
    tbtmSynonym.setText(Messages.get().TadpoleSynonymComposite_0);
    tbtmSynonym.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.SYNONYM.name());

    Composite compositeTables = new Composite(tabFolderObject, SWT.NONE);
    tbtmSynonym.setControl(compositeTables);
    GridLayout gl_compositeTables = new GridLayout(1, false);
    gl_compositeTables.verticalSpacing = 2;
    gl_compositeTables.horizontalSpacing = 2;
    gl_compositeTables.marginHeight = 2;
    gl_compositeTables.marginWidth = 2;
    compositeTables.setLayout(gl_compositeTables);
    compositeTables.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    SashForm sashForm = new SashForm(compositeTables, SWT.NONE);
    sashForm.setOrientation(SWT.VERTICAL);
    sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정.
    synonymListViewer = new TableViewer(sashForm, SWT.BORDER | SWT.FULL_SELECTION);
    synonymListViewer.addDoubleClickListener(
        new IDoubleClickListener() {
          public void doubleClick(DoubleClickEvent event) {
            try {
              IStructuredSelection is = (IStructuredSelection) event.getSelection();
              if (null != is) {
                OracleSynonymDAO tableDAO = (OracleSynonymDAO) is.getFirstElement();

                if (PublicTadpoleDefine.OBJECT_TYPE
                    .FUNCTIONS
                    .toString()
                    .startsWith(tableDAO.getObject_type())) {
                  AbstractRDBDDLScript rdbScript =
                      new OracleDDLScript(userDB, PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS);
                  ProcedureFunctionDAO dao = new ProcedureFunctionDAO();
                  dao.setName(tableDAO.getTable_name());

                  FindEditorAndWriteQueryUtil.run(
                      userDB,
                      rdbScript.getFunctionScript(dao),
                      PublicTadpoleDefine.OBJECT_TYPE.FUNCTIONS);
                }
              }
            } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            }
          }
        });
    synonymListViewer.addPostSelectionChangedListener(
        new ISelectionChangedListener() {
          public void selectionChanged(SelectionChangedEvent event) {
            try {
              IStructuredSelection is = (IStructuredSelection) event.getSelection();
              Object synonymDAO = is.getFirstElement();

              if (synonymDAO != null) {
                OracleSynonymDAO synonym = (OracleSynonymDAO) synonymDAO;

                if (selectSynonymName.equals(synonym.getSynonym_name())) return;
                selectSynonymName = synonym.getSynonym_name();

                SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
                Map<String, String> mapParam = new HashMap<String, String>();
                mapParam.put("db", userDB.getDb()); // $NON-NLS-1$
                mapParam.put("owner", synonym.getTable_owner()); // $NON-NLS-1$
                mapParam.put("table", synonym.getTable_name()); // $NON-NLS-1$

                showSynonymColumns =
                    sqlClient.queryForList("synonymColumnList", mapParam); // $NON-NLS-1$

              } else showSynonymColumns = null;

              synonymColumnViewer.setInput(showSynonymColumns);
              synonymColumnViewer.refresh();

            } catch (Exception e) {
              logger.error("get table column", e); // $NON-NLS-1$

              Status errStatus =
                  new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); // $NON-NLS-1$
              ExceptionDetailsErrorDialog.openError(
                  tabFolderObject.getShell(), "Error", e.getMessage(), errStatus); // $NON-NLS-1$
            }
          }
        });

    Table tableTableList = synonymListViewer.getTable();
    tableTableList.setLinesVisible(true);
    tableTableList.setHeaderVisible(true);

    createSynonymMenu();

    // columns
    synonymColumnViewer = new TableViewer(sashForm, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
    synonymColumnViewer.addDoubleClickListener(
        new IDoubleClickListener() {
          public void doubleClick(DoubleClickEvent event) {
            IStructuredSelection is = (IStructuredSelection) event.getSelection();

            if (null != is) {
              OracleSynonymColumnDAO synonymDAO = (OracleSynonymColumnDAO) is.getFirstElement();
              FindEditorAndWriteQueryUtil.runAtPosition(synonymDAO.getColumn_name());
            }
          }
        });
    Table tableTableColumn = synonymColumnViewer.getTable();
    tableTableColumn.setHeaderVisible(true);
    tableTableColumn.setLinesVisible(true);

    createSysnonymListColumne();
    createSynonymDetailColumne();

    synonymListViewer.setInput(showSynonyms);
    synonymListViewer.refresh();

    synonymFilter = new DefaultTableColumnFilter();
    synonymListViewer.addFilter(synonymFilter);

    sashForm.setWeights(new int[] {1, 1});
  }
  @Override
  public void run(IStructuredSelection selection, UserDBDAO userDB, OBJECT_TYPE actionType) {
    try {
      PublicTadpoleDefine.QUERY_DML_TYPE queryType = QUERY_DML_TYPE.INSERT;
      if (queryType == QUERY_DML_TYPE.INSERT) {
        if (PublicTadpoleDefine.YES_NO
            .YES
            .name()
            .equals(userDB.getDbAccessCtl().getInsert_lock())) {
          throw new Exception(Messages.get().MainEditor_21);
        }
      }
      queryType = QUERY_DML_TYPE.UPDATE;
      if (queryType == QUERY_DML_TYPE.UPDATE) {
        if (PublicTadpoleDefine.YES_NO
            .YES
            .name()
            .equals(userDB.getDbAccessCtl().getUpdate_lock())) {
          throw new Exception(Messages.get().MainEditor_21);
        }
      }
      queryType = QUERY_DML_TYPE.DELETE;
      if (queryType == QUERY_DML_TYPE.DELETE) {
        if (PublicTadpoleDefine.YES_NO
            .YES
            .name()
            .equals(userDB.getDbAccessCtl().getDelete_locl())) {
          throw new Exception(Messages.get().MainEditor_21);
        }
      }
    } catch (Exception e) {
      MessageDialog.openError(
          getWindow().getShell(), Messages.get().ObjectDeleteAction_2, e.getMessage());
      return;
    }

    try {
      if (!GrantCheckerUtils.ifExecuteQuery(userDB)) return;
    } catch (Exception e) {
      MessageDialog.openError(
          getWindow().getShell(), Messages.get().ObjectDeleteAction_2, e.getMessage());
      return;
    }

    TableDAO tableDAO = (TableDAO) selection.getFirstElement();
    try {
      // get the table columns
      SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
      Map<String, String> mapParam = new HashMap<String, String>();
      mapParam.put("db", userDB.getDb()); // $NON-NLS-1$
      mapParam.put("table", tableDAO.getName()); // $NON-NLS-1$
      List showTableColumns = sqlClient.queryForList("tableColumnList", mapParam); // $NON-NLS-1$

      // Open the table director editor
      IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

      DBTableEditorInput dbEditorInput = new DBTableEditorInput(tableDAO, userDB, showTableColumns);
      page.openEditor(dbEditorInput, TableInformationEditor.ID, false);
    } catch (Exception e) {
      logger.error("Load the table data", e); // $NON-NLS-1$

      Status errStatus =
          new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); // $NON-NLS-1$
      ExceptionDetailsErrorDialog.openError(
          null, "Error", Messages.get().ExplorerViewer_39, errStatus); // $NON-NLS-1$
    }
  }
  public TableDataEditorAction(IWorkbenchWindow window, OBJECT_TYPE actionType) {
    super(window, actionType);

    setId(ID + actionType);
    setText(Messages.get().TableDataEditorAction_1);
  }