вторник, 17 декабря 2013 г.

Как добраться до свойства определенного в бине


Можно через функцию  JSFUtils.resolveExpression() например так:


RichCommandLink link = (RichCommandLink)JSFUtils.resolveExpression(
            "#{viewScope.ContractsTableBean.warningLink}");




Сама функция(метод JSFUtils) определена так:

/**
      * Method for taking a reference to a JSF binding expression and returning
      * the matching object (or creating it).
      * @param expression EL expression
      * @return Managed object
      */
     public static Object resolveExpression(String expression)
     {
       FacesContext facesContext = getFacesContext();
       Application app = facesContext.getApplication();
       ExpressionFactory elFactory = app.getExpressionFactory();
       ELContext elContext = facesContext.getELContext();
       ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
       return valueExp.getValue(elContext);
     }

четверг, 12 декабря 2013 г.

воскресенье, 8 декабря 2013 г.

Форма для редактирования с кнопкой Edit

1) Добавляем во VO rowstatus





2) Добавляем во VO edit

3) В xxxVOImpl.java вешаем метод для отмены изменений, примерно такой


    public void clearAllCache() {
      //dont ask
      ViewRowSetImpl drsi = super.getDefaultRowSetInternal();
      while(drsi.hasNext()) {
        Row item = drsi.next();
      }
      Iterator iter = super.getEntityDef(0).getAllEntityInstancesIterator(this.getDBTransaction());
      while(iter.hasNext()) {
        EntityImpl entityItem = (EntityImpl) iter.next();
        byte status = entityItem.getEntityState();
          String s = ((status == EntityImpl.STATUS_MODIFIED) ? " STATUS_MODIFIED" : "")
          + ((status == EntityImpl.STATUS_NEW) ? " STATUS_NEW" : "")
          + ((status == EntityImpl.STATUS_DELETED) ? " STATUS_DELETED" : "")
          + ((status == EntityImpl.STATUS_DEAD) ? " STATUS_DEAD" : "")
          + ((status == EntityImpl.STATUS_INITIALIZED) ? " STATUS_INITIALIZED" : "")
          + ((status == EntityImpl.STATUS_UNMODIFIED) ? " STATUS_UNMODIFIED" : "");
          System.err.println(" --- "+ s);
       
        if(status == EntityImpl.STATUS_NEW
          || status == EntityImpl.STATUS_DELETED) {
            entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS
                | EntityImpl.REFRESH_UNDO_CHANGES);
        }
        if(status == EntityImpl.STATUS_MODIFIED) {
            entityItem.refresh(EntityImpl.REFRESH_WITH_DB_FORGET_CHANGES);
        }
        getViewObject().clearCache();

    }
 
4) В форму добавляем поле с кнопкой для редактирования


5) На кнопку вешаем PropertyListner   To: #{row.bindings.edit.inputValue}




) Свойство таблицы EditMode выставляем - onClickEdit

6) Добавляем на форму кнопку New с таким обработчиком событий:
#{bindings.CreateInsert.execute}. При этом нужно не забыть добавить action CreateInsert в binding!


7) Добавляем кнопку Save с обработчиком вызывающем такой метод:


    public void onSave(ActionEvent actionEvent) {
        // Add event code here...
        //System.out.println("--- onSave");
        ViewObject viewObject = getCurrentVO();
        RowSetIterator iterator = viewObject.createRowSetIterator(null);
        iterator.reset();
        while (iterator.hasNext()) {
        Row row = iterator.next();
        // process the row here
            row.setAttribute("edit",false);
        }
        iterator.closeRowSetIterator();
     
        super.onCommit(actionEvent);
    }


8) Добавляем кнопку Undo Changes обработчиком вызывающем такой метод:

    public void onRollback(ActionEvent actionEvent) {
        ((xxxVOImpl)getCurrentVO()).clearAllCache();
        getCurrentVO().executeQuery();
        
        if(getUpdComponent()!= null)
          AdfFacesContext.getCurrentInstance().addPartialTarget(getUpdComponent());
    }


9) Добавляем в xxxVORowImpl.java два метода, которые будут учитывать свойство edit записи:


    @Override
    public boolean isAttributeUpdateable(int i) {
        Boolean ed = this.getedit();
        if(ed == null) {
            return false;  
        }
        if(ed.equals(true)) {
            return super.isAttributeUpdateable(i);  
        } else {
            return false;
        }
    }

    @Override
    protected void create(AttributeList attributeList) {
        attributeList.setAttribute("edit", true);
        super.create(attributeList);
    }






------------------------------------------------------------------------------------------------------
Выделяем цветом редактируемые записи

