ListEditor с полиморфными типами

Я искал и пытался выяснить, могу ли я использовать структуру редактора с полиморфными типами. Я нашел этот пост по адресу Использование редакторов GWT со сложным вариантом использования, который близок к тому, что я пытаюсь сделать. Я довольно новичок в среде редактора, поэтому любая помощь будет высоко оценена.

Например, вот часть кода,

Объекты передачи данных:

public class Employee{ 
 public List<Contact> contacts 
}
public class Contact {
public class ContactEmail extends Contact {}
public class ContactAddress extends Contact {}
public class ContactPhoneNumber extends Contact {}

Редакторы:

public interface ContactBaseEditor<T extends Contact> extends Editor<T> {}
public class AddressEditor extends Composite implements Editor<ContactAddress>, ContactBaseEditor<ContactAddress>{}
public class EmailEditor extends Composite implements Editor<ContactEmail>, ContactBaseEditor<ContactEmail>{)
public class PhoneNumberEditor extends Composite implements Editor<ContactPhoneNumber>, ContactBaseEditor<ContactPhoneNumber>{}

Класс ContactEditor:

public class ContactEditor extends Composite implements IsEditor<ListEditor<Contact, ContactEditorWrapper>> {
private class ContactEditorSource extends EditorSource<ContactEditorWrapper> {
    @Override
    public ContactEditorWrapper create(final int index) {
        ContactEditorWrapper contactEditor = new ContactEditorWrapper();
        communicationContactsPanel.add(contactEditor);
        return contactEditor;
    }
    @Override
    public void dispose(ContactEditorWrapper subEditor) {
        subEditor.removeFromParent();   
        }
    @Override
    public void setIndex(ContactEditorWrapper editor, int index) {
        communicationContactsPanel.insert(editor, index);
    }
}

private ListEditor<Contact, ContactEditorWrapper> editor = ListEditor.of(new ContactEditorSource());
public ListEditor<Contact, ContactEditorWrapper> asEditor() {
    return editor;
}
}

ContactEditorWrapper:

class ContactEditorWrapper extends Composite implements ContactBaseEditor<Contact>, ValueAwareEditor<Contact> {

   private SimplePanel panel = new SimplePanel();

   @Path("") ContactBaseEditor<Contact> realEditor;

   public ContactEditor() {
       initWidget(panel);
   }
   @Override
   public void setValue(Contact value) {
      if (value instanceof Address) {
        realEditor = new AddressEditor();
        panel.setWidget((AddressEditor)realEditor);
      }
      else if (value instanceof Email) {
         realEditor = new EmailEditor();
         panel.setWidget((EmailEditor)realEditor);
      }
      else if (value instanceof PhoneNumber) {
         realEditor = new PhoneNumberEditor();
         panel.setWidget((PhoneNumberEditor)realEditor);
      }
      else {
         realEditor = null;
      }
   }
 }

Класс главного редактора:

public class AddEmployeeEditor extends Composite implements Editor<Employee> {


@UiField
ContactEditor contacts;

interface Driver extends SimpleBeanEditorDriver<Employee, AddEmployeeEditor> {
}  
public AddEmployeeEditor(final Binder binder) {
driver = GWT.create(Driver.class);
    driver.initialize(this);

    List<Contact> list = new ArrayList<Contact>();
    list.add(new Address());
    list.add(new Email());
    list.add(new PhoneNumber());
    list.add(new PhoneNumber());
    Employee employee = new Employee();
    employee.setContacts(list);
    driver.edit(employee);
   }
}

Может ли кто-нибудь сказать мне, будет ли это работать, я иду в правильном направлении или?

Заранее спасибо, Мак

Я обновил приведенный выше код, чтобы он теперь содержал класс ContactEditorWrapper, который посоветовал Томас.


person Seamus McMorrow    schedule 12.07.2012    source источник


Ответы (1)


Этот код имеет хорошие шансы сломаться: нет гарантии, что редактор, возвращенный EditorSource, не будет использоваться для редактирования другого значения в списке.

Вы должны создать редактор-оболочку, реализующий ValueAwareEditor, и с фактическим редактором в качестве дочернего редактора с @Path(""); и создайте соответствующий ContactBaseEditor в методе setValue.

class ContactEditor extends Composite implements ValueAwareEditor<Contact> {

   private SimplePanel panel = new SimplePanel();

   @Path("") ContactBaseEditor realEditor;

   public ContactEditor() {
      initWidget(panel);
   }

   @Override
   public void setValue(Contact value) {
      if (contact instanceof ContactAddress) {
         realEditor = new AddressEditor();
      }
      else if (contact instanceof ContactEmail) {
         realEditor = new EmailEditor();
      }
      else if (contact instanceof ContactPhoneNumber) {
         realEditor = new PhoneNumberEditor();
      }
      else {
         realEditor = null;
      }
      panel.setWidget(realEditor);
   }

Однако обратите внимание, что будут редактироваться только поля/подредакторы из ContactBaseEditor, независимо от используемой фактической реализации. Если в каком-то подклассе ContactBaseEditor есть дополнительные поля/подредакторы, вам придется реализовать ValueAwareEditor и обрабатывать все вручную в методах setValue и flush.

person Thomas Broyer    schedule 12.07.2012