1313
1414import java .io .IOException ;
1515import java .lang .reflect .InvocationTargetException ;
16+ import java .util .ArrayList ;
1617import java .util .Comparator ;
1718import java .util .List ;
1819import java .util .concurrent .TimeoutException ;
2526import org .eclipse .codewind .core .internal .ProcessHelper .ProcessResult ;
2627import org .eclipse .codewind .core .internal .connection .CodewindConnection ;
2728import org .eclipse .codewind .core .internal .console .ProjectTemplateInfo ;
29+ import org .eclipse .codewind .core .internal .constants .ProjectLanguage ;
30+ import org .eclipse .codewind .core .internal .constants .ProjectType ;
31+ import org .eclipse .codewind .ui .CodewindUIPlugin ;
2832import org .eclipse .codewind .ui .internal .messages .Messages ;
2933import org .eclipse .codewind .ui .internal .views .ViewHelper ;
3034import org .eclipse .core .resources .IProject ;
4145import org .eclipse .swt .events .ModifyListener ;
4246import org .eclipse .swt .events .SelectionAdapter ;
4347import org .eclipse .swt .events .SelectionEvent ;
48+ import org .eclipse .swt .graphics .Point ;
4449import org .eclipse .swt .layout .GridData ;
4550import org .eclipse .swt .layout .GridLayout ;
51+ import org .eclipse .swt .widgets .Button ;
4652import org .eclipse .swt .widgets .Composite ;
53+ import org .eclipse .swt .widgets .Control ;
54+ import org .eclipse .swt .widgets .Display ;
4755import org .eclipse .swt .widgets .Event ;
4856import org .eclipse .swt .widgets .Group ;
4957import org .eclipse .swt .widgets .Label ;
5058import org .eclipse .swt .widgets .Listener ;
59+ import org .eclipse .swt .widgets .Menu ;
60+ import org .eclipse .swt .widgets .MenuItem ;
61+ import org .eclipse .swt .widgets .Shell ;
5162import org .eclipse .swt .widgets .Table ;
5263import org .eclipse .swt .widgets .TableColumn ;
5364import org .eclipse .swt .widgets .TableItem ;
@@ -65,6 +76,7 @@ public class NewCodewindProjectPage extends WizardPage {
6576 private Table selectionTable ;
6677 private Text descriptionLabel ;
6778 private Text projectNameText ;
79+ private List <Integer > styleList = new ArrayList <Integer >();
6880
6981 protected NewCodewindProjectPage (CodewindConnection connection , List <ProjectTemplateInfo > templateList ) {
7082 super (Messages .NewProjectPage_ShellTitle );
@@ -137,12 +149,20 @@ private void createContents(Composite parent) {
137149 layout .marginWidth = 8 ;
138150 layout .horizontalSpacing = 7 ;
139151 layout .verticalSpacing = 7 ;
152+ layout .numColumns = 2 ;
140153 templateGroup .setLayout (layout );
141154 templateGroup .setLayoutData (new GridData (GridData .FILL , GridData .FILL , true , false , 2 , 1 ));
142155
156+ // Style selection button
157+ final Button styleButton = new Button (templateGroup , SWT .PUSH | SWT .RIGHT_TO_LEFT );
158+ styleButton .setText ("Select Styles" );
159+ styleButton .setToolTipText ("Select the styles to work with" );
160+ styleButton .setImage (CodewindUIPlugin .getImage (CodewindUIPlugin .MENU_DOWN_ICON ));
161+ styleButton .setLayoutData (new GridData (GridData .BEGINNING , GridData .BEGINNING , false , false ));
162+
143163 // Filter text
144164 filterText = new Text (templateGroup , SWT .BORDER );
145- filterText .setLayoutData (new GridData (SWT .FILL , SWT .FILL , true , false , 2 , 1 ));
165+ filterText .setLayoutData (new GridData (SWT .FILL , SWT .FILL , true , false ));
146166 filterText .setMessage (Messages .NewProjectPage_FilterMessage );
147167
148168 // Table
@@ -152,29 +172,38 @@ private void createContents(Composite parent) {
152172 selectionTable .setLayoutData (data );
153173
154174 // Columns
155- final TableColumn featureColumn = new TableColumn (selectionTable , SWT .NONE );
156- featureColumn .setText (Messages .NewProjectPage_TypeColumn );
157- featureColumn .setResizable (true );
158- featureColumn .addSelectionListener (new SelectionAdapter () {
175+ final TableColumn templateColumn = new TableColumn (selectionTable , SWT .NONE );
176+ templateColumn .setText (Messages .NewProjectPage_TemplateColumn );
177+ templateColumn .setResizable (true );
178+ templateColumn .addSelectionListener (new SelectionAdapter () {
179+ @ Override
180+ public void widgetSelected (SelectionEvent event ) {
181+ sortTable (selectionTable , templateColumn );
182+ }
183+ });
184+ final TableColumn typeColumn = new TableColumn (selectionTable , SWT .NONE );
185+ typeColumn .setText (Messages .NewProjectPage_TypeColumn );
186+ typeColumn .setResizable (true );
187+ typeColumn .addSelectionListener (new SelectionAdapter () {
159188 @ Override
160189 public void widgetSelected (SelectionEvent event ) {
161- sortTable (selectionTable , featureColumn );
190+ sortTable (selectionTable , typeColumn );
162191 }
163192 });
164- final TableColumn nameColumn = new TableColumn (selectionTable , SWT .NONE );
165- nameColumn .setText (Messages .NewProjectPage_LanguageColumn );
166- nameColumn .setResizable (true );
167- nameColumn .addSelectionListener (new SelectionAdapter () {
193+ final TableColumn languageColumn = new TableColumn (selectionTable , SWT .NONE );
194+ languageColumn .setText (Messages .NewProjectPage_LanguageColumn );
195+ languageColumn .setResizable (true );
196+ languageColumn .addSelectionListener (new SelectionAdapter () {
168197 @ Override
169198 public void widgetSelected (SelectionEvent event ) {
170- sortTable (selectionTable , nameColumn );
199+ sortTable (selectionTable , languageColumn );
171200 }
172201 });
173202
174203 selectionTable .setHeaderVisible (true );
175204 selectionTable .setLinesVisible (false );
176205 selectionTable .setSortDirection (SWT .DOWN );
177- selectionTable .setSortColumn (featureColumn );
206+ selectionTable .setSortColumn (templateColumn );
178207
179208 createItems (selectionTable , "" );
180209
@@ -188,7 +217,7 @@ public void widgetSelected(SelectionEvent event) {
188217 descriptionLabel .setForeground (templateGroup .getForeground ());
189218 descriptionScroll .setContent (descriptionLabel );
190219
191- data = new GridData (GridData .FILL , GridData .FILL , true , false );
220+ data = new GridData (GridData .FILL , GridData .FILL , true , false , 2 , 1 );
192221 int lineHeight = filterText .computeSize (SWT .DEFAULT , SWT .DEFAULT ).y ;
193222 data .heightHint = lineHeight * 2 ;
194223 data .horizontalSpan = 2 ;
@@ -199,6 +228,17 @@ public void widgetSelected(SelectionEvent event) {
199228 descriptionScroll .setForeground (templateGroup .getForeground ());
200229
201230 // Listeners
231+ final Shell shell = getShell ();
232+ styleButton .addSelectionListener (new SelectionAdapter () {
233+ @ Override
234+ public void widgetSelected (SelectionEvent e ) {
235+ final Menu menu = new Menu (shell , SWT .POP_UP );
236+ fillFilterMenu (menu );
237+ displayDropdownMenu (styleButton , menu , true );
238+ menu .dispose ();
239+ }
240+ });
241+
202242 filterText .addModifyListener (new ModifyListener () {
203243 @ Override
204244 public void modifyText (ModifyEvent event ) {
@@ -303,18 +343,20 @@ private void createItems(Table table, String filter) {
303343 // Create the items for the table.
304344 table .removeAll ();
305345 pattern .setPattern ("*" + filter + "*" );
306- for (ProjectTemplateInfo template : templateList ) {
307- String type = template .getLabel ();
308- String language = template .getLanguage ();
309- if (pattern .matches (type ) || (language != null && pattern .matches (language ))) {
346+ for (ProjectTemplateInfo templateInfo : templateList ) {
347+ String template = templateInfo .getLabel ();
348+ String type = ProjectType .getDisplayName (templateInfo .getProjectType ());
349+ String language = ProjectLanguage .getDisplayName (templateInfo .getLanguage ());
350+ if (pattern .matches (template ) || (type != null && pattern .matches (type )) || (language != null && pattern .matches (language ))) {
310351 TableItem item = new TableItem (table , SWT .NONE );
311352 item .setForeground (table .getForeground ());
312353 item .setBackground (table .getBackground ());
313- item .setText (0 , type );
354+ item .setText (0 , template );
355+ item .setText (1 , type );
314356 if (language != null ) {
315- item .setText (1 , language );
357+ item .setText (2 , language );
316358 }
317- item .setData (template );
359+ item .setData (templateInfo );
318360 }
319361 }
320362 }
@@ -476,4 +518,52 @@ private void getTemplates() {
476518 Logger .logError ("An error occurred trying to get the list of templates" , e ); //$NON-NLS-1$
477519 }
478520 }
521+
522+ protected void fillFilterMenu (final Menu menu ) {
523+ final SelectionAdapter listener = new SelectionAdapter () {
524+ @ Override
525+ public void widgetSelected (SelectionEvent event ) {
526+ MenuItem item = (MenuItem ) event .getSource ();
527+ if (item .getSelection ()) {
528+ if (item .getData () == null ) {
529+ styleList .clear ();
530+ } else {
531+ styleList .add ((Integer )item .getData ());
532+ }
533+ } else {
534+ if (item .getData () != null ) {
535+ styleList .remove (item .getData ());
536+ }
537+ }
538+ // Update template list
539+ }
540+ };
541+
542+ MenuItem item ;
543+ item = new MenuItem (menu , SWT .CHECK );
544+ item .setText ("All Styles" );
545+ item .setSelection (styleList .isEmpty ());
546+ item .addSelectionListener (listener );
547+ for (int i = 1 ; i < 5 ; i ++) {
548+ item = new MenuItem (menu , SWT .CHECK );
549+ item .setText ("Style" + i );
550+ item .setData (new Integer (i ));
551+ item .setSelection (styleList .contains (item .getData ()));
552+ item .addSelectionListener (listener );
553+ }
554+ }
555+
556+ protected void displayDropdownMenu (Control anchor , Menu menu , boolean subtractWidth ) {
557+ Point size = anchor .getSize ();
558+ Point point = anchor .toDisplay (0 , size .y );
559+ menu .setLocation (point .x - (subtractWidth ? size .x : 0 ), point .y );
560+ menu .setVisible (true );
561+
562+ while (!menu .isDisposed () && menu .isVisible ()) {
563+ Display display = menu .getShell ().getDisplay ();
564+ if (!display .readAndDispatch ()) {
565+ display .sleep ();
566+ }
567+ }
568+ }
479569}
0 commit comments