package com.sduk.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.History; import com.google.gwt.user.client.HistoryListener; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.HasAlignment; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.sduk.client.Sink.SinkInfo; /** * Entry point classes define onModuleLoad(). */ public class gbpAjax implements EntryPoint, HistoryListener { protected SinkList list = new SinkList(); private SinkInfo curInfo; private Sink curSink; private HTML description = new HTML(); private DockPanel panel = new DockPanel(); private DockPanel sinkContainer; public void onHistoryChanged(String token) { // Find the SinkInfo associated with the history context. If one is // found, show it (It may not be found, for example, when the user mis- // types a URL, or on startup, when the first context will be ""). SinkInfo info = list.find(token); if (info == null) { showInfo(); return; } show(info, false); } /** * This is the entry point method. */ public void onModuleLoad() { loadSinks(); // Put the sink list on the left, and add the outer dock panel to the // root. sinkContainer = new DockPanel(); sinkContainer.setStyleName("ks-Sink"); VerticalPanel vp = new VerticalPanel(); vp.setWidth("100%"); vp.add(description); vp.add(sinkContainer); description.setStyleName("ks-Info"); list.setWidth("120px"); panel.add(list, DockPanel.WEST); panel.setSpacing(10); panel.add(vp, DockPanel.CENTER); panel.setCellVerticalAlignment(list, HasAlignment.ALIGN_TOP); panel.setCellWidth(vp, "100%"); History.addHistoryListener(this); RootPanel.get().add(panel); // Show the initial screen. String initToken = History.getToken(); if (initToken.length() > 0) { onHistoryChanged(initToken); } else { showInfo(); } } public void show(SinkInfo info, boolean affectHistory) { // Don't bother re-displaying the existing sink. This can be an issue // in practice, because when the history context is set, our // onHistoryChanged() handler will attempt to show the currently-visible // sink. if (info == curInfo) { return; } curInfo = info; // Remove the old sink from the display area. if (curSink != null) { curSink.onHide(); sinkContainer.remove(curSink); } // Get the new sink instance, and display its description in the // sink list. curSink = info.getInstance(); list.setSinkSelection(info.getName()); description.setHTML(info.getDescription()); // If affectHistory is set, create a new item on the history stack. This // will ultimately result in onHistoryChanged() being called. It will call // show() again, but nothing will happen because it will request the exact // same sink we're already showing. if (affectHistory) { History.newItem(info.getName()); } // Display the new sink. sinkContainer.add(curSink, DockPanel.CENTER); sinkContainer.setCellWidth(curSink, "100%"); sinkContainer.setCellHeight(curSink, "100%"); sinkContainer.setCellVerticalAlignment(curSink, DockPanel.ALIGN_TOP); curSink.onShow(); } /** * Adds all sinks to the list. Note that this does not create actual instances * of all sinks yet (they are created on-demand). This can make a significant * difference in startup time. */ protected void loadSinks() { list.addSink(Info.init()); list.addSink(NigelCohen.init()); list.addSink(BruceDenny.init()); list.addSink(TomJonesBerney.init()); list.addSink(Contact.init()); } private void showInfo() { show(list.find("Home"), false); } }