/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.dataviewer.find; import hydrograph.ui.dataviewer.actions.FindAction; import hydrograph.ui.dataviewer.constants.Views; import hydrograph.ui.dataviewer.window.DebugDataViewer; import hydrograph.ui.logging.factory.LogFactory; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.custom.TableCursor; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.events.ShellListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.slf4j.Logger; /** * The Class FindViewDataDialog. * Provides Dialog for Data Viewer Find functionality. * @author Bitwise * */ public class FindViewDataDialog extends Dialog{ private static final Logger logger = LogFactory.INSTANCE.getLogger(FindViewDataDialog.class); public static final int CLOSE = 9999; private static final String labelText = "String Not Found"; private TableViewer debugDataViewer; private StyledText formatedStyledText; private StyledText unFormatedStyledText; private CTabFolder cTabFolder; private Text findText; private int findRowIndex=0; private int findColIndex=1; private int prevColSelection = 0; private int prevRowSelection = 0; private int formattedViewPrevLineIndex = 0; private int formattedViewNextLineIndex = 0; private int unFormattedViewPrevLineIndex = 0; private int unFormattedViewNextLineIndex = 0; private String textData = null; private Label label; private FindAction findAction; private Button btnNext; private Button closeButton; private boolean flag = false; private long pageNo = 1; private DebugDataViewer dataViewer; /** * Create the dialog. * @param parentShell * @param debugDataViewer * @param formatedStyledText * @param unFormatedStyledText * @param cTabFolder */ public FindViewDataDialog(Shell parentShell, DebugDataViewer dataViewer) { super(parentShell); setShellStyle(SWT.CLOSE | SWT.TITLE); this.debugDataViewer = dataViewer.getTableViewer(); this.formatedStyledText = dataViewer.getFormattedViewTextarea(); this.unFormatedStyledText = dataViewer.getUnformattedViewTextarea(); this.cTabFolder = dataViewer.getCurrentView(); this.dataViewer = dataViewer; } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { final Composite container = (Composite) super.createDialogArea(parent); container.getShell().setText("Find"); GridData parentCompositeData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 3); parentCompositeData.heightHint = 150; parentCompositeData.widthHint = 300; parentCompositeData.grabExcessHorizontalSpace = true; parentCompositeData.grabExcessVerticalSpace = true; container.setLayout(new GridLayout(3, false)); container.setLayoutData(parentCompositeData); container.getShell().addShellListener(new ShellListener() { @Override public void shellIconified(ShellEvent e) {} @Override public void shellDeiconified(ShellEvent e) {} @Override public void shellDeactivated(ShellEvent e) {} @Override public void shellClosed(ShellEvent e) { CTabItem tabItem = cTabFolder.getSelection(); if (tabItem.getData("VIEW_NAME").equals(Views.GRID_VIEW_NAME)) { logger.debug("Grid View"); clearTableItemBgColor(debugDataViewer); if(debugDataViewer != null){ debugDataViewer.setData("SELECTED_ROW_INDEX", null); debugDataViewer.setData("SEELCTED_COLUMN_INDEX", null); } dataViewer.getTablecursor().setVisible(true); } else if (tabItem.getData("VIEW_NAME").equals(Views.HORIZONTAL_VIEW_NAME)) { logger.debug("HORIZONTAL View"); } else if (tabItem.getData("VIEW_NAME").equals(Views.FORMATTED_VIEW_NAME)) { logger.debug("FORMATTED View"); clearStyledTextBgColor(formatedStyledText, textData); } else if (tabItem.getData("VIEW_NAME").equals(Views.UNFORMATTED_VIEW_NAME)) { logger.debug("UNFORMATTED View"); clearStyledTextBgColor(unFormatedStyledText, textData); } } @Override public void shellActivated(ShellEvent e) {} }); Composite composite_1 = new Composite(container, SWT.BORDER); GridLayout generalGroupLayout = new GridLayout(2, true); generalGroupLayout.verticalSpacing = 0; generalGroupLayout.marginWidth = 0; generalGroupLayout.marginHeight = 0; generalGroupLayout.horizontalSpacing = 0; GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 3); gridData.heightHint = 66; gridData.widthHint = 240; gridData.horizontalSpan = 3; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; composite_1.setLayoutData(gridData); composite_1.setLayout(generalGroupLayout); Composite composite = new Composite(composite_1, SWT.None); composite.setLayout(new GridLayout(2, false)); GridData gd_composite = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); gd_composite.widthHint = 210; composite.setLayoutData(gd_composite); Label lblFind = new Label(composite, SWT.NONE); lblFind.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblFind.setText("Find: "); findText = new Text(composite, SWT.BORDER); findText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); new Label(composite_1, SWT.None).setVisible(false); Composite composite_2 = new Composite(composite_1, SWT.None); GridData gd_composite_2 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); gd_composite_2.heightHint = 40; gd_composite_2.widthHint = 230; composite_2.setLayoutData(gd_composite_2); final Button btnPrevious = new Button(composite_2, SWT.NONE); btnPrevious.setBounds(0, 0, 75, 25); btnPrevious.setText("Prev"); btnPrevious.setEnabled(false); btnPrevious.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { textData = findText.getText(); CTabItem tabItem = cTabFolder.getSelection(); if (tabItem.getData("VIEW_NAME").equals(Views.GRID_VIEW_NAME)) { logger.trace("---------Grid View on Prev---------"); checkPageNo(); if(isExistInTable(debugDataViewer, textData)){ if(flag){ clearTableItemBgColor(debugDataViewer); flag = false; findRowIndex = debugDataViewer.getTable().getItems().length - 1; findColIndex = debugDataViewer.getTable().getColumnCount(); } reverseTableTraverse(debugDataViewer, dataViewer.getTablecursor()); } } else if (tabItem.getData("VIEW_NAME").equals(Views.HORIZONTAL_VIEW_NAME)) { logger.debug("HORIZONTAL View"); } else if (tabItem.getData("VIEW_NAME").equals(Views.FORMATTED_VIEW_NAME)) { logger.trace("------------FORMATTED View on Prev------------------------------"); formatedStyledText = dataViewer.getFormattedViewTextarea(); checkPageNo(); if(!isTextExist(formatedStyledText, textData)){ clearStyledTextBgColor(formatedStyledText, textData); int[] resultIndex =StyledTextEventListener.INSTANCE.prevButtonListener(formatedStyledText, textData, formattedViewPrevLineIndex, formattedViewNextLineIndex); formattedViewPrevLineIndex = resultIndex[0]; formattedViewNextLineIndex = resultIndex[1]; } } else if (tabItem.getData("VIEW_NAME").equals(Views.UNFORMATTED_VIEW_NAME)) { logger.trace("------------UNFORMATTED View on Prev------------"); unFormatedStyledText = dataViewer.getUnformattedViewTextarea(); checkPageNo(); if(!isTextExist(unFormatedStyledText, textData)){ clearStyledTextBgColor(unFormatedStyledText, textData); int[] resultIndex =StyledTextEventListener.INSTANCE.prevButtonListener(unFormatedStyledText, textData, unFormattedViewPrevLineIndex, unFormattedViewNextLineIndex); unFormattedViewPrevLineIndex = resultIndex[0]; unFormattedViewNextLineIndex = resultIndex[1]; } } } }); btnNext = new Button(composite_2, SWT.NONE); btnNext.setBounds(81, 0, 78, 25); btnNext.setText("Next"); btnNext.setEnabled(false); parent.getShell().setDefaultButton(btnNext); GridData gd_btnNext = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); btnNext.setLayoutData(gd_btnNext); btnNext.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { textData = findText.getText(); CTabItem tabItem = cTabFolder.getSelection(); if (tabItem.getData("VIEW_NAME").equals(Views.GRID_VIEW_NAME)) { logger.trace("--------Grid View on Next--------"); checkPageNo(); if(isExistInTable(debugDataViewer, textData)){ if(flag){ clearTableItemBgColor(debugDataViewer); flag = false; } forwardTableTraverse(debugDataViewer, dataViewer.getTablecursor()); } } else if (tabItem.getData("VIEW_NAME").equals(Views.HORIZONTAL_VIEW_NAME)) { logger.debug("HORIZONTAL View"); } else if (tabItem.getData("VIEW_NAME").equals(Views.FORMATTED_VIEW_NAME)) { logger.trace("---------------------------FORMATTED View on Next-------------------------"); formatedStyledText = dataViewer.getFormattedViewTextarea(); checkPageNo(); if(textData != null && !textData.equalsIgnoreCase(findText.getText())){ formattedViewPrevLineIndex = 0; formattedViewNextLineIndex = 0; textData = findText.getText(); }else{ textData = findText.getText(); } if(!isTextExist(formatedStyledText, textData)){ clearStyledTextBgColor(formatedStyledText, textData); int[] resultIndex = StyledTextEventListener.INSTANCE.nextButtonListener(formatedStyledText, textData, formattedViewPrevLineIndex, formattedViewNextLineIndex); formattedViewPrevLineIndex = resultIndex[0]; formattedViewNextLineIndex = resultIndex[1]; } } else if (tabItem.getData("VIEW_NAME").equals(Views.UNFORMATTED_VIEW_NAME)) { logger.trace("---------------------------UNFORMATTED View on Next-------------------------"); unFormatedStyledText = dataViewer.getUnformattedViewTextarea(); checkPageNo(); if(textData != null && !textData.equalsIgnoreCase(findText.getText())){ unFormattedViewPrevLineIndex = 0; unFormattedViewNextLineIndex = 0; textData = findText.getText(); }else{ textData = findText.getText(); } if(!isTextExist(unFormatedStyledText, textData)){ clearStyledTextBgColor(unFormatedStyledText, textData); int[] resultIndex = StyledTextEventListener.INSTANCE.nextButtonListener(unFormatedStyledText, textData, unFormattedViewPrevLineIndex, unFormattedViewNextLineIndex); unFormattedViewPrevLineIndex = resultIndex[0]; unFormattedViewNextLineIndex = resultIndex[1]; } } } }); final Button btnAll = new Button(composite_2, SWT.NONE); btnAll.setBounds(166, 0, 78, 25); btnAll.setText("All"); btnAll.setEnabled(false); GridData gd_btnNewButton = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); btnAll.setLayoutData(gd_btnNewButton); btnAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { CTabItem tabItem = cTabFolder.getSelection(); textData = findText.getText(); if (tabItem.getData("VIEW_NAME").equals(Views.GRID_VIEW_NAME)) { logger.trace("-----------Grid View on All----------------"); flag = true; checkPageNo(); if(isExistInTable(debugDataViewer, textData)){ clearTableItemBgColor(debugDataViewer); selectAllInTable(debugDataViewer, dataViewer.getTablecursor()); } } else if (tabItem.getData("VIEW_NAME").equals(Views.HORIZONTAL_VIEW_NAME)) { logger.debug("HORIZONTAL View"); } else if (tabItem.getData("VIEW_NAME").equals(Views.FORMATTED_VIEW_NAME)) { logger.trace("-----------FORMATTED View on All--------------"); formatedStyledText = dataViewer.getFormattedViewTextarea(); checkPageNo(); if(!isTextExist(formatedStyledText, textData)){ clearStyledTextBgColor(formatedStyledText, textData); StyledTextEventListener.INSTANCE.allButtonListener(formatedStyledText, textData, null, Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY), label); } } else if (tabItem.getData("VIEW_NAME").equals(Views.UNFORMATTED_VIEW_NAME)) { logger.trace("UNFORMATTED View on All--------------"); unFormatedStyledText = dataViewer.getUnformattedViewTextarea(); checkPageNo(); if(!isTextExist(unFormatedStyledText, textData)){ clearStyledTextBgColor(unFormatedStyledText, textData); StyledTextEventListener.INSTANCE.allButtonListener(unFormatedStyledText, textData, null, Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY), label); } } } }); findText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { Text txt = (Text)event.widget; if(StringUtils.isNotBlank(txt.getText())){ btnPrevious.setEnabled(true); btnNext.setEnabled(true); btnAll.setEnabled(true); }else{ btnPrevious.setEnabled(false); btnNext.setEnabled(false); btnAll.setEnabled(false); label.setVisible(false); } } }); return container; } private void checkPageNo(){ if(dataViewer.getCurrentPage() != pageNo){ findRowIndex = 0; findColIndex = 0; formattedViewPrevLineIndex = 0; formattedViewNextLineIndex = 0; unFormattedViewPrevLineIndex = 0; unFormattedViewNextLineIndex = 0; pageNo = dataViewer.getCurrentPage(); } } private boolean isTextExist(StyledText styledText, String text){ if(StringUtils.isNotBlank(styledText.getText())){ int textIndex = StringUtils.indexOf(StringUtils.lowerCase(styledText.getText()), StringUtils.lowerCase(text), 0); if(textIndex < 0){ label.setVisible(true); label.setText(labelText); return true; }else{ label.setVisible(false); return false; } }else{ return false;} } private void forwardTableTraverse(TableViewer debugDataViewer, TableCursor tableCursor){ TableItem previousSelectedTableItem = null; if(debugDataViewer.getData("SELECTED_ROW_INDEX")!=null){ previousSelectedTableItem = debugDataViewer.getTable().getItem((int) debugDataViewer.getData("SELECTED_ROW_INDEX")); findColIndex++; } Table table = debugDataViewer.getTable(); TableItem[] tableItems = table.getItems(); if(findColIndex == prevColSelection && findRowIndex == prevRowSelection){ findColIndex++; } if(findRowIndex < 0){ findRowIndex = 0; } for(;findRowIndex<tableItems.length;){ TableItem tableItem = tableItems[findRowIndex]; for(;findColIndex <= table.getColumnCount();findColIndex++){ if(StringUtils.containsIgnoreCase(tableItem.getText(findColIndex), findText.getText())){ if(prevColSelection > 0){ previousSelectedTableItem.setBackground(prevColSelection, Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); } label.setVisible(false); table.showItem(tableItem); table.showColumn(table.getColumn(findColIndex)); tableCursor.setSelection(findRowIndex, findColIndex); tableCursor.setVisible(false); tableItem.setBackground(findColIndex, Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY)); debugDataViewer.setData("SELECTED_ROW_INDEX", findRowIndex); debugDataViewer.setData("SEELCTED_COLUMN_INDEX", findColIndex); prevColSelection = findColIndex; return; } } findRowIndex++; findColIndex=1; if(findRowIndex >= tableItems.length){ findRowIndex = 0;} } } private void reverseTableTraverse(TableViewer debugDataViewer, TableCursor tableCursor){ TableItem previousSelectedTableItem = null; if(debugDataViewer.getData("SELECTED_ROW_INDEX")!=null){ previousSelectedTableItem = debugDataViewer.getTable().getItem((int) debugDataViewer.getData("SELECTED_ROW_INDEX")); findColIndex -= 1; } if(findRowIndex < 0){ findRowIndex = debugDataViewer.getTable().getItems().length - 1; } Table table = debugDataViewer.getTable(); TableItem[] tableItems = table.getItems(); for(; findRowIndex >=0; findRowIndex--){ TableItem tableItem = tableItems[findRowIndex]; for( ; findColIndex > 0 ;findColIndex--){ if(StringUtils.containsIgnoreCase(tableItem.getText(findColIndex), findText.getText())){ if(prevColSelection > 0){ previousSelectedTableItem.setBackground(prevColSelection, Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); } label.setVisible(false); table.showItem(tableItem); table.showColumn(table.getColumn(findColIndex)); tableCursor.setSelection(findRowIndex, findColIndex); tableCursor.setVisible(false); tableItem.setBackground(findColIndex,Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY)); if(findColIndex<=0){debugDataViewer.setData("SELECTED_ROW_INDEX", findRowIndex-1);}else{ debugDataViewer.setData("SELECTED_ROW_INDEX", findRowIndex); } debugDataViewer.setData("SEELCTED_COLUMN_INDEX", findColIndex); prevColSelection = findColIndex; prevRowSelection = findRowIndex; return ; } } if(findColIndex <= 0){ findColIndex = table.getColumnCount();} if(findRowIndex == 0){ findRowIndex = tableItems.length; } } } private void selectAllInTable(TableViewer debugDataViewer, TableCursor tableCursor){ Table table = debugDataViewer.getTable(); TableItem[] tableItems = table.getItems(); int recordCount = 0; for(int rowIndex = 0; rowIndex < tableItems.length; rowIndex++){ TableItem tableItem = tableItems[rowIndex]; for(int colIndex = 1; colIndex <= table.getColumnCount(); colIndex++){ if(StringUtils.containsIgnoreCase(tableItem.getText(colIndex), findText.getText())){ label.setVisible(false); tableItem.setBackground(colIndex, Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY)); recordCount++; } } findColIndex=1; } findRowIndex = 0; findColIndex = 0; if(recordCount > 0){ label.setVisible(true); label.setText("Match count - " + recordCount); }else{ label.setVisible(false); } } private void clearStyledTextBgColor(StyledText styledText, String textData){ if(StringUtils.isBlank(textData) || styledText == null){ return; }else{ StyleRange[] prevRanges = new StyleRange[1]; prevRanges[0] = new StyleRange(0, 1, null, Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); styledText.replaceStyleRanges(0, styledText.getText().length(), prevRanges); } } private boolean isExistInTable(TableViewer tableViewer, String text){ boolean isDataExist = false; Table table = tableViewer.getTable(); TableItem[] tableItems = table.getItems(); for(int i=0;i<tableItems.length;i++){ TableItem tableItem = tableItems[i]; for(int j=1;j <= table.getColumnCount()-1;j++){ if(StringUtils.containsIgnoreCase(tableItem.getText(j), text)){ label.setVisible(false); isDataExist = true; return isDataExist; }else{ label.setVisible(true); label.setText(labelText); isDataExist = false; } } } return isDataExist; } private void clearTableItemBgColor(TableViewer debugDataViewer){ if(debugDataViewer == null){ return; } Table table = debugDataViewer.getTable(); TableItem[] tableItems = table.getItems(); for(int i=0;i<tableItems.length;i++){ TableItem tableItem = tableItems[i]; for(int j=1;j <= table.getColumnCount()-1;j++){ tableItem.getText(j); tableItem.setBackground(j, Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); } } } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(530, 153); } @Override protected void createButtonsForButtonBar(Composite parent) { parent.setLayout(new GridLayout(1,false)); GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 0, 0); parent.setLayoutData(gridData); label=new Label(parent, SWT.None); label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 0, 0)); label.setText(labelText + " "); label.setVisible(false); closeButton = createButton(parent, CLOSE, "Close", false); closeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { clearTableItemBgColor(debugDataViewer); if(debugDataViewer != null){ debugDataViewer.setData("SELECTED_ROW_INDEX", null); debugDataViewer.setData("SEELCTED_COLUMN_INDEX", null); } dataViewer.getTablecursor().setVisible(true); clearStyledTextBgColor(formatedStyledText, textData); clearStyledTextBgColor(unFormatedStyledText, textData); close(); } }); } /** * Opens the find child window for the View Data window. * * @param findAction * the find action * @return the int */ public int open(FindAction findAction) { this.findAction=findAction; findAction.isOpened=true; return this.open(); } @Override public boolean close() { this.findAction.isOpened=false; return super.close(); } }