Вы должны интегрироваться с архитектурой, сгенерированной Roo, чтобы вы все еще могли извлечь выгоду из скаффолдинга Roo.
Код, сгенерированный Roo, скрывает большую часть поведения в классах _Roo_Gwt
, и это потому, что GWTВ настоящее время поддержка ITDs .Поэтому в производные классы необходимо вносить изменения, переопределяя методы из _Roo_Gwt
class.
Для навигации по приложению используйте Places, ActivityMapper и ActivitiManager (вы можете найти хорошее чтение на @Thomas Broyer posterous и GWT help ).
Если вы посмотрите на ScaffoldDesktopShell.ui.xml
- страница разделена на три основные области. ApplicationMasterActivities
класс отвечает за главную область.
masterActivityManager.setDisplay(shell.getMasterPanel());
proxyListPlacePicker
в ScaffoldDesktopApp.init()
генерирует событие изменения места с соответствующим ProxyListPlace
.
public void onValueChange(ValueChangeEvent<ProxyListPlace> event) {
placeController.goTo(event.getValue());
}
ApplicationMasterActivities
class создает соответствующую активность в главной области, проверяя EntityProxy
тип, содержащийся в ProxyListPlace
объекте.
public Activity getActivity(Place place) {
if (!(place instanceof ProxyListPlace)) {
return null;
}
ProxyListPlace listPlace = (ProxyListPlace) place;
return new ApplicationEntityTypesProcessor<Activity>() {
@Override
public void handlePet(PetProxy isNull) {
setResult(new PetListActivity(requests, ScaffoldApp.isMobile() ? PetMobileListView.instance() : PetListView.instance(), placeController));
}
@Override
public void handleOwner(OwnerProxy isNull) {
setResult(new OwnerListActivity(requests, ScaffoldApp.isMobile() ? OwnerMobileListView.instance() : OwnerListView.instance(), placeController));
}
}.process(listPlace.getProxyClass());
}
Навигация создается путем перечисления всех EntityProxy в ScaffoldApp
class
protected HashSet<ProxyListPlace> getTopPlaces() {
Set<Class<? extends EntityProxy>> types = ApplicationEntityTypesProcessor.getAll();
HashSet<ProxyListPlace> rtn = new HashSet<ProxyListPlace>(types.size());
for (Class<? extends EntityProxy> type : types) {
rtn.add(new ProxyListPlace(type));
}
return rtn;
}
Для вывода значимого имени в меню навигации они отображаются с использованием ApplicationListPlaceRenderer
public String render(ProxyListPlace object) {
return new ApplicationEntityTypesProcessor<String>() {
@Override
public void handlePet(PetProxy isNull) {
setResult("Pets");
}
@Override
public void handleOwner(OwnerProxy isNull) {
setResult("Owners");
}
}.process(object.getProxyClass());
}
Таким образом, вы должны создать новую активность.открытый класс SomeActivity расширяет Composite, реализует Activity {
private static SomeActivityUiBinder uiBinder = GWT
.create(SomeActivityUiBinder.class);
interface SomeActivityUiBinder extends UiBinder<Widget, SomeActivity> {
}
private AcceptsOneWidget display;
public SomeActivity() {
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public String mayStop() {
return null;
}
@Override
public void onCancel() {
onStop();
}
@Override
public void onStop() {
this.display.setWidget(null);
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
this.display = panel;
this.display.setWidget(this);
}
}
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTMLPanel>
Hello world!
</g:HTMLPanel>
</ui:UiBinder>
Создайте соответствующий EntityProxy.Это только для соблюдения механизма ProxyListPlace
.
public interface SomeEntityProxy extends EntityProxy {
}
Создать SomeActivity в A
@Override
public Activity getActivity(Place place) {
if (!(place instanceof ProxyListPlace)) {
return null;
}
Activity activity = super.getActivity(place);
if (activity == null) {
ProxyListPlace listPlace = (ProxyListPlace) place;
if (SomeEntityProxy.class.equals(listPlace.getProxyClass())) {
activity = new SomeActivity();
}
}
return activity;
}
Добавить место для навигации в ScaffoldApp
или переопределить getTopPlaces в производном классе.
rtn.add(new ProxyListPlace(SomeEntityProxy.class));
Установите правильный текст для отображения меню в ApplicationListPlaceRenderer
@Override
public String render(ProxyListPlace object) {
String label = super.render(object);
if(label == null) {
if (SomeEntityProxy.class.equals(object.getProxyClass())) {
label = "Some activity";
}
}
return label;
}
Код в GitHub .