Teamcenter. Настройка форм с помощью FORMJAVARENDERING

статья в работе, не описан loadrendering

Как известно из Rich Client Customization Programmer's Guide возможно создание собственных форм путем расширения класса AbsractRendering. При этом необходимо реализовать сохранения данных получаемых из экранной формы непосредственно в свойства класса хранения мастер-формы, т.е. в соответствующий объект класса TCComponentForm. Именно с получением нужного объекта TCComponentForm и могут быть проблемы, так как в зависимости от контекста вызова формы, источник TCComponentForm будет различен.

Пример

Рассмотрим эти варианты на примере объекта MyItem (Изделие) и MyItemRevision (Модификация изделия). Создание новых форм происходит путем создание классов MyItemForm и MyItemRevisionForm в пакете com.my.forms. Соответственно в пакете com.teamcenter.rac.stylesheet в файле stylesheet_user.properties необходимо связать классы хранения форм и классы отображения.

stylesheet_user.properties
MyItem\ Master.FORMJAVARENDERING=com.my.forms.MyItemForm
MyItemRevision\ Master.FORMJAVARENDERING=com.my.forms.MyItemRevisionForm

Далее в классах необходимо предусмотреть следующие варианты использования форм:

  • Создание нового объекта (изделия, совместно с модификацией) - при этом форма отображается внутри мастера создания нового Изделия. Самого Изделия и модификации на момент отображения формы ещё не существует в хранилище Teamcenter, существует только элемент в оперативной памяти связанный с свойством панели мастера (TCComponentItem)NewItemPanel.newComponent. Получить доступ к этому свойству можно через промежуточные родительские элементы ГПИ. Причем объект хранения формы (TCComponentForm) переданный конструктору класса формы не соответствует реальному объекту хранения ассоциированному с соответствующим Изделием или Модификацией.
  • Просмотр существующего объекта - при этом соответствующий объект хранения формы (TCComponentForm) передается конструктору класса формы, так как Изделия и Модификация уже есть в хранилище Teamcenter.
  • Пересмотр изделия (создание новой модификации) - следует учитывать при разработке формы модификации изделия (наследника Item Revision).

В качестве примера приведу реализацию MyItemRevisionForm. Следует учитывать что данный класс не использовался в реальной разработке, конструируется исключительно для примера к статье, и возможно содержит ошибки.

MyItemRevisionForm.java
package com.my.forms;
 
import com.teamcenter.rac.stylesheet.*;
import com.teamcenter.rac.kernel.TCComponentForm;
import com.teamcenter.rac.kernel.TCComponent;
import com.teamcenter.rac.kernel.TCSession;
import com.teamcenter.rac.kernel.TCException;
import java.awt.BorderLayout;
import java.awt.Container;
import java.util.Date;
import com.teamcenter.rac.aif.AbstractAIFOperation;
import com.teamcenter.rac.aif.kernel.AIFComponentContext;
import com.teamcenter.rac.util.MessageBox;
import com.teamcenter.rac.kernel.TCComponentItem;
import com.teamcenter.rac.kernel.TCComponentItemRevision;
import com.teamcenter.rac.commands.newitem.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import com.teamcenter.rac.kernel.TCComponentItemType;
import com.teamcenter.rac.util.Registry;
 
public class MyItemRevisionForm extends AbstractRendering {
 
   TCComponentForm form = null;
   SmartTCEForm sform = null;    
 
   TCComponentForm rev_form = null;
   SmartTCEForm sform_rev = null;
 
   TCSession session;
   InterfaceFormPanel innerPanel;
   DSEUserData data;
 
   // Класс используется для сохранения свойств формы в класс хранения
   class SaveOperation extends AbstractAIFOperation {
      protected void doSave(TCComponentForm form1, SmartTCEForm sform1) throws Exception {
         form1.lock();
         sform1.setFormPropertySafe("HR100", data.diametr);
         sform1.setFormPropertySafe(NR.fld_DSE_CODE, data.code_dse);
         sform1.setFormPropertySafe(NR.fld_FORMAT, data.format);
         sform1.setFormPropertySafe(NR.fld_MASSA, data.massa);
         // ... заполняются поля в соответствии с NameResolver
         sform1.setFormPropertySafe(NR.fld_MARKA_MAT, data.mater_mark);
         sform1.setFormPropertySafe(NR.fld_VID_ZAGOT, data.mater_zagot);
         form1.save();
         form1.unlock();
      }
 
      public void executeOperation() throws Exception {
         innerPanel.saveToUserData();
         if (sform_rev == null) {
            // открывается для просмотра существующая уже ревизия
            doSave(form, sform);
         } else {
            // создается новая ревизия для нового объекта
            doSave(rev_form, sform_rev);
         }  	
   }
 