inlineStyle="#{backingBeanScope.backing_ServiceTypesPriceV.cellColor}">
------------------------------------------------------------------------------------------------------


    /*
    * Управляем доступностью кнопок Edit, Delete
    */
    public void tableSelectionListener(SelectionEvent selectionEvent) {
        ADFUtil.invokeEL("#{bindings.PV_ViewObj2.collectionModel.makeCurrent}", new Class[] {SelectionEvent.class},
                             new Object[] { selectionEvent });
            // get the selected row , by this you can get any attribute of that row
            //Row selectedRow =
            //    (Row)ADFUtil.evaluateEL("#{bindings."+ iterator_name +".currentRow}"); // get the current selected row
            Row selectedRow = this.getCurrentRow();
            BigDecimal no = (BigDecimal) selectedRow.getAttribute("StatusId");
            if(no.intValue() == 1) {
                this.cb5.setDisabled(false);
                this.cb2.setDisabled(false);
                //System.out.println("--- cb5.setDisabled(false) " );
            } else {
                //this.cb5.setDisabled(true);
                //this.cb2.setDisabled(true);
                //System.out.println("--- cb5.setDisabled(true) " );
            }
    }

Как отменить изменения только в одном VO

Rollback не годится, т.к. сбрасывает изменения во всём модуле для всех VO. Поэтому чтобы  справиться с задачей модифицируем класс xxxVOImpl добавив в него метод


    public void clearAllCache() {
      //dont ask
      ViewRowSetImpl drsi = super.getDefaultRowSetInternal();
      while(drsi.hasNext()) {
        Row item = drsi.next();
      }
      Iterator iter = super.getEntityDef(0).getAllEntityInstancesIterator(this.getDBTransaction());
      while(iter.hasNext()) {
        EntityImpl entityItem = (EntityImpl) iter.next();
        byte status = entityItem.getEntityState();
          String s = ((status == EntityImpl.STATUS_MODIFIED) ? " STATUS_MODIFIED" : "")
          + ((status == EntityImpl.STATUS_NEW) ? " STATUS_NEW" : "")
          + ((status == EntityImpl.STATUS_DELETED) ? " STATUS_DELETED" : "")
          + ((status == EntityImpl.STATUS_DEAD) ? " STATUS_DEAD" : "")
          + ((status == EntityImpl.STATUS_INITIALIZED) ? " STATUS_INITIALIZED" : "")
          + ((status == EntityImpl.STATUS_UNMODIFIED) ? " STATUS_UNMODIFIED" : "");
          System.err.println(" --- "+ s);
       
        if(status == EntityImpl.STATUS_NEW
          || status == EntityImpl.STATUS_DELETED) {
            entityItem.refresh(EntityImpl.REFRESH_REMOVE_NEW_ROWS
                | EntityImpl.REFRESH_UNDO_CHANGES);
        }
        if(status == EntityImpl.STATUS_MODIFIED) {
            entityItem.refresh(EntityImpl.REFRESH_WITH_DB_FORGET_CHANGES);
        }
       
      }
      getViewObject().clearCache();
    }


 Идея заключается в том, что проходим по всем записям VO и в зависимости от их состояния делаем refresh.

ссыль

четверг, 5 декабря 2013 г.

Как сделать кнопку активной/пассивной в зависимости от записи в таблице

Можно задать свойство disabled для этой кнопки


Кнопка будет доступна когда значение статуса равно 'N'
#{bindings.Status.inputValue eq 'N' ? 'false' : 'true'} 

четверг, 7 ноября 2013 г.

CheckBox в таблице связанный с INTEGER полем базы

В БД есть поле do_flg типа INTEGER со значениями 0(ложь), 1(истина), которое нужно отображать в таблице интерфейса в виде чекбокса.


  • Создаем в xxxEO транзиентный(!) атрибут flg типа Boolean всегда изменяемый.
  • Добавляем flg в xxxVO где ставим его ControlType CheckBox
  • В классе xxxEOImpl.java переопределяем методы доступа к flg так, чтобы они были привязаны к полю do_flg
    public Boolean getFlg() {
        Number n = (Number)getAttributeInternal(DOFLG);
        if( n != null && n.longValue()== 1) {
            return new Boolean(true);
        }
        return new Boolean(false);
    }

    public void setFlg(Boolean value) {
        if(value == null || !value.booleanValue())
            setAttributeInternal(DOFLG, new BigDecimal(0));
        else 
            setAttributeInternal(DOFLG, new BigDecimal(1));
        setAttributeInternal(FLG, value);
    }


Всё. Теперь все изменения flg будут приводить к изменению do_flg/