| /* |
| * Copyright 2008 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.museum.client.common; |
| |
| import com.google.gwt.core.client.EntryPoint; |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.dom.client.Document; |
| import com.google.gwt.dom.client.LinkElement; |
| import com.google.gwt.user.client.Window; |
| import com.google.gwt.user.client.ui.HTML; |
| import com.google.gwt.user.client.ui.RootPanel; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| /** |
| * An abstract issue that can be used in the code museum. Each |
| * {@link AbstractIssue} should address a single issue. If at all possible, that |
| * issue should be obvious from the initial ui state. |
| */ |
| public abstract class AbstractIssue implements EntryPoint { |
| /** |
| * Headline for this issue. |
| */ |
| private String headline; |
| |
| /** |
| * Creates the css associated with this issue. |
| * |
| * @return link with css |
| */ |
| public LinkElement createCSS() { |
| String cssName; |
| if (hasCSS()) { |
| // Fetch the associated style sheet using an HTTP request |
| cssName = getClass().getName(); |
| cssName = cssName.substring(cssName.lastIndexOf(".") + 1); |
| } else { |
| cssName = "Default"; |
| } |
| |
| String baseUrl = GWT.getModuleBaseURL(); |
| LinkElement issueLinkElement = Document.get().createLinkElement(); |
| issueLinkElement.setRel("stylesheet"); |
| issueLinkElement.setType("text/css"); |
| issueLinkElement.setHref(baseUrl + "issues/" + cssName + ".css"); |
| return issueLinkElement; |
| } |
| |
| /** |
| * <p> |
| * Create a widget that illustrates the issue. Each issue should include a |
| * detailed description of the expected results and the observed results |
| * before the issue was fixed. |
| * </p> |
| * <p> |
| * Note that createIssue will may be called multiple times if the user |
| * refreshes the issue. If you save state within the instance, you must clear |
| * it out and reset the issue when createIssue is called again. |
| * </p> |
| * |
| * @return a widget that can reproduce the issue |
| */ |
| public abstract Widget createIssue(); |
| |
| /** |
| * Returns the "<i>classname</i>: summary". |
| * |
| * @return a short summary of the issue, including the class name |
| */ |
| public final String getHeadline() { |
| if (headline == null) { |
| String className = getClass().getName(); |
| headline = className.substring(className.lastIndexOf(".") + 1) + ": " |
| + getSummary(); |
| } |
| return headline; |
| } |
| |
| /** |
| * Return a detailed description of what the user should expect to see. The |
| * description will be added above the example. You can also include |
| * instructions to reproduce the issue. |
| * |
| * @return instructions explaining what the user should see |
| */ |
| public abstract String getInstructions(); |
| |
| /** |
| * Gets the summary for this test. All tests should include a summary so users |
| * can scan through them quickly. |
| */ |
| public abstract String getSummary(); |
| |
| /** |
| * Does the test have css? |
| * |
| * @return true to load a CSS file of the same name, placed in the issues |
| * directory |
| */ |
| public abstract boolean hasCSS(); |
| |
| /** |
| * Called immediately after the widget is attached. |
| */ |
| public void onAttached() { |
| // By default do nothing. |
| } |
| |
| public void onModuleLoad() { |
| Utility.getHeadElement().appendChild(createCSS()); |
| Window.setTitle(getHeadline()); |
| RootPanel.get().add(new HTML(getInstructions())); |
| RootPanel.get().add(createIssue()); |
| onAttached(); |
| } |
| |
| } |