8888import  org .eclipse .jface .viewers .ColumnPixelData ;
8989import  org .eclipse .jface .viewers .ColumnWeightData ;
9090import  org .eclipse .jface .viewers .IBaseLabelProvider ;
91+ import  org .eclipse .jface .viewers .IStructuredContentProvider ;
9192import  org .eclipse .jface .viewers .IStructuredSelection ;
9293import  org .eclipse .jface .viewers .ITableLabelProvider ;
9394import  org .eclipse .jface .viewers .LabelProvider ;
9697import  org .eclipse .jface .viewers .TableViewer ;
9798import  org .eclipse .jface .viewers .Viewer ;
9899import  org .eclipse .jface .viewers .ViewerComparator ;
100+ import  org .eclipse .jface .viewers .ViewerFilter ;
99101import  org .eclipse .jface .window .Window ;
100102
101103import  org .eclipse .jface .text .Document ;
@@ -152,6 +154,8 @@ public abstract class TemplatePreferencePage extends PreferencePage implements I
152154	 * 
153155	 * @since 3.3 
154156	 */ 
157+ 	private  final  Map <String , Boolean > checkedStates  = new  HashMap <>();
158+ 
155159	protected  static  class  EditTemplateDialog  extends  StatusDialog  {
156160
157161		private  final  Template  fOriginalTemplate ;
@@ -796,38 +800,45 @@ public void setContextTypeRegistry(ContextTypeRegistry registry) {
796800	public  void  init (IWorkbench  workbench ) {
797801	}
798802
803+ 	private  String  getKey (TemplatePersistenceData  data ) {
804+ 		return  data .getTemplate ().getName () + "|"  + data .getTemplate ().getContextTypeId (); //$NON-NLS-1$ 
805+ 	}
806+ 
799807	@ Override 
800808	protected  Control  createContents (Composite  ancestor ) {
801- 		Composite  parent = new  Composite (ancestor , SWT .NONE );
802- 		GridLayout   layout =  new  GridLayout ();
803- 		 layout . numColumns =  2 ; 
804- 		layout . marginHeight =  0 ;
805- 		layout . marginWidth =  0 ;
806- 		parent . setLayout ( layout );
807- 
808- 		Composite  innerParent = new  Composite (parent , SWT .NONE );
809- 		GridLayout   innerLayout =  new  GridLayout ();
810- 		innerLayout . numColumns =  2 ;
811- 		 innerLayout . marginHeight =  0 ; 
812- 		innerLayout . marginWidth =  0 ;
813- 		innerParent . setLayout ( innerLayout );
814- 		GridData  gd = new  GridData (GridData . FILL_BOTH );
815- 		gd . horizontalSpan =  2 ;
816- 		innerParent .setLayoutData (gd );
817- 
818- 		Composite  tableComposite = new  Composite (innerParent , SWT .NONE );
819- 		GridData  data = new  GridData (GridData . FILL_BOTH );
820- 		data .widthHint = 360 ;
821- 		data .heightHint = convertHeightInCharsToPixels (10 );
822- 		tableComposite .setLayoutData (data );
823- 
824- 		ColumnLayout  columnLayout = new  ColumnLayout ();
809+ 		Composite  parent   = new  Composite (ancestor , SWT .NONE );
810+ 		parent . setLayout ( new  GridLayout (1 ,  false ) );
811+ 
812+ 		Composite   tcomposite  =  new   Composite ( parent ,  SWT . NONE ) ;
813+ 		tcomposite . setLayout ( new   GridLayout ( 2 ,  false )) ;
814+ 		tcomposite . setLayoutData ( new   GridData ( SWT . FILL ,  SWT . FILL ,  true ,  true ) );
815+ 
816+ 		Composite  fcomposite   = new  Composite (tcomposite , SWT .NONE );
817+ 		fcomposite . setLayout ( new  GridLayout (1 ,  false ) );
818+ 		fcomposite . setLayoutData ( new   GridData ( SWT . FILL ,  SWT . FILL ,  true ,  true )) ;
819+ 
820+ 		Text   filterText  =  new   Text ( fcomposite ,  SWT . BORDER  |  SWT . SEARCH  |  SWT . ICON_CANCEL ) ;
821+ 		filterText . setMessage ( TemplatesMessages . TemplatePreferencePage_filterText );
822+ 		GridData  filterData   = new  GridData (SWT . FILL ,  SWT . CENTER ,  true ,  false );
823+ 		filterData . widthHint  =  360 ;
824+ 		filterText .setLayoutData (filterData );
825+ 
826+ 		Composite  tableComposite   = new  Composite (fcomposite , SWT .NONE );
827+ 		GridData  tableData   = new  GridData (SWT . FILL ,  SWT . FILL ,  true ,  true );
828+ 		tableData .widthHint   = 360 ;
829+ 		tableData .heightHint   = convertHeightInCharsToPixels (10 );
830+ 		tableComposite .setLayoutData (tableData );
831+ 
832+ 		ColumnLayout  columnLayout   = new  ColumnLayout ();
825833		tableComposite .setLayout (columnLayout );
826- 		Table  table = new  Table (tableComposite , SWT .CHECK  | SWT .BORDER  | SWT .MULTI  | SWT .FULL_SELECTION  | SWT .H_SCROLL  | SWT .V_SCROLL );
834+ 		Table  table  = new  Table (tableComposite ,
835+ 				SWT .CHECK  | SWT .BORDER  | SWT .MULTI  | SWT .FULL_SELECTION  | SWT .H_SCROLL  | SWT .V_SCROLL );
827836
828837		table .setHeaderVisible (true );
829838		table .setLinesVisible (true );
830839
840+ 		table .setLayoutData (new  GridData (SWT .FILL , SWT .FILL , true , true ));
841+ 
831842		GC  gc = new  GC (getShell ());
832843		gc .setFont (JFaceResources .getDialogFont ());
833844
@@ -877,18 +888,52 @@ protected Control createContents(Composite ancestor) {
877888		fTableViewer .addCheckStateListener (event  -> {
878889			TemplatePersistenceData  d  = (TemplatePersistenceData ) event .getElement ();
879890			d .setEnabled (event .getChecked ());
891+ 			checkedStates .put (getKey (d ), event .getChecked ());
880892		});
881893
882894		BidiUtils .applyTextDirection (fTableViewer .getControl (), BidiUtils .BTD_DEFAULT );
883895
884- 		Composite  buttons = new  Composite (innerParent , SWT .NONE );
885- 		buttons .setLayoutData (new  GridData (GridData .VERTICAL_ALIGN_BEGINNING ));
886- 		layout = new  GridLayout ();
887- 		layout .marginHeight = 0 ;
888- 		layout .marginWidth = 0 ;
889- 		buttons .setLayout (layout );
896+ 		TemplateFilter  filter  = new  TemplateFilter ();
897+ 		fTableViewer .addFilter (filter );
898+ 
899+ 		filterText .addModifyListener (e  -> {
900+ 			filter .setSearchText (filterText .getText ());
901+ 			for  (Object  element  : fTableViewer .getCheckedElements ()) {
902+ 				if  (element  instanceof  TemplatePersistenceData  data ) {
903+ 					String  key  = getKey (data );
904+ 					checkedStates .put (key , true );
905+ 				}
906+ 			}
907+ 			for  (Object  element  : ((IStructuredContentProvider ) fTableViewer .getContentProvider ())
908+ 					.getElements (fTableViewer .getInput ())) {
909+ 				if  (element  instanceof  TemplatePersistenceData  data ) {
910+ 					String  key  = getKey (data );
911+ 					if  (!fTableViewer .getChecked (data )) {
912+ 						checkedStates .putIfAbsent (key , false );
913+ 					}
914+ 				}
915+ 			}
916+ 			fTableViewer .refresh ();
917+ 
918+ 			for  (Object  element  : ((IStructuredContentProvider ) fTableViewer .getContentProvider ())
919+ 					.getElements (fTableViewer .getInput ())) {
920+ 				if  (element  instanceof  TemplatePersistenceData  data ) {
921+ 					Boolean  checked  = checkedStates .get (getKey (data ));
922+ 					if  (checked  != null  && checked ) {
923+ 						fTableViewer .setChecked (data , true );
924+ 					}
925+ 				}
926+ 			}
927+ 		});
928+ 
929+ 		Composite  buttons  = new  Composite (tcomposite , SWT .NONE );
930+ 		buttons .setLayoutData (new  GridData (SWT .FILL , SWT .TOP , false , false ));
931+ 		GridLayout  buttonLayout  = new  GridLayout ();
932+ 		buttonLayout .marginHeight  = 0 ;
933+ 		buttonLayout .marginWidth  = 0 ;
934+ 		buttons .setLayout (buttonLayout );
890935
891- 		fAddButton = new  Button (buttons , SWT .PUSH );
936+ 		fAddButton   = new  Button (buttons , SWT .PUSH );
892937		fAddButton .setText (TemplatesMessages .TemplatePreferencePage_new );
893938		fAddButton .setLayoutData (getButtonGridData (fAddButton ));
894939		fAddButton .addListener (SWT .Selection , e  -> add ());
@@ -932,9 +977,7 @@ protected Control createContents(Composite ancestor) {
932977		if  (isShowFormatterSetting ()) {
933978			fFormatButton = new  Button (parent , SWT .CHECK );
934979			fFormatButton .setText (TemplatesMessages .TemplatePreferencePage_use_code_formatter );
935- 			GridData  gd1 = new  GridData ();
936- 			gd1 .horizontalSpan = 2 ;
937- 			fFormatButton .setLayoutData (gd1 );
980+ 			fFormatButton .setLayoutData (new  GridData (SWT .LEFT , SWT .CENTER , false , false ));
938981			fFormatButton .setSelection (getPreferenceStore ().getBoolean (getFormatterPreferenceKey ()));
939982		}
940983
@@ -944,11 +987,26 @@ protected Control createContents(Composite ancestor) {
944987
945988		updateButtons ();
946989		Dialog .applyDialogFont (parent );
947- 		innerParent .layout ();
948990
949991		return  parent ;
950992	}
951993
994+ 		class  TemplateFilter  extends  ViewerFilter  {
995+ 		private  String  searchString  = "" ; //$NON-NLS-1$ 
996+ 		public  void  setSearchText (String  s ) {
997+ 			searchString  = (s  == null ) ? ""  : s .toLowerCase (); //$NON-NLS-1$ 
998+ 		}
999+ 		@ Override 
1000+ 		public  boolean  select (Viewer  viewer , Object  parentElement , Object  element ) {
1001+ 			if  (searchString .isEmpty ())
1002+ 				return  true ;
1003+ 			Template  template  = ((TemplatePersistenceData ) element ).getTemplate ();
1004+ 			return  template .getName ().toLowerCase ().contains (searchString )
1005+ 					|| template .getContextTypeId ().toLowerCase ().contains (searchString )
1006+ 					|| template .getDescription ().toLowerCase ().contains (searchString );
1007+ 		}
1008+ 	}
1009+ 
9521010	/* 
9531011	 * @since 3.2 
9541012	 */ 
0 commit comments