   // Конструктор
   public MyItemRevisionForm(TCComponentForm theForm) throws Exception {
      super(theForm);
      form = theForm; 
      session = (TCSession) form.getSession();
      loadRendering();
   }
 
   public void saveRendering() {
 
      // если форма используется для просмотра существующей ревизии то data.item_rev будет заполнена в loadRendering
      // если data.item_rev=null то значит форма либо используется в мастере создания, либо при создании нового Изделия,
      // либо при пересмотре существующего (создании новой Модификации)
      if (data.item_rev == null) {
         // проходим вверх по элементам ГПИ чтобы получить item
         JPanel parentPanel = (JPanel) ((JPanel) this).getParent();
         JViewport enclosing = (JViewport) parentPanel.getParent();
         JScrollPane scrolpan1 = (JScrollPane) enclosing.getParent();
         ItemRevMasterFormPanel irmfp1 = (ItemRevMasterFormPanel) scrolpan1.getParent();
         NewItemPanel itemPanel1 = (NewItemPanel) irmfp1.controlWizardPanel;
         data.item = (TCComponentItem) itemPanel1.newComponent; // получаем item
         // если null, то значит создается новая модификация (пересмотр), берем форму из текущего компонента
         if (data.item == null) {
            rev_form = (TCComponentForm) this.component;
            sform_rev = new SmartTCEForm(rev_form);			
         } else {
            try {
               data.item_rev = data.item.getLatestItemRevision();
            } catch (Exception e) {
               // TODO: Можно тут описать обработчик
            }
            if (data.item_rev != null) {
               try {
                  rev_form = (TCComponentForm) data.item_rev.getRelatedComponent("IMAN_master_form_rev");
                  sform_rev = new SmartTCEForm(rev_form);
               } catch (TCException e) {
                  e.printStackTrace();
               }
            } //if
         } //else
      } //if
 
      SaveOperation operation = new SaveOperation(); // класс SaveOperation описан выше
      try {
         session.queueOperation(operation); // не ждет конца операции, чтобы не было фризов
      } catch (Exception ex) {
         MessageBox.post(ex);
      }     
   } //saveRendering
 
}   

Вспомогательные классы:

  • SmartTCEForm - используется для упрощения оперирования с свойствами формы
  • NameResolver - разрешает имена свойств в значения имен
SmartTCEForm.java
package com.my.forms;
 
import com.teamcenter.rac.kernel.TCComponentForm;
import com.teamcenter.rac.kernel.TCException;
import com.teamcenter.rac.kernel.TCProperty;
import com.teamcenter.rac.kernel.TCPropertyDescriptor;
import com.teamcenter.rac.util.MessageBox;
import java.io.PrintStream;
import java.util.Date;
 
public class SmartTCEForm {
   TCComponentForm form;
 
   public SmartTCEForm(TCComponentForm theForm) {
      System.out.println("SmartTCEForm");
      this.form = theForm;
   }
 
   public Object getFormPropertyObj(String sName) throws TCException {
      TCProperty prop = this.form.getTCProperty(sName);	
      if (prop == null) {
         String s = "Не найден атрибут формы " + this.form + ": '" + sName + "'";
         throw new TCException(s);
      }		
      TCPropertyDescriptor propDesc = prop.getDescriptor();
      switch (propDesc.getType()) {
         case 8: 
            return prop.getStringValue();
         case 2: 
            return prop.getDateValue();
         case 3: 
            return new Double(prop.getDoubleValue());
         case 4: 
            return new Float(prop.getFloatValue());
         case 6: 
            return new Boolean(prop.getLogicalValue());
      }
      return null;
   }
 
   public void setFormPropertySafe(String sName, Object Value) throws TCException {
      TCProperty prop = this.form.getFormTCProperty(sName);
      if (prop == null)
         throw new TCException("Не найден атрибут формы " + this.form + ": '" + sName + "'");
      TCPropertyDescriptor propDesc = prop.getDescriptor();	
      switch (propDesc.getType()) {
         case 8: 
            int len = propDesc.getMaxStringLength();
            String sValue = (String)Value;
            if (sValue.length() > len) {
               MessageBox.post("Значение '" + sValue + "' свойства '" +
                  sName + "' превышает допустимую длину поля = " + len + 
                  "\nСтрока урезана до допустимой длины!", 
                  "Сохранение формы " + this.form.toString(), 4);
               sValue = sValue.substring(0, len);
            }
            prop.setStringValue(sValue);
            break;
         case 2: 
            prop.setDateValue((Date)Value);
            break;
         case 3: 
            prop.setDoubleValue(((Double)Value).doubleValue());
            break;
         case 4: 
            prop.setFloatValue(((Double)Value).floatValue());
      }
   }
 
   public void setFormPropertySafe(String sName, boolean Value) throws TCException {
      this.form.getFormTCProperty(sName).setLogicalValue(Value);
   }
}