123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- /* *************************************************************************
-
- IT Mill Toolkit
-
- Development of Browser User Interfaces Made Easy
-
- Copyright (C) 2000-2006 IT Mill Ltd
-
- *************************************************************************
-
- This product is distributed under commercial license that can be found
- from the product package on license.pdf. Use of this product might
- require purchasing a commercial license from IT Mill Ltd. For guidelines
- on usage, see licensing-guidelines.html
-
- *************************************************************************
-
- For more information, contact:
-
- IT Mill Ltd phone: +358 2 4802 7180
- Ruukinkatu 2-4 fax: +358 2 4802 7181
- 20540, Turku email: info@itmill.com
- Finland company www: www.itmill.com
-
- Primary source for information and releases: www.itmill.com
-
- ********************************************************************** */
-
- package com.itmill.toolkit.ui;
-
- import java.lang.reflect.Method;
- import java.util.Hashtable;
- import java.util.LinkedList;
- import java.util.Iterator;
- import java.util.Map;
-
- import com.itmill.toolkit.terminal.*;
-
- /**
- * Tabsheet component.
- *
- * @author IT Mill Ltd.
- * @version
- * @VERSION@
- * @since 3.0
- */
- public class TabSheet extends AbstractComponentContainer implements Sizeable {
-
- /**
- * Linked list of component tabs.
- */
- private LinkedList tabs = new LinkedList();
-
- /**
- * Tab -> caption mapping.
- */
- private Hashtable tabCaptions = new Hashtable();
-
- /**
- * Tab -> icon mapping .
- */
- private Hashtable tabIcons = new Hashtable();
-
- /**
- * Selected tab.
- */
- private Component selected = null;
-
- private KeyMapper keyMapper = new KeyMapper();
-
- /**
- * Holds the value of property tabsHIdden.
- */
- private boolean tabsHidden;
-
- private int height = -1;
-
- private int heightUnit;
-
- private int width = -1;
-
- private int widthUnit;
-
-
- /**
- * Constructs a new Tabsheet. Tabsheet is immediate by default.
- */
- public TabSheet() {
- super();
- setImmediate(true);
- }
-
- /**
- * Gets the component container iterator for going trough all the components
- * in the container.
- *
- * @return the Iterator of the components inside the container.
- */
- public Iterator getComponentIterator() {
- return java.util.Collections.unmodifiableList(tabs).iterator();
- }
-
- /**
- * Removes the component from this container.
- *
- * @param c
- * the component to be removed.
- */
- public void removeComponent(Component c) {
- if (c != null && tabs.contains(c)) {
- super.removeComponent(c);
- keyMapper.remove(c);
- tabs.remove(c);
- tabCaptions.remove(c);
- if (c.equals(selected)) {
- if (tabs.isEmpty())
- selected = null;
- else {
- selected = (Component) tabs.getFirst();
- fireSelectedTabChange();
- }
- }
- requestRepaint();
- }
- }
-
- /**
- * Adds the component into this container. The component is added as a tab
- * where its default tab-caption is the caption of the component.
- *
- * @param c
- * the component to be added.
- */
- public void addComponent(Component c) {
- addTab(c, c.getCaption(), getIcon());
- }
-
- /**
- * Adds the new tab into TabSheet.
- *
- * @param c
- * the component to be added onto tab.
- * @param caption
- * the caption of the tab.
- * @param icon
- * the Set the icon of the tab.
- */
- public void addTab(Component c, String caption, Resource icon) {
- if (c != null) {
- tabs.addLast(c);
- tabCaptions.put(c, caption != null ? caption : "");
- if (icon != null)
- tabIcons.put(c, icon);
- if (selected == null) {
- selected = c;
- fireSelectedTabChange();
- }
- super.addComponent(c);
- requestRepaint();
- }
- }
-
- /**
- * Gets the component UIDL tag.
- *
- * @return the Component UIDL tag as string.
- */
- public String getTag() {
- return "tabsheet";
- }
-
- /**
- * Moves all components from another container to this container. The
- * components are removed from the other container.
- *
- * @param source
- * the container components are removed from.
- */
- public void moveComponentsFrom(ComponentContainer source) {
- for (Iterator i = source.getComponentIterator(); i.hasNext();) {
- Component c = (Component) i.next();
- String caption = null;
- Resource icon = null;
- if (TabSheet.class.isAssignableFrom(source.getClass())) {
- caption = ((TabSheet) source).getTabCaption(c);
- icon = ((TabSheet) source).getTabIcon(c);
- }
- source.removeComponent(c);
- addTab(c, caption, icon);
-
- }
- }
-
- /**
- * Paints the content of this component.
- *
- * @param event
- * the Paint Event.
- * @throws PaintException
- * if the paint operation failed.
- */
- public void paintContent(PaintTarget target) throws PaintException {
-
- if (areTabsHidden())
- target.addAttribute("hidetabs", true);
-
- if(width > -1) {
- target.addAttribute("width", getWidth() + UNIT_SYMBOLS[widthUnit]);
- }
- if(height > -1) {
- target.addAttribute("height", getHeight() + UNIT_SYMBOLS[heightUnit]);
- }
-
- target.startTag("tabs");
-
- for (Iterator i = getComponentIterator(); i.hasNext();) {
- Component c = (Component) i.next();
- if (!c.isVisible())
- continue;
- target.startTag("tab");
- Resource icon = getTabIcon(c);
- if (icon != null)
- target.addAttribute("icon", icon);
- String caption = getTabCaption(c);
- if (!c.isEnabled()) {
- target.addAttribute("disabled", true);
- }
-
- if (caption != null && caption.length() > 0)
- target.addAttribute("caption", caption);
- target.addAttribute("key", keyMapper.key(c));
- if (c.equals(selected)) {
- target.addAttribute("selected", true);
- c.paint(target);
- }
- target.endTag("tab");
- }
-
- target.endTag("tabs");
-
- if (selected != null)
- target.addVariable(this, "selected", keyMapper.key(selected));
- }
-
- /**
- * Are tabs hidden.
- *
- * @return the Property visibility.
- */
- public boolean areTabsHidden() {
- return this.tabsHidden;
- }
-
- /**
- * Setter for property tabsHidden.
- *
- * @param tabsHidden
- * True if the tabs should be hidden.
- */
- public void hideTabs(boolean tabsHidden) {
- this.tabsHidden = tabsHidden;
- requestRepaint();
- }
-
- /**
- * Gets the caption for a component.
- *
- * @param c
- * the component.
- */
- public String getTabCaption(Component c) {
- String caption = (String) tabCaptions.get(c);
- if (caption == null)
- caption = "";
- return caption;
- }
-
- /**
- * Sets the caption for a component.
- *
- * @param c
- * the component.
- * @param caption
- * the caption to set.
- */
- public void setTabCaption(Component c, String caption) {
- tabCaptions.put(c, caption);
- requestRepaint();
- }
-
- /**
- * Gets the icon for a component.
- *
- * @param c
- * the component.
- */
- public Resource getTabIcon(Component c) {
- return (Resource) tabIcons.get(c);
- }
-
- /**
- * ] Sets the icon for a component.
- *
- * @param c
- * @param icon
- */
- public void setTabIcon(Component c, Resource icon) {
- if (icon == null)
- tabIcons.remove(c);
- else
- tabIcons.put(c, icon);
- requestRepaint();
- }
-
- /**
- * Sets the selected tab.
- *
- * @param c
- */
- public void setSelectedTab(Component c) {
- if (c != null && tabs.contains(c) && !selected.equals(c)) {
- selected = c;
- fireSelectedTabChange();
- requestRepaint();
- }
- }
-
- /**
- * Gets the selected tab.
- *
- * @return the selected tab.
- */
- public Component getSelectedTab() {
- return selected;
- }
-
- /**
- * Invoked when the value of a variable has changed.
- *
- * @see com.itmill.toolkit.ui.AbstractComponent#changeVariables(java.lang.Object,
- * java.util.Map)
- */
- public void changeVariables(Object source, Map variables) {
- if (variables.containsKey("selected"))
- setSelectedTab((Component) keyMapper.get((String) variables
- .get("selected")));
- }
-
- /* Documented in superclass */
- public void replaceComponent(Component oldComponent, Component newComponent) {
-
- // Gets the captions
- String oldCaption = getTabCaption(oldComponent);
- Resource oldIcon = getTabIcon(oldComponent);
- String newCaption = getTabCaption(newComponent);
- Resource newIcon = getTabIcon(newComponent);
-
- // Gets the locations
- int oldLocation = -1;
- int newLocation = -1;
- int location = 0;
- for (Iterator i = tabs.iterator(); i.hasNext();) {
- Component component = (Component) i.next();
-
- if (component == oldComponent)
- oldLocation = location;
- if (component == newComponent)
- newLocation = location;
-
- location++;
- }
-
- if (oldLocation == -1)
- addComponent(newComponent);
- else if (newLocation == -1) {
- removeComponent(oldComponent);
- keyMapper.remove(oldComponent);
- addComponent(newComponent);
- tabs.remove(newComponent);
- tabs.add(oldLocation, newComponent);
- setTabCaption(newComponent, oldCaption);
- setTabIcon(newComponent, oldIcon);
- } else {
- if (oldLocation > newLocation) {
- tabs.remove(oldComponent);
- tabs.add(newLocation, oldComponent);
- tabs.remove(newComponent);
- tabs.add(oldLocation, newComponent);
- } else {
- tabs.remove(newComponent);
- tabs.add(oldLocation, newComponent);
- tabs.remove(oldComponent);
- tabs.add(newLocation, oldComponent);
- }
- setTabCaption(newComponent, oldCaption);
- setTabIcon(newComponent, oldIcon);
- setTabCaption(oldComponent, newCaption);
- setTabIcon(oldComponent, newIcon);
-
- requestRepaint();
- }
- }
-
- /* Click event ************************************************ */
-
- private static final Method SELECTED_TAB_CHANGE_METHOD;
- static {
- try {
- SELECTED_TAB_CHANGE_METHOD = SelectedTabChangeListener.class
- .getDeclaredMethod("selectedTabChange",
- new Class[] { SelectedTabChangeEvent.class });
- } catch (java.lang.NoSuchMethodException e) {
- // This should never happen
- throw new java.lang.RuntimeException();
- }
- }
-
- /**
- * Selected Tab Change event. This event is thrown, when the selected tab in
- * the tab sheet is changed.
- *
- * @author IT Mill Ltd.
- * @version
- * @VERSION@
- * @since 3.0
- */
- public class SelectedTabChangeEvent extends Component.Event {
-
- /**
- * Serial generated by eclipse.
- */
- private static final long serialVersionUID = 3258129141914940469L;
-
- /**
- * New instance of selected tab change event
- *
- * @param source
- * the Source of the event.
- */
- public SelectedTabChangeEvent(Component source) {
- super(source);
- }
-
- /**
- * Select where the event occurred
- *
- * @return the Source of the event.
- */
- public Select getSelect() {
- return (Select) getSource();
- }
- }
-
- /**
- * Selected Tab Change Event listener
- *
- * @author IT Mill Ltd.
- *
- * @version
- * @VERSION@
- * @since 3.0
- */
- public interface SelectedTabChangeListener {
-
- /**
- * Visible tab in tab sheet has has been changed.
- *
- * @param event
- * the Selected tab change event.
- */
- public void selectedTabChange(SelectedTabChangeEvent event);
- }
-
- /**
- * Adds the selected tab change listener
- *
- * @param listener
- * the Listener to be added.
- */
- public void addListener(SelectedTabChangeListener listener) {
- addListener(SelectedTabChangeEvent.class, listener,
- SELECTED_TAB_CHANGE_METHOD);
- }
-
- /**
- * Removes the selected tab change listener
- *
- * @param listener
- * the Listener to be removed.
- */
- public void removeListener(SelectedTabChangeListener listener) {
- removeListener(SelectedTabChangeEvent.class, listener,
- SELECTED_TAB_CHANGE_METHOD);
- }
-
- /**
- * Emits the options change event.
- */
- protected void fireSelectedTabChange() {
- fireEvent(new SelectedTabChangeEvent(this));
- }
-
- public int getHeight() {
- return height;
- }
-
- public int getHeightUnits() {
- return heightUnit;
- }
-
- public int getWidth() {
- return width;
- }
-
- public int getWidthUnits() {
- return widthUnit;
- }
-
- public void setHeight(int height) {
- this.height = height;
- requestRepaint();
- }
-
- public void setHeightUnits(int units) {
- this.heightUnit = units;
- requestRepaint();
- }
-
- public void setWidth(int width) {
- this.width = width;
- requestRepaint();
- }
-
- public void setWidthUnits(int units) {
- this.widthUnit = units;
- requestRepaint();
- }
- }
|