### Eclipse Workspace Patch 1.0 #P org.eclipse.datatools.sqltools.data.ui Index: src/org/eclipse/datatools/sqltools/data/internal/ui/bidi/BidiLayout.java =================================================================== RCS file: src/org/eclipse/datatools/sqltools/data/internal/ui/bidi/BidiLayout.java diff -N src/org/eclipse/datatools/sqltools/data/internal/ui/bidi/BidiLayout.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/datatools/sqltools/data/internal/ui/bidi/BidiLayout.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,757 @@ +/******************************************************************************* + * Copyright (c) 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + ******************************************************************************/ + +package org.eclipse.datatools.sqltools.data.internal.ui.bidi; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BidiSegmentEvent; +import org.eclipse.swt.custom.BidiSegmentListener; +import org.eclipse.swt.custom.LineBackgroundListener; +import org.eclipse.swt.custom.MovementListener; +import org.eclipse.swt.custom.ST; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.custom.StyledTextContent; +import org.eclipse.swt.custom.StyledTextPrintOptions; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.LineAttributes; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.internal.BidiUtil; +import org.eclipse.swt.internal.win32.OS; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.printing.Printer; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Caret; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; + +@SuppressWarnings("restriction") +public class BidiLayout extends Canvas { + + public static final int LANG_ARABIC = 0x01; + public static final int LANG_HEBREW = 0x0d; + public static final int LANG_ENGLISH = 0x09; + + private static final char LRO = '\u202d'; + private static final char RLO = '\u202e'; + private static final char PDF = '\u202c'; + static final String eolStr = "\r\n"; + + + + Listener listener; + StyledText styledText; + int bidiLangCode = 0; + int nonBidiLangCode = 0; + boolean isPushMode; + boolean isWidgetReversed; + boolean isAutoPush; + int indxPushSegmentStart = -1; + int lengthPushSegment = 0; + Caret defaultCaret = null; + MenuItem rtlMenuItem; + MenuItem autopushMenuItem; + char[] arrOfIgnoredChars = null; + private int prevLength = 0; + + + public BidiLayout(Composite parent, int style){ + super(parent, 0); + this.setLayout(new FillLayout()); + if ((parent.getLayout() instanceof FillLayout) || + (parent.getLayout() instanceof GridLayout)) + styledText = new StyledText(this, style); + else + styledText = new StyledText(parent, style); + + addBidiSegmentListener(); + addListeners(); + styledText.setMenu(createContextMenu()); + } + + public void setBidiLang (int lang) { + bidiLangCode = lang; + } + public void setNonBidiLang (int lang) { + nonBidiLangCode = lang; + } + + public void setArrOfIgnoredChars(char[] arr){ + arrOfIgnoredChars = (char[])arr.clone(); + } + + private void addListeners() { + listener = new Listener() { + + public void handleEvent(Event event) { + switch (event.type) { + case SWT.MouseDown: handleMouseDown(event); break; + case SWT.KeyDown: handleKeyDown(event); break; + } + + } + }; + addAndReorderListener(SWT.KeyDown, listener); + styledText.addListener(SWT.MouseDown, listener); + addAndReorderListener(SWT.Show, listener); + + styledText.addKeyListener(new KeyListener() { + public void keyReleased(KeyEvent keyEvent) { + if ((keyEvent.keyCode == 'u') && + ((keyEvent.stateMask & SWT.CTRL) != 0)){ + setPush(true); + keyEvent.doit = false; + }else if ((keyEvent.keyCode == 'o') && + ((keyEvent.stateMask & SWT.CTRL) != 0)) { + setPush(false); + keyEvent.doit = false; + } else if ((keyEvent.keyCode == 't') && + ((keyEvent.stateMask & SWT.CTRL) != 0)){ + switchAutoPush(); + keyEvent.doit = false; + } else if (isPushMode && (keyEvent.keyCode == SWT.HOME || keyEvent.keyCode==SWT.END)){ + int carPos = getCaretOffset(); + setPush(false); + setCaretOffset(carPos); + } + } + + public void keyPressed(KeyEvent e) { + } + }); + } + + public void addAndReorderListener(int eventType, Listener listener){ + //have to 'reorder' listeners in eventTable. BidiLayout's listener should come first (before StyledText's one) + Listener[] listeners = styledText.getListeners(eventType); + Listener styledTextListener = null; + for (int i=0; i= ' ' && event.character != SWT.DEL){ + handleAutoPush(); + } + if ((arrOfIgnoredChars != null) && ((new String(arrOfIgnoredChars)).indexOf(event.character) != -1)){ + event.doit = false; + event.type = SWT.None; + return; + } + } + } + + private boolean isCursorAtStartPushSegemet() { + int caretOffset = styledText.getCaretOffset(); + if (isCaretAtTheLAstLine()) //it is the last line of string + caretOffset --; + //pushSegmentStart was stored when string had similar to widget orientation, therefore it needs to be 'mirrored' for comparison + int mirroredBoundPosition = calculateMirroredPushSegmentStart(); + if (mirroredBoundPosition == (caretOffset-1)) + return true; + return false; + } + private boolean isCursorAtEndPushSegemet() { + int caretOffset = styledText.getCaretOffset(); + if (isCaretAtTheLAstLine()) + caretOffset --; + //pushSegmentStart was stored when string had similar to widget orientation, therefore it needs to be 'mirrored' for comparison + int mirroredBoundPosition = calculateMirroredPushSegmentEnd(); + + if (mirroredBoundPosition == caretOffset) + return true; + return false; + } + private int calculateMirroredCaretPosition(int caretPos) { + LineIndx lineIndx = new LineIndx(styledText.getText(),styledText.getCaretOffset()); + return lineIndx.getEndIndx() - (caretPos - lineIndx.getStartIndx()); + } + private int calculateMirroredPushSegmentEnd() { + return calculateMirroredCaretPosition(indxPushSegmentStart); + } + private int calculateMirroredPushSegmentStart() { + return calculateMirroredPushSegmentEnd() - lengthPushSegment; + } + + private boolean isCaretAtTheLAstLine(){ + LineIndx lineIndx = new LineIndx(styledText.getText(),styledText.getCaretOffset()); + if (lineIndx.getEndIndx() == styledText.getText().length()-1) + return true; + return false; + } + + private boolean isCaretInsidePushSegment(){ + int mirroredPushSegmentEnd = calculateMirroredPushSegmentEnd(); + int mirroredPushSegmentStart = calculateMirroredPushSegmentStart(); + int caretPos = styledText.getCaretOffset(); + if ((caretPos >= mirroredPushSegmentStart) && (caretPos <= mirroredPushSegmentEnd)) + return true; + return false; + } + + protected void switchAutoPush() { + isAutoPush = !isAutoPush; + autopushMenuItem.setSelection(isAutoPush); + } + public boolean isPushMode(){ + return isPushMode; + } + public void switchWidgetDir() { + switchWidgetDir(true); + } + public void switchWidgetDir(boolean forceSringReverse) { + isWidgetReversed = !isWidgetReversed; + int carPos = styledText.getCaretOffset(); + if (forceSringReverse) + styledText.setText(reverseStr(styledText.getText())); + styledText.setCaretOffset (carPos); + rtlMenuItem.setSelection(isWidgetReversed); + + if (isPushMode) + setPush(false); + if (isWidgetReversed) + setBidiKeyboardLanguage(); + else + setNonBidiKeyboardLanguage(); + } + + public void setPush(boolean pushOn) { + if (isPushMode == pushOn) + return; + isPushMode = pushOn; + if (pushOn) { + startPushMode(); + } + else { + endPushMode(); + indxPushSegmentStart = -1; + lengthPushSegment = 0; + } + } + + private void endPushMode() { + styledText.setCaret(defaultCaret); + styledText.setCaret(defaultCaret); + styledText.setText(reverseStr(styledText.getText())); + styledText.setCaretOffset (indxPushSegmentStart + lengthPushSegment); + if (!isWidgetReversed) + setNonBidiKeyboardLanguage(); + else + setBidiKeyboardLanguage(); + + } + + public static String reverseStr (String str) { + String resultStr = ""; + String orgStr = new String(str); + int i=-1; + while ((i = orgStr.indexOf(eolStr)) != -1){ + StringBuffer sb = new StringBuffer(orgStr.substring(0,i)); + resultStr += sb.reverse() + eolStr; + orgStr = orgStr.substring(i + eolStr.length()); + } + if (orgStr.length()>0){ + StringBuffer sb = new StringBuffer(orgStr); + resultStr += sb.reverse(); + } + return resultStr; + } + + public void addBidiSegmentListener() { + styledText.addBidiSegmentListener(new BidiSegmentListener() { + public void lineGetSegments(BidiSegmentEvent event) { + int length = event.lineText.length(); + if ((isPushMode && !isWidgetReversed) || + (!isPushMode && isWidgetReversed)){ + event.segments = new int[] { 0}; + event.segmentsChars = new char[] { RLO}; + } else { + event.segments = new int[] { 0, length }; + event.segmentsChars = new char[] { LRO, PDF }; + } + if (isPushMode && (indxPushSegmentStart != -1) && (prevLength< length)) + lengthPushSegment++; + prevLength = length; + } + }); + + } + protected void startPushMode() { + final Image image = new Image (styledText.getDisplay(), 20, 20); + GC gc = new GC (image); + gc.setBackground (styledText.getDisplay().getSystemColor(SWT.COLOR_BLACK)); + gc.fillRectangle (0, 0, 20, 20); + gc.setForeground (styledText.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + gc.setLineAttributes(new LineAttributes(2)); + gc.drawLine (0, 13, gc.getFontMetrics().getAverageCharWidth(), 13); + gc.dispose (); + defaultCaret = styledText.getCaret(); + Caret cc = new Caret(styledText, 0); + cc.setImage(image); + styledText.setCaret(cc); + int carOffset = styledText.getCaretOffset(); + + + String str = reverseStr(styledText.getText()); + styledText.setText(str); + indxPushSegmentStart = carOffset; + styledText.setCaretOffset(getUpdatedCaret(carOffset)); + if (!isWidgetReversed) + setBidiKeyboardLanguage(); + else + setNonBidiKeyboardLanguage(); + } + private int getUpdatedCaret(int carOffset) { + String str = styledText.getText(); + LineIndx lineIndx = new LineIndx(str, carOffset); + int starIndx = lineIndx.getStartIndx(); + int endIndx = lineIndx.getEndIndx(); + if (endIndx == str.length()-1) //it is the last line of string + carOffset --; + return starIndx + (endIndx - carOffset); + } + private void handleAutoPush(){ + if ((isPushMode && !isWidgetReversed && (BidiUtil.getKeyboardLanguage() == BidiUtil.KEYBOARD_NON_BIDI))|| + (isPushMode && isWidgetReversed && (BidiUtil.getKeyboardLanguage() == BidiUtil.KEYBOARD_BIDI))) + setPush(false); + else if ((!isPushMode && !isWidgetReversed && (BidiUtil.getKeyboardLanguage() == BidiUtil.KEYBOARD_BIDI)) || + (!isPushMode && isWidgetReversed && (BidiUtil.getKeyboardLanguage() == BidiUtil.KEYBOARD_NON_BIDI))) + setPush(true); + } + + public boolean isWidgetReversed() { + return isWidgetReversed; + } + + + private void setBidiKeyboardLanguage(){ + if (bidiLangCode == 0) + BidiUtil.setKeyboardLanguage(BidiUtil.KEYBOARD_BIDI); + else + setSpecificKeyboardLanguage(bidiLangCode); + } + + private void setNonBidiKeyboardLanguage(){ + if (nonBidiLangCode == 0) + BidiUtil.setKeyboardLanguage(BidiUtil.KEYBOARD_NON_BIDI); + else + setSpecificKeyboardLanguage(nonBidiLangCode); + } + + public static boolean setSpecificKeyboardLanguage(int langCode){ + int currentLang = OS.PRIMARYLANGID(OS.LOWORD(OS.GetKeyboardLayout(0))); + if (currentLang == langCode) + return true; + int [] list = getKeyboardLanguageList(); + for (int i=0; inull. + */ + private BidiLayout bidiLayout; + + /** + * Creates a new BidiLayout string cell editor with no control + * The cell editor value is the string itself, which is initially the empty + * string. + */ + public BidiLayoutCellEditor() { + super(); + } + + /** + * Creates a new BidiLayout string cell editor with no control + * The cell editor value is the string itself, which is initially the empty + * string. + * @param parent + */ + public BidiLayoutCellEditor(Composite parent) { + super(parent); + } + + /** + * Creates a new BidiLayout string cell editor with no control + * The cell editor value is the string itself, which is initially the empty + * string. + * @param parent + * @param style + */ + public BidiLayoutCellEditor(Composite parent, int style) { + super(parent, style); + } + + protected Control createControl(Composite parent) { + bidiLayout = new BidiLayout(parent, getStyle()); + bidiLayout.setArrOfIgnoredChars(new char[] {'\t'}); + bidiLayout.addSelectionListener(new SelectionAdapter() { + public void widgetDefaultSelected(SelectionEvent e) { + handleDefaultSelection(e); + } + }); + bidiLayout.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + keyReleaseOccured(e); + if ((getControl() == null) || getControl().isDisposed()) { + return; + } + if (e.character == '\r') { // Return key + Event event = new Event(); + event.widget = e.widget; + event.stateMask = e.stateMask; + event.doit = e.doit; + + SelectionEvent selectionEvent = new SelectionEvent(event); + handleDefaultSelection(selectionEvent); + } + } + }); + bidiLayout.getStyledText().addTraverseListener(new TraverseListener() { + public void keyTraversed(TraverseEvent e) { + if (e.detail == SWT.TRAVERSE_ESCAPE + || e.detail == SWT.TRAVERSE_RETURN) { + e.doit = false; + } + + } + }); + + bidiLayout.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + BidiLayoutCellEditor.this.focusLost(); + } + }); + bidiLayout.setFont(parent.getFont()); + bidiLayout.setBackground(parent.getBackground()); + bidiLayout.setText("");//$NON-NLS-1$ + return bidiLayout.getStyledText(); + } + + + protected Object doGetValue() { + + String returnStr; + if (bidiLayout.isWidgetReversed() ^ bidiLayout.isPushMode()) + returnStr = BidiLayout.reverseStr(bidiLayout.getText()); + else + returnStr = bidiLayout.getText(); + if (bidiLayout.isPushMode()) + bidiLayout.setPush(false); + return returnStr; + } + protected void doSetValue(Object value) { + Assert.isTrue(bidiLayout != null && bidiLayout.getStyledText() != null && (value instanceof String)); + String bidiValue; + if (bidiLayout.isPushMode()) + bidiValue = BidiLayout.reverseStr((String) value); + else + bidiValue = (String) value; + bidiLayout.setText(bidiValue); + } + protected void doSetFocus() { + if ((bidiLayout != null) && (bidiLayout.getStyledText() != null)) { + bidiLayout.selectAll(); + bidiLayout.getStyledText().setFocus(); + } + } + + + protected int getTextSelectionCount(){ + return bidiLayout.getSelectionCount(); + } + + public Control getTextWidget(){ + return bidiLayout; + } + + protected int getTextCaretPosition(){ + return bidiLayout.getCaretOffset(); + } + + protected int getTextCharCount(){ + return bidiLayout.getCharCount(); + } + + protected String getText() { + return bidiLayout.getText(); + } +} Index: src/org/eclipse/datatools/sqltools/data/internal/ui/editor/BidiLayoutTableDataCellEditor.java =================================================================== RCS file: src/org/eclipse/datatools/sqltools/data/internal/ui/editor/BidiLayoutTableDataCellEditor.java diff -N src/org/eclipse/datatools/sqltools/data/internal/ui/editor/BidiLayoutTableDataCellEditor.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/datatools/sqltools/data/internal/ui/editor/BidiLayoutTableDataCellEditor.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + ******************************************************************************/ + +package org.eclipse.datatools.sqltools.data.internal.ui.editor; + +import org.eclipse.datatools.sqltools.data.internal.ui.bidi.BidiLayoutCellEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class BidiLayoutTableDataCellEditor extends BidiLayoutCellEditor { + + protected TableDataEditor editor; + + public BidiLayoutTableDataCellEditor(TableDataEditor editor, Composite parent) + { + super(parent); + this.editor = editor; + } + + protected Control createControl(Composite parent) { + Control c = super.createControl(parent); + c.addTraverseListener(new TraverseListener() { + public void keyTraversed(TraverseEvent e) { + handleTraverse(e); + + } + }); + return c; + } + + protected void handleTraverse(TraverseEvent e) + { + if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS || e.detail == SWT.TRAVERSE_TAB_NEXT) { + fireApplyEditorValue(); + deactivate(); + editor.getCursor().handleTraverse(e); + editor.getCursor().forceFocus(); + editor.getCursor().edit(); + } else if (e.detail == SWT.TRAVERSE_RETURN){ + editor.getCursor().forceFocus(); + } + } +} Index: src/org/eclipse/datatools/sqltools/data/internal/ui/editor/DefaultExternalTableDataWizardPage.java =================================================================== RCS file: /cvsroot/datatools/org.eclipse.datatools.sqltools/plugins/org.eclipse.datatools.sqltools.data.ui/src/org/eclipse/datatools/sqltools/data/internal/ui/editor/DefaultExternalTableDataWizardPage.java,v retrieving revision 1.5 diff -u -r1.5 DefaultExternalTableDataWizardPage.java --- src/org/eclipse/datatools/sqltools/data/internal/ui/editor/DefaultExternalTableDataWizardPage.java 24 May 2010 04:52:22 -0000 1.5 +++ src/org/eclipse/datatools/sqltools/data/internal/ui/editor/DefaultExternalTableDataWizardPage.java 6 Oct 2010 12:50:12 -0000 @@ -19,10 +19,13 @@ import java.io.IOException; import org.eclipse.core.runtime.IStatus; +import org.eclipse.datatools.connectivity.internal.bidi.BidiUtils; +import org.eclipse.datatools.connectivity.sqm.internal.core.connection.ConnectionAdapter; import org.eclipse.datatools.modelbase.sql.tables.Column; import org.eclipse.datatools.sqltools.data.internal.core.editor.IRowData; import org.eclipse.datatools.sqltools.data.internal.core.editor.ITableData2; import org.eclipse.datatools.sqltools.data.internal.ui.DataUIPlugin; +import org.eclipse.datatools.sqltools.data.internal.ui.bidi.BidiLayout; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.WizardPage; @@ -35,8 +38,8 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; /** * The default Wizard Page for external editing of the TableDataEditor. @@ -56,6 +59,8 @@ /** the default implementation of the edit area, a simple Text area */ protected Text textWidget; + /** the bidi-specific implementation of the edit area, a Bidi area based on StyledText */ + protected BidiLayout bidiLayoutWidget; /** The Import button */ protected Button btnImport; @@ -86,6 +91,9 @@ protected int buttonAreaSpan; + private boolean isBidiVisualSupportRequired = false; + private boolean isBidiRTLSupportRequired = false; + /** * Creates the default page with the given editor * @param pageName the name of the page @@ -129,6 +137,14 @@ // how many buttons we create in the buttonArea buttonAreaSpan = 1; + + if ((rowData.getTable() instanceof ITableData2) && + (((ITableData2)rowData.getTable()).getConnection() instanceof ConnectionAdapter)){ + ConnectionAdapter ca = (ConnectionAdapter)((ITableData2)rowData.getTable()).getConnection(); + String schemaName = ((ITableData2)rowData.getTable()).getSQLTable().getSchema().getName(); + isBidiVisualSupportRequired = BidiUtils.isBidiVisualSupportRequired(ca.getConnectionInfo().getConnectionProfile(), schemaName, editor.getTitle()); + isBidiRTLSupportRequired = BidiUtils.isBidiRTLSupportRequired(ca.getConnectionInfo().getConnectionProfile(), schemaName, editor.getTitle()); + } } /** @@ -198,10 +214,20 @@ glEditor.marginWidth = 0; editorComp.setLayout(glEditor); editorComp.setLayoutData( new GridData(GridData.FILL_BOTH) ); + int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL; + if (isBidiRTLSupportRequired) + style |= SWT.RIGHT_TO_LEFT; + + if (!isBidiVisualSupportRequired){ + textWidget = new Text(editorComp, style); + } else { + bidiLayoutWidget = new BidiLayout(editorComp, style); + if (isBidiRTLSupportRequired) + bidiLayoutWidget.switchWidgetDir(false); + } - textWidget = new Text(editorComp, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL ); // always enable it so that at least a manual copy and paste from a read-only table can be copied.. - textWidget.setEnabled(true); + getEditWidget().setEnabled(true); boolean editable = (!hasNullValue && !editor.isReadonly()) ; // if it is new (yet null) value of a non-nullable column (i.e. non-nullable and set to null) @@ -214,13 +240,16 @@ else { nonNullableCheck = (!((Column)editor.getSqlTable().getColumns().get(columnIndex)).isNullable() && hasNullValue); } - textWidget.setEditable(editable || nonNullableCheck); + if (!isBidiVisualSupportRequired) + textWidget.setEditable(editable || nonNullableCheck); + else + bidiLayoutWidget.setEditable(editable || nonNullableCheck); editorAreaIsSerialized = true; // as we deal with a text field, we want it serialized GridData gdtxtTextValue = new GridData(GridData.FILL_BOTH); gdtxtTextValue.grabExcessHorizontalSpace = true; gdtxtTextValue.grabExcessVerticalSpace = true; - textWidget.setLayoutData(gdtxtTextValue); + getEditWidget().setLayoutData(gdtxtTextValue); gdtxtTextValue.horizontalSpan = 1; //limit width/height of text area when string content is very wide or long gdtxtTextValue.widthHint = 400; @@ -435,7 +464,9 @@ // for others disable widget itself if (getEditWidget() instanceof Text){ ((Text)getEditWidget()).setEditable(!btnSetNull.getSelection()); - } else{ + } else if (getEditWidget() instanceof BidiLayout){ + ((BidiLayout)getEditWidget()).setEditable(!btnSetNull.getSelection()); + } else { getEditWidget().setEnabled(!btnSetNull.getSelection()); } if(displayImportBtn){ @@ -644,7 +675,12 @@ protected Object getEditorAreaContent(){ // we dont need to deserialize // as we deal with Strings - return textWidget.getText(); + if (!isBidiVisualSupportRequired) + return textWidget.getText(); + else + if (bidiLayoutWidget.isWidgetReversed() ^ bidiLayoutWidget.isPushMode()) + return BidiLayout.reverseStr(bidiLayoutWidget.getText()); + return bidiLayoutWidget.getText(); } /** @@ -660,9 +696,15 @@ } if (serializedContent == null){ hasNullValue = true; // input is still null - textWidget.setText(""); //$NON-NLS-1$ + if (!isBidiVisualSupportRequired) + textWidget.setText(""); //$NON-NLS-1$ + else + bidiLayoutWidget.setText(""); //$NON-NLS-1$ } else{ - textWidget.setText(serializedContent); + if (!isBidiVisualSupportRequired) + textWidget.setText(serializedContent); + else + bidiLayoutWidget.setText(serializedContent); ; hasNullValue = false; } } @@ -698,6 +740,8 @@ * @return the edit widget */ protected Control getEditWidget(){ - return textWidget; - } + if (!isBidiVisualSupportRequired) + return textWidget; + return bidiLayoutWidget; +} } Index: src/org/eclipse/datatools/sqltools/data/internal/ui/editor/TableDataEditor.java =================================================================== RCS file: /cvsroot/datatools/org.eclipse.datatools.sqltools/plugins/org.eclipse.datatools.sqltools.data.ui/src/org/eclipse/datatools/sqltools/data/internal/ui/editor/TableDataEditor.java,v retrieving revision 1.8 diff -u -r1.8 TableDataEditor.java --- src/org/eclipse/datatools/sqltools/data/internal/ui/editor/TableDataEditor.java 29 Apr 2010 18:59:09 -0000 1.8 +++ src/org/eclipse/datatools/sqltools/data/internal/ui/editor/TableDataEditor.java 6 Oct 2010 12:50:12 -0000 @@ -18,6 +18,9 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.datatools.connectivity.IConnectionProfile; +import org.eclipse.datatools.connectivity.internal.bidi.BidiConstants; +import org.eclipse.datatools.connectivity.internal.bidi.BidiUtils; import org.eclipse.datatools.connectivity.sqm.core.connection.ConnectionInfo; import org.eclipse.datatools.connectivity.sqm.core.connection.DatabaseConnectionRegistry; import org.eclipse.datatools.connectivity.sqm.internal.core.connection.ConnectionInfoImpl; @@ -29,6 +32,8 @@ import org.eclipse.datatools.sqltools.data.internal.core.editor.TableDataImpl; import org.eclipse.datatools.sqltools.data.internal.ui.DataUIPlugin; import org.eclipse.datatools.sqltools.data.internal.ui.OutputItemAdapter; +import org.eclipse.datatools.sqltools.data.internal.ui.bidi.BidiLayout; +import org.eclipse.datatools.sqltools.data.internal.ui.bidi.BidiLayoutCellEditor; import org.eclipse.datatools.sqltools.result.OperationCommand; import org.eclipse.datatools.sqltools.result.ResultsViewAPI; import org.eclipse.jface.action.GroupMarker; @@ -97,8 +102,11 @@ } public void createPartControl(Composite parent) { - - tableViewer = new TableViewer(parent, SWT.HIDE_SELECTION); + + int style = SWT.HIDE_SELECTION; + if (BidiUtils.isBidiEnabled() && isRTLTable()) + style |= SWT.RIGHT_TO_LEFT; + tableViewer = new TableViewer(parent, style); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLinesVisible(true); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); @@ -130,7 +138,16 @@ createContextMenu(); } - public void dispose() { + private boolean isRTLTable() { + Database database = sqlTable.getSchema().getCatalog() != null ? + sqlTable.getSchema().getCatalog().getDatabase(): + sqlTable.getSchema().getDatabase(); + ConnectionInfo connInfo = DatabaseConnectionRegistry.getConnectionForDatabase(database); + IConnectionProfile connectionProfie = ((ConnectionInfoImpl)connInfo).getConnectionProfile(); + return BidiUtils.isBidiRTLSupportRequired(connectionProfie, sqlTable.getSchema().getName(), sqlTable.getName()); + } + + public void dispose() { if (tableData!=null) tableData.dispose(); super.dispose(); @@ -362,15 +379,31 @@ protected void configureTable() { - TextCellEditor textEditor = new TableDataCellEditor(this, tableViewer.getTable()); + TextCellEditor textEditor; + + Database database = sqlTable.getSchema().getCatalog().getDatabase(); + ConnectionInfo connInfo = DatabaseConnectionRegistry.getConnectionForDatabase(database); + + if (!BidiUtils.isBidiVisualSupportRequired(connInfo.getConnectionProfile(), sqlTable.getSchema().getName(), getTitle()))//isBidiSupportRequired(connInfo.getConnectionProfile())) + textEditor = new TableDataCellEditor(this, tableViewer.getTable()); + else { + textEditor = new BidiLayoutTableDataCellEditor(this, tableViewer.getTable()); + if (BidiUtils.isBidiRTLSupportRequired(connInfo.getConnectionProfile(), sqlTable.getSchema().getName(), getTitle())) { + BidiLayout bl = (BidiLayout)((BidiLayoutCellEditor)textEditor).getTextWidget(); + bl.switchWidgetDir(false); + } + } CellEditor[] editors = new CellEditor[tableData.getColumnCount()]; String[] properties = new String[tableData.getColumnCount()]; - + boolean isBidiRTL = (tableViewer.getTable().getStyle() & SWT.RIGHT_TO_LEFT) != 0; for (int i=0; i