001package org.vishia.gral.base; 002 003import java.util.List; 004import java.util.Map; 005import java.util.TreeMap; 006import org.vishia.util.Java4C; 007import org.vishia.gral.ifc.GralVisibleWidgets_ifc; 008 009 010/**This class is the common base class for Tabbed-Panels. 011 * A TabbbedPanel is the container for Tabs. It doesn't contain other widgets than Tabs. 012 * It is a {@link GralPanelContent} because it can be used as one of the areas 013 * in {@link org.vishia.gral.area9.GralArea9Window}. 014 * It is a {@link GralWidget} because it is used as one member inside another Panel. 015 * The Implementation of this class should create a swt.TabFolder or adequate 016 * A Tab inside the TabPanel is a Panel. 017 * <br><br> 018 * Concepts in base graphic: 019 * <ul> 020 * <li>SWT: TabFolder, TabItem 021 * <li>Swing: TabbedPane 022 * </ul> 023 * @author Hartmut Schorrig 024 * 025 */ 026@Java4C.ParseError 027public class GralTabbedPanel extends GralPanelContent /*extends GralWidget*/ implements GralVisibleWidgets_ifc 028{ 029 /**The version and history: 030 * <ul> 031 * <li>2013-10-22 Hartmut bugfix: {@link #setMngToTabbedPanel()} necessary because a new Tab should refer to this parent. 032 * On {@link #addCanvasPanel(String, String)} or {@link #addGridPanel(String, String, int, int, int, int)} the mng 033 * should refer this as {@link GralMng#pos}.parent. 034 * <li>2012-01-08 Hartmut new: {@link #removePanel(String)} 035 * <li>2011-11-07 Hartmut chg: a TabbedPanel is a GralWidget too, 036 * <li>2011-10-01 Hartmut new: abstract method {@link #selectTab(String)}. 037 * <li>2011-09-10 Hartmut chg: move this class from gral/gridPanel/TabPanel to gral/base/GralTabbedPanel 038 * Reason: it isn't a concept of the grid panel but a basic concept of gral. It hasn't any dependencies to gridPanel. 039 * <li>2011-09-08 Hartmut chg: The {@link #widgetsVisible} were stored in the GuiPanelMngBase before. 040 * But an application can have more as one tabbed panel, and any of them can change the visible widgets while changing the tab. 041 * The visible widgets are not an concpet of the grid panel manager but a topic of the panel content. 042 * It is not a question of one PanelContent but a question of the TabbedPanel which contains some panels. 043 * <li>2011-08-31 Hartmut chg: The {@link #focusedTab} and {@link #getFocusedTab()} is moved from GuiPanelMngBase to here. 044 * Reason: One application can have more as one tabbed panel. 045 * <li>2011-05-26 Hartmut chg: {@link #addCanvasPanel(String, String)} now returns {@link GralPanelContent} instead an untyped Object. 046 * <li>2010-05-00 Hartmut created 047 * </ul> 048 * 049 * <b>Copyright/Copyleft</b>: 050 * For this source the LGPL Lesser General Public License, 051 * published by the Free Software Foundation is valid. 052 * It means: 053 * <ol> 054 * <li> You can use this source without any restriction for any desired purpose. 055 * <li> You can redistribute copies of this source to everybody. 056 * <li> Every user of this source, also the user of redistribute copies 057 * with or without payment, must accept this license for further using. 058 * <li> But the LPGL ist not appropriate for a whole software product, 059 * if this source is only a part of them. It means, the user 060 * must publish this part of source, 061 * but don't need to publish the whole source of the own product. 062 * <li> You can study and modify (improve) this source 063 * for own using or for redistribution, but you have to license the 064 * modified sources likewise under this LGPL Lesser General Public License. 065 * You mustn't delete this Copyright/Copyleft inscription in this source file. 066 * </ol> 067 * If you are indent to use this sources without publishing its usage, you can get 068 * a second license subscribing a special contract with the author. 069 * 070 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 071 * 072 * 073 */ 074 @SuppressWarnings("hiding") 075 public static final int version = 0x20111001; 076 077 final public GralPanelActivated_ifc notifyingUserInstanceWhileSelectingTab; 078 079 final protected Map<String, GralPanelContent> panels = new TreeMap<String, GralPanelContent>(); 080 081 /**The currently selected tab. */ 082 //public GralPanelContent focusedTab; 083 084 /**The actual widgets in the visible panel. It may a sub-panel or changed content. The list can be changed. */ 085 @Deprecated public List<GralWidget> widgetsVisible; 086 087 /**A new list of actual widgets, set while select another tab etc. The reference may be set 088 * in the GUI-Thread (GUI-listener). The communication-manager thread reads whether it isn't null, 089 * processes it and sets this reference to null if it is processed. */ 090 @Deprecated public List<GralWidget> newWidgetsVisible; 091 092 093 094 /**The constructor can only be invoked from a implementing class. 095 * @param user 096 */ 097 public GralTabbedPanel(String posString, String sName, GralPanelActivated_ifc user, int property) 098 { super(posString, sName); 099 //super(sName, '@', mng); 100 this.notifyingUserInstanceWhileSelectingTab = user; 101 } 102 103 104 //protected void setMngToTabbedPanel(){ itsMng.setTabbedPanel(this); } 105 106 //abstract public GralPanelContent getGuiComponent(); 107 108 public GralPanelContent getFocusedTab(){ return (GralPanelContent)primaryWidget; } 109 110 /**Adds a grid-panel in the TabPanel. The panel will be registered in the GuiPanelMng, 111 * so the access to the panel can be done with its name. 112 * The position of the widget manager is set to full area of this panel. 113 * 114 * @param sName The name, used in 115 * @param sLabel to designate the tab for view. A "&" left from a character determines the hot-key 116 * to select the tab. 117 * @param yGrid number of units per grid line vertical. It may be 1. 118 * @param xGrid number of units per grid line horizontal. It may be 1. 119 * @param yGrid2 Number of grid lines vertical per wider ranges for lines 120 * @param xGrid2 Number of grid lines horizontal per wider ranges for lines 121 * @return 122 */ 123 public GralPanelContent addGridPanel(String sName, String sLabel, int yGrid, int xGrid, int yGrid2, int xGrid2) 124 { 125 GralMng.PosThreadSafe pos = itsMng.pos(); 126 if(pos.pos.panel != this) { 127 pos.pos.setPosition(this, 0, 0, 0, 0, 0, 'd', 0); //initializes the position of this GralTabbedPanel to have the correct parent for the tab 128 } 129 GralPanelContent panelg = new GralPanelContent("@", sName); 130 ((ImplAccess)_wdgImpl).addGridPanel(panelg, sLabel, yGrid, xGrid, yGrid2, xGrid2); 131 return panelg; 132 } 133 134 public GralPanelContent addCanvasPanel(String sName, String sLabel){ 135 GralMng.PosThreadSafe pos = itsMng.pos(); 136 if(pos.pos.panel != this) { 137 pos.pos.setPosition(this, 0, 0, 0, 0, 0, 'd', 0); //initializes the position of this GralTabbedPanel to have the correct parent for the tab 138 } 139 GralPanelContent panelg = new GralPanelContent("@", sName); 140 ((ImplAccess)_wdgImpl).addCanvasPanel(panelg, sLabel); 141 return panelg; 142 143 } 144 145 146 public GralPanelContent selectTab(String name){ 147 return ((ImplAccess)_wdgImpl).selectTab(name); 148 } 149 150 @Override @Deprecated public List<GralWidget> getWidgetsVisible() 151 { 152 if(newWidgetsVisible !=null){ 153 //if(panel.widgetList !=null){ 154 //remove communication request for actual widgets. 155 //} 156 widgetsVisible = newWidgetsVisible; 157 newWidgetsVisible = null; 158 } 159 160 return widgetsVisible; 161 } 162 163 164 165 166 167 168 /**Sets the visible state to all widgets of the panel, but not to windows (that is only in the primaryWindow) 169 * @see org.vishia.gral.base.GralWidget#setVisibleState(boolean) 170 */ 171 @Override public void setVisibleState(boolean visible){ 172 setVisibleStateWidget(visible); //for the own GralWidget 173 //don't touch the tabs, its visible is changed in extra routines. 174 /* 175 for(GralWidget widget: widgetList){ 176 if(widget != this && !(widget instanceof GralWindow)) { 177 widget.setVisibleState(visible); 178 } 179 } 180 */ 181 } 182 183 184 185 186 187 boolean removePanel(GralPanelContent panel){ 188 return removePanel(panel.name); 189 } 190 191 /**Removes the named panel from this panel container. 192 * @param namePanel The name which was given by {@link #addCanvasPanel(String, String)} or 193 * {@link #addGridPanel(String, String, int, int, int, int)} and which is stored in 194 * {@link GralPanelContent#namePanel}. 195 * @return true if removed, false if the namePanel isn't ok and therefore nothing is removed. 196 */ 197 public boolean removePanel(String namePanel){ 198 boolean bOk = true; 199 GralPanelContent panel = panels.get(namePanel); 200 if(panel !=null){ 201 panels.remove(namePanel); 202 panel.remove(); 203 } else { 204 bOk = false; 205 } 206 return bOk; 207 } 208 209 210 public abstract static class ImplAccess extends GralPanelContent.ImplAccess 211 { 212 213 protected final GralTabbedPanel widgg; 214 215 protected ImplAccess(GralTabbedPanel widgg) 216 { 217 super(widgg); 218 this.widgg = widgg; 219 } 220 221 protected GralPanelContent getFocusedTab(){ return (GralPanelContent) widgg.primaryWidget; } 222 223 protected void setFocusedTab(GralPanelContent tab){ widgg.primaryWidget = tab; } 224 225 /**Adds a grid-panel in the TabPanel. The panel will be registered in the GuiPanelMng, 226 * so the access to the panel can be done with its name. 227 * The position of the widget manager is set to full area of this panel. 228 * 229 * @param sName The name, used in 230 * @param sLabel to designate the tab for view. A "&" left from a character determines the hot-key 231 * to select the tab. 232 * @param yGrid number of units per grid line vertical. It may be 1. 233 * @param xGrid number of units per grid line horizontal. It may be 1. 234 * @param yGrid2 Number of grid lines vertical per wider ranges for lines 235 * @param xGrid2 Number of grid lines horizontal per wider ranges for lines 236 * @return 237 */ 238 abstract public GralPanelContent addGridPanel(GralPanelContent panelg, String sLabel, int yGrid, int xGrid, int yGrid2, int xGrid2); 239 240 abstract public GralPanelContent addCanvasPanel(GralPanelContent panelg, String sLabel); 241 /**The named tab should be focused. 242 * TODO which widget should be focused? It may be a first widget in any GralPanelContent? 243 * In SWT it works if any widget in a tab is focused. The the tab is focused then automatically. 244 * It means this method is not necessary. If selectTab is called, the whole tab has the focus 245 * which means it content is visible. That is able to use. 246 * @param name 247 * @return 248 * @deprecated use {@link GralWidget#setFocus()} 249 */ 250 @Deprecated 251 abstract public GralPanelContent selectTab(String name); 252 253 } 254 255}