001package org.vishia.gral.swt; 002 003import org.eclipse.swt.SWT; 004import org.eclipse.swt.graphics.Font; 005import org.eclipse.swt.graphics.Point; 006import org.eclipse.swt.widgets.Composite; 007import org.eclipse.swt.widgets.Label; 008import org.vishia.gral.base.GralWidget; 009import org.vishia.gral.ifc.GralRectangle; 010import org.vishia.gral.widget.GralLabel; 011 012public class SwtLabel extends GralLabel.GraphicImplAccess 013{ 014 /**Version, history and license. 015 * <ul> 016 * <li>2013-12-23 Hartmut new: Uses the new concept of widget implementation. 017 * </ul> 018 * 019 * <b>Copyright/Copyleft</b>: 020 * For this source the LGPL Lesser General Public License, 021 * published by the Free Software Foundation is valid. 022 * It means: 023 * <ol> 024 * <li> You can use this source without any restriction for any desired purpose. 025 * <li> You can redistribute copies of this source to everybody. 026 * <li> Every user of this source, also the user of redistribute copies 027 * with or without payment, must accept this license for further using. 028 * <li> But the LPGL is not appropriate for a whole software product, 029 * if this source is only a part of them. It means, the user 030 * must publish this part of source, 031 * but doesn't need to publish the whole source of the own product. 032 * <li> You can study and modify (improve) this source 033 * for own using or for redistribution, but you have to license the 034 * modified sources likewise under this LGPL Lesser General Public License. 035 * You mustn't delete this Copyright/Copyleft inscription in this source file. 036 * </ol> 037 * If you intent to use this source without publishing its usage, you can get 038 * a second license subscribing a special contract with the author. 039 * 040 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 041 * 042 * 043 */ 044 @SuppressWarnings("hiding") 045 public static final int version = 20120317; 046 047 /**It contains the association to the swt widget (Control) and the {@link SwtMng} 048 * and implements some methods of {@link GralWidgImpl_ifc} which are delegate from this. 049 */ 050 private final SwtWidgetHelper swtWidgHelper; 051 052 protected Label labelSwt; 053 054 private Font fontSwt; 055 056 SwtLabel(GralLabel widgg, SwtMng mng) 057 { 058 widgg.super(widgg, mng.mng); 059 Composite panelSwt = mng.getCurrentPanel(); 060 int styleSwt = 0; 061 labelSwt = new Label(panelSwt, styleSwt); 062 super.wdgimpl = swtWidgHelper = new SwtWidgetHelper(labelSwt, mng); 063 int mode; 064 switch(origin()){ 065 case 1: mode = SWT.LEFT; break; 066 case 2: mode = SWT.CENTER; break; 067 case 3: mode = SWT.RIGHT; break; 068 case 4: mode = SWT.LEFT; break; 069 case 5: mode = SWT.CENTER; break; 070 case 6: mode = SWT.RIGHT; break; 071 case 7: mode = SWT.LEFT; break; 072 case 8: mode = SWT.CENTER; break; 073 case 9: mode = SWT.RIGHT; break; 074 default: mode = 0; 075 } 076 labelSwt.setAlignment(mode); 077 mng.setBounds_(widgg.pos(), labelSwt); 078 mng.mng.registerWidget(widgg); 079 repaintGthread(); //to set text etc. 080 } 081 082 083 @Override 084 public GralRectangle getPixelPositionSize(){ return swtWidgHelper.getPixelPositionSize(); } 085 086 087 @Override 088 public Object getWidgetImplementation(){ return labelSwt; } 089 090 091 @Override public void removeWidgetImplementation() 092 { swtWidgHelper.removeWidgetImplementation(); 093 labelSwt = null; 094 } 095 096 097 @Override 098 public void repaintGthread() 099 { 100 if(labelSwt !=null){ //do nothing if the graphic implementation widget is removed. 101 GralWidget.DynamicData dyda = dyda(); 102 int chg, catastrophicalCount =0; 103 while( (chg = getChanged()) !=0){ //widgg.dyda.whatIsChanged.get(); 104 if(++catastrophicalCount > 10000) 105 throw new RuntimeException("atomic failed"); 106 if((chg & chgColorText)!=0) { //firstly set the font 107 SwtProperties props = swtWidgHelper.mng.propertiesGuiSwt; 108 if((chg & chgVisible)!=0){ 109 labelSwt.setVisible(true); 110 } 111 if((chg & chgInvisible)!=0){ 112 labelSwt.setVisible(false); 113 } 114 if(dyda.textFont !=null){ 115 fontSwt = props.fontSwt(dyda.textFont); 116 labelSwt.setFont(fontSwt); 117 } 118 if(dyda.textColor !=null){ 119 labelSwt.setForeground(props.colorSwt(dyda.textColor)); 120 } 121 if(dyda.backColor !=null){ 122 labelSwt.setBackground(props.colorSwt(dyda.backColor)); 123 } 124 } 125 if((chg & chgText) !=0 && dyda.displayedText !=null){ 126 labelSwt.setText(dyda.displayedText); 127 //font.getFontData()[0]. 128 Point textSize = labelSwt.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); 129 //int width = sText.length(); 130 //widget.setSize(sizePixel); 131 132 Point widgetSize = labelSwt.getSize(); 133 if(widgetSize.x < textSize.x){ 134 labelSwt.setSize(textSize); 135 } 136 //labelSwt.setSize(textSize); 137 } 138 acknChanged(chg); 139 } 140 labelSwt.redraw(); 141 labelSwt.update(); 142 } 143 } 144 145 146 @Override public void setBoundsPixel(int x, int y, int dx, int dy) 147 { swtWidgHelper.setBoundsPixel(x, y, dx, dy); 148 } 149 150 151 @Override public boolean setFocusGThread() 152 { return swtWidgHelper.setFocusGThread(); } 153 154 @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); swtWidgHelper.setVisibleGThread(bVisible); } 155 156}