001package org.vishia.gral.swt; 002 003import java.util.List; 004import java.util.Queue; 005 006import org.eclipse.swt.SWT; 007import org.eclipse.swt.events.ControlEvent; 008import org.eclipse.swt.events.ControlListener; 009import org.eclipse.swt.events.FocusEvent; 010import org.eclipse.swt.events.FocusListener; 011import org.eclipse.swt.events.SelectionEvent; 012import org.eclipse.swt.events.SelectionListener; 013import org.eclipse.swt.graphics.Color; 014import org.eclipse.swt.graphics.Rectangle; 015import org.eclipse.swt.widgets.Composite; 016import org.eclipse.swt.widgets.Control; 017import org.eclipse.swt.widgets.TabFolder; 018import org.eclipse.swt.widgets.TabItem; 019import org.eclipse.swt.widgets.Widget; 020import org.vishia.gral.base.GralPanelContent; 021import org.vishia.gral.base.GralTabbedPanel; 022import org.vishia.gral.base.GralPanelActivated_ifc; 023import org.vishia.gral.base.GralWidget; 024import org.vishia.gral.ifc.GralColor; 025import org.vishia.gral.ifc.GralRectangle; 026 027public class SwtTabbedPanel extends GralTabbedPanel.ImplAccess 028{ 029 030 /**Version, history and license. 031 * <ul> 032 * <li>2012-03-31 Hartmut new: supports {@link GralPanelContent.MethodsCalledbackFromImplementation#setVisibleState(boolean)} 033 * <li>2011-06-00 Hartmut created 034 * </ul> 035 * 036 * <b>Copyright/Copyleft</b>:<br> 037 * For this source the LGPL Lesser General Public License, 038 * published by the Free Software Foundation is valid. 039 * It means: 040 * <ol> 041 * <li> You can use this source without any restriction for any desired purpose. 042 * <li> You can redistribute copies of this source to everybody. 043 * <li> Every user of this source, also the user of redistribute copies 044 * with or without payment, must accept this license for further using. 045 * <li> But the LPGL is not appropriate for a whole software product, 046 * if this source is only a part of them. It means, the user 047 * must publish this part of source, 048 * but doesn't need to publish the whole source of the own product. 049 * <li> You can study and modify (improve) this source 050 * for own using or for redistribution, but you have to license the 051 * modified sources likewise under this LGPL Lesser General Public License. 052 * You mustn't delete this Copyright/Copyleft inscription in this source file. 053 * </ol> 054 * If you intent to use this source without publishing its usage, you can get 055 * a second license subscribing a special contract with the author. 056 * 057 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 058 */ 059 public static final int version = 20120331; 060 061 062 /**The Swt TabFolder implementation. */ 063 /*pkgprivate*/ TabFolder widgetSwt; 064 065 final SwtMng mng; 066 067 SwtTabbedPanel(GralTabbedPanel panelg, SwtMng mng, GralPanelActivated_ifc user, int property) 068 { super(panelg); //initializes as GralWidget and as GralPanel 069 this.mng = mng; 070 Object oParent = widgg.pos().panel._wdgImpl.getWidgetImplementation(); //this.pos().panel.getPanelImpl(); 071 if(oParent == null || !(oParent instanceof Composite) ){ 072 throw new IllegalArgumentException("Software error. You must select a panel before."); 073 } 074 Composite parent = (Composite)oParent; 075 076 //this.panelComposite = parent; 077 widgetSwt = new TabFolder(parent, SWT.TOP); 078 079 080 widgetSwt.addSelectionListener(tabItemSelectListener); 081 widgetSwt.addControlListener(resizeListener); 082 083 } 084 085 086 087 088 @Override public GralPanelContent addGridPanel(GralPanelContent panelg, String sLabel, int yGrid, int xGrid, int yGrid2, int xGrid2) 089 { /// 090 widgg.gralMng().setTabbedPanel(widgg); //setMngToTabbedPanel(); 091 Rectangle sizeTabFolder = widgetSwt.getBounds(); 092 TabItem tabItem = new TabItem(widgetSwt, SWT.None); 093 tabItem.setText(sLabel); 094 //tabItem.addFocusListener(SWT.FocusIn, focusTabListener); 095 SwtCanvasStorePanel panel; 096 Color colorBackground = mng.propertiesGuiSwt.colorSwt(0xeeeeee); 097 if(yGrid <0 || xGrid <0){ 098 panel = new SwtCanvasStorePanel(panelg, widgetSwt, 0, colorBackground, mng.mng); 099 } else { 100 panel = new SwtGridPanel(panelg, widgetSwt, 0, colorBackground, mng.mng.propertiesGui.xPixelUnit(), mng.mng.propertiesGui.yPixelUnit(), 5, 5, mng.mng); 101 } 102 panel.swtCanvas.setBounds(sizeTabFolder); 103 panel.itsTabSwt = tabItem; 104 tabItem.setControl(panel.swtCanvas); 105 panel.swtCanvas.addFocusListener(focusTabListener); //unused... 106 GralPanelContent gralPanel = panel.gralPanel(); 107 //mng.mng.registerPanel(gralPanel); //register the panel in the mng. 108 //mng.mng.registerWidget(gralPanel); 109 //panels.put(sName, gralPanel); //register the tab panel in the TabbedPanel 110 mng.mng.setPosition(0, 0, 0, 0, 0, '.'); 111 return gralPanel; 112 } 113 114 115 @Override public GralPanelContent addCanvasPanel(GralPanelContent panelg, String sLabel) 116 { 117 widgg.gralMng().setTabbedPanel(widgg); //setMngToTabbedPanel(); 118 TabItem tabItemOperation = new TabItem(widgetSwt, SWT.None); 119 tabItemOperation.setText(sLabel); 120 Color colorBackground = mng.propertiesGuiSwt.colorSwt(0xeeeeee); 121 SwtCanvasStorePanel swtPanel = (new SwtCanvasStorePanel(panelg, widgetSwt, 0, colorBackground, mng.mng)); 122 GralPanelContent panel = swtPanel.gralPanel(); 123 //mng.mng.registerPanel(panel); 124 tabItemOperation.setControl(swtPanel.swtCanvas); 125 return panel; 126 } 127 128 129 130 /**See {@link GralWidget#setFocusGThread()} 131 * @see org.vishia.gral.base.GralTabbedPanel#selectTab(java.lang.String) 132 */ 133 @Override public GralPanelContent selectTab(String name) 134 { //assert(false); 135 136 GralPanelContent panel = mng.mng.getPanel(name); 137 Object oSwtPanel = panel.getImpl(); //getWidgetImplementation(); 138 SwtPanel swtPanel = (SwtPanel)oSwtPanel; 139 if(swtPanel.itsTabSwt !=null){ 140 widgetSwt.setSelection(swtPanel.itsTabSwt); 141 } 142 return panel; 143 } 144 145 146 public SelectionListener tabItemSelectListener = new SelectionListener(){ 147 148 @Override 149 public void widgetDefaultSelected(SelectionEvent event) 150 { 151 widgetSelected(event); 152 } 153 154 155 /**It is the selected method of the TabFolder. 156 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) 157 */ 158 @Override public void widgetSelected(SelectionEvent event) 159 { 160 try{ 161 TabItem tab = (TabItem)event.item; //The tab 162 Control container = tab.getControl(); //Its container 163 if(container != null){ 164 //TabFolder tabFolder = tab.getParent(); 165 Object data = container.getData(); 166 if(data != null){ 167 @SuppressWarnings("unchecked") 168 SwtPanel swtPanel = (SwtPanel)data; 169 GralPanelContent panelContent = (GralPanelContent)(swtPanel.widgg); 170 List<GralWidget> widgetInfos = panelContent.getWidgetList(); 171 widgg.newWidgetsVisible = widgetInfos; //the next call of getWidgetsVisible will be move this reference to widgetsVisible. 172 if(getFocusedTab() !=null){ 173 widgg.getFocusedTab().setVisibleState(false); //the last focused tab. 174 } 175 setFocusedTab( panelContent ); 176 //done with setFocus: widgg.focusedTab.setVisibleState(true); //the currently focused tab. 177 panelContent.setFocus(); 178 //System.out.printf("Fcmd-selectTab; %s", panelContent.toString()); 179 //mng.log.sendMsg(0, "Fcmd-selectTab %s", panelContent.toString()); 180 if(widgg.notifyingUserInstanceWhileSelectingTab !=null){ 181 widgg.notifyingUserInstanceWhileSelectingTab.panelActivatedGui(widgetInfos); 182 } 183 } 184 } 185 } 186 catch(Exception exc){ 187 String sMsg = exc.getMessage(); 188 if(sMsg == null){ sMsg = "nullPointer"; } 189 System.err.println(sMsg); 190 exc.printStackTrace(System.err); 191 } 192 } 193 }; 194 195 196 ControlListener resizeListener = new ControlListener() 197 { @Override public void controlMoved(ControlEvent e) 198 { //do nothing if moved. 199 stop(); 200 } 201 202 @Override public void controlResized(ControlEvent e) 203 { 204 stop(); 205 //validateFrameAreas(); //calculates the size of the areas newly and redraw. 206 } 207 208 }; 209 210 211 ControlListener resizeItemListener = new ControlListener() 212 { @Override public void controlMoved(ControlEvent e) 213 { //do nothing if moved. 214 stop(); 215 } 216 217 @Override public void controlResized(ControlEvent e) 218 { 219 stop(); 220 //validateFrameAreas(); //calculates the size of the areas newly and redraw. 221 } 222 223 }; 224 225 226 FocusListener focusTabListener = new FocusListener() 227 { 228 229 @Override 230 public void focusGained(FocusEvent e) 231 { 232 // TODO Auto-generated method stub 233 stop(); 234 } 235 236 @Override 237 public void focusLost(FocusEvent e) 238 { 239 // TODO Auto-generated method stub 240 241 } 242 243 }; 244 245 @Override public Widget getWidgetImplementation(){ return widgetSwt; } 246 247 248 249 @Override public GralRectangle getPixelPositionSize(){ return SwtWidgetHelper.getPixelPositionSize(widgetSwt); } 250 251 252 /* 253 @Override public GralRectangle getPixelSize(){ 254 Rectangle r = ((Composite)panelComposite).getClientArea(); 255 GralRectangle posSize = new GralRectangle(0, 0, r.width, r.height); 256 return posSize; 257 } 258 */ 259 260 261 @Override public boolean setFocusGThread(){ 262 super.widgg.setVisibleState(true); 263 return widgetSwt.setFocus(); 264 } 265 266 @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); widgetSwt.setVisible(bVisible); } 267 268 269 @Override public void setBoundsPixel(int x, int y, int dx, int dy) 270 { widgetSwt.setBounds(x,y,dx,dy); 271 } 272 273 274 275 @Override public void repaintGthread(){ widgetSwt.redraw(); widgetSwt.update(); } 276 277 //@Override public Composite getPanelImpl() { return widgetSwt; } 278 279 @Override public void removeWidgetImplementation() 280 { widgetSwt.dispose(); 281 widgetSwt = null; 282 } 283 284 285 286 void stop(){} 287 288 289 290 291 @Override public GralRectangle getPixelSize() 292 { 293 // TODO Auto-generated method stub 294 return null; 295 } 296 297 298}