===== 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 необходимо связать классы хранения форм и классы отображения.
MyItem\ Master.FORMJAVARENDERING=com.my.forms.MyItemForm
MyItemRevision\ Master.FORMJAVARENDERING=com.my.forms.MyItemRevisionForm
Далее в классах необходимо предусмотреть следующие варианты использования форм:
* Создание нового объекта (изделия, совместно с модификацией) - при этом форма отображается внутри мастера создания нового Изделия. Самого Изделия и модификации на момент отображения формы ещё не существует в хранилище Teamcenter, существует только элемент в оперативной памяти связанный с свойством панели мастера (TCComponentItem)NewItemPanel.newComponent. Получить доступ к этому свойству можно через промежуточные родительские элементы ГПИ. Причем объект хранения формы (TCComponentForm) переданный конструктору класса формы не соответствует реальному объекту хранения ассоциированному с соответствующим Изделием или Модификацией.
* Просмотр существующего объекта - при этом соответствующий объект хранения формы (TCComponentForm) передается конструктору класса формы, так как Изделия и Модификация уже есть в хранилище Teamcenter.
* Пересмотр изделия (создание новой модификации) - следует учитывать при разработке формы модификации изделия (наследника Item Revision).
В качестве примера приведу реализацию MyItemRevisionForm. Следует учитывать что данный класс не использовался в реальной разработке, конструируется исключительно для примера к статье, и возможно содержит ошибки.
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 - разрешает имена свойств в значения имен
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);
}
}