/* * Copyright 2008 Eckhart Arnold (eckhart_arnold@hotmail.com). * * 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 de.eckhartarnold.client; // import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.CellPanel; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * Defines a "tiled" layout. * * <p>A tiled layout consists * of three blocks, namely, the image panel ("I"), the control panel ("P") * and the caption ("C"), of which the image panel is obligatory while the * other two are optional. These three blocks can be arranged * horizontally and vertically in an almost arbitrary manner, with possible * horizontal delimiting lines (html "<hr />" tags) in between. However, * layouts where the image panel is arranged together with another element * horizontally may not work very well. But putting the control panel next to * the caption on top and the image panel below for example works quite well. * * @author ecki * */ public class TiledLayout extends FullScreenLayout { protected CellPanel panel; /** * Creates a tiled layout. The configuration string indicates the * arrangement of the components "image" (represented by 'I'), * "control panel" (represented by 'P') and "caption" (represented by * 'C') and optional horizontal lines (represented by "-"). * Components bracketed in squared brackets are arranged horizontally. * Without squared brackets components are arranged vertically. * Example: "[CP]-I" means that the caption and control panel are on top * and the control panel is placed to the right of the caption. Below * follows a horizontal separator and than the image panel. * * @param collection the information about the image collection * @param configuration the configuration string. */ public TiledLayout(ImageCollectionInfo collection, String configuration) { super(collection, configuration); panel = new VerticalPanel(); panel.setStyleName("tiled"); createTiles(panel, collection, configuration, 0); } /** * Creates a tiled layout with the configuration: "[CP]I". * * @param collection the information about the image collection */ public TiledLayout(ImageCollectionInfo collection) { this(collection, "C-I-P"); } /* (non-Javadoc) * @see de.eckhartarnold.client.Layout#getRootWidget() */ @Override public Widget getRootWidget() { return panel; } @Override protected void initOverlayWidgets(ImageCollectionInfo info) { } private int createTiles(CellPanel parent, ImageCollectionInfo info, String config, int i) { while (i < config.length()) { switch (config.charAt(i)) { case ('C'): { parent.add(caption); caption.addStyleDependentName("tiled"); parent.setCellVerticalAlignment(caption, HasVerticalAlignment.ALIGN_MIDDLE); parent.setCellHorizontalAlignment(caption, HasHorizontalAlignment.ALIGN_CENTER); parent.setCellWidth(caption, "100%"); break; } case ('O'): { overlay = new CaptionOverlay(caption, imagePanel, slideshow, info.getInfo().get(CaptionOverlay.KEY_CAPTION_POSITION)); } case ('I'): { parent.add(imagePanel); parent.setCellVerticalAlignment(imagePanel, HasVerticalAlignment.ALIGN_MIDDLE); parent.setCellHorizontalAlignment(imagePanel, HasHorizontalAlignment.ALIGN_CENTER); parent.setCellWidth(imagePanel, "100%"); parent.setCellHeight(imagePanel, "100%"); break; } case ('P'): case ('F'): { assert control instanceof Widget; parent.add((Widget) control); ((Widget) control).addStyleDependentName("tiled"); parent.setCellVerticalAlignment(((Widget) control), HasVerticalAlignment.ALIGN_MIDDLE); if (parent instanceof HorizontalPanel && parent.getWidgetCount() == 1) { parent.setCellHorizontalAlignment(((Widget) control), HasHorizontalAlignment.ALIGN_RIGHT); } else { parent.setCellHorizontalAlignment(((Widget) control), HasHorizontalAlignment.ALIGN_CENTER); } break; } case ('-'): { HTML horizLine = new HTML("<hr class=\"tiledSeparator\" />"); panel.add(horizLine); break; } case (']'): { return i; } case ('['): { CellPanel panel; if (parent instanceof VerticalPanel) { panel = new HorizontalPanel(); panel.setStyleName("tiled"); } else { panel = new VerticalPanel(); panel.setStyleName("tiled"); } i = createTiles(panel, info, config, i+1); parent.add(panel); break; } default: assert false: "Illegal token '"+config.charAt(i)+"' in config string"; } i++; } return i; } }