Java tutorial
/******************************************************************************* * Copyright (c) 2004 Actuate Corporation. * 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: * Actuate Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.birt.report.designer.ui.dialogs; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import org.eclipse.birt.core.data.DataType; import org.eclipse.birt.report.designer.core.model.SessionHandleAdapter; import org.eclipse.birt.report.designer.core.model.views.data.DataSetItemModel; import org.eclipse.birt.report.designer.data.ui.util.DataUtil; import org.eclipse.birt.report.designer.internal.ui.dialogs.FormPage; import org.eclipse.birt.report.designer.internal.ui.dialogs.expression.ExpressionButton; import org.eclipse.birt.report.designer.internal.ui.dialogs.helper.IDialogHelper; import org.eclipse.birt.report.designer.internal.ui.dialogs.helper.IDialogHelperProvider; import org.eclipse.birt.report.designer.internal.ui.dnd.InsertInLayoutUtil; import org.eclipse.birt.report.designer.internal.ui.expressions.ExpressionContextFactoryImpl; import org.eclipse.birt.report.designer.internal.ui.expressions.IExpressionContextFactory; import org.eclipse.birt.report.designer.internal.ui.expressions.IExpressionConverter; import org.eclipse.birt.report.designer.internal.ui.util.ExceptionHandler; import org.eclipse.birt.report.designer.internal.ui.util.ExpressionButtonUtil; import org.eclipse.birt.report.designer.internal.ui.util.ExpressionButtonUtil.ExpressionHelper; import org.eclipse.birt.report.designer.internal.ui.util.ExpressionUtility; import org.eclipse.birt.report.designer.internal.ui.util.IHelpContextIds; import org.eclipse.birt.report.designer.internal.ui.util.UIUtil; import org.eclipse.birt.report.designer.internal.ui.util.WidgetUtil; import org.eclipse.birt.report.designer.internal.ui.views.dialogs.provider.FilterHandleProvider; import org.eclipse.birt.report.designer.internal.ui.views.dialogs.provider.SortingHandleProvider; import org.eclipse.birt.report.designer.nls.Messages; import org.eclipse.birt.report.designer.ui.views.ElementAdapterManager; import org.eclipse.birt.report.designer.ui.views.attributes.providers.ChoiceSetFactory; import org.eclipse.birt.report.designer.util.DEUtil; import org.eclipse.birt.report.designer.util.FontManager; import org.eclipse.birt.report.model.api.ActionHandle; import org.eclipse.birt.report.model.api.CellHandle; import org.eclipse.birt.report.model.api.ColumnHintHandle; import org.eclipse.birt.report.model.api.ComputedColumnHandle; import org.eclipse.birt.report.model.api.DataItemHandle; import org.eclipse.birt.report.model.api.DataSetHandle; import org.eclipse.birt.report.model.api.DesignElementHandle; import org.eclipse.birt.report.model.api.DesignEngine; import org.eclipse.birt.report.model.api.Expression; import org.eclipse.birt.report.model.api.ExpressionHandle; import org.eclipse.birt.report.model.api.GroupHandle; import org.eclipse.birt.report.model.api.ListGroupHandle; import org.eclipse.birt.report.model.api.PropertyHandle; import org.eclipse.birt.report.model.api.ReportItemHandle; import org.eclipse.birt.report.model.api.RowHandle; import org.eclipse.birt.report.model.api.SlotHandle; import org.eclipse.birt.report.model.api.StructureFactory; import org.eclipse.birt.report.model.api.StyleHandle; import org.eclipse.birt.report.model.api.TableGroupHandle; import org.eclipse.birt.report.model.api.TableHandle; import org.eclipse.birt.report.model.api.UserPropertyDefnHandle; import org.eclipse.birt.report.model.api.activity.NotificationEvent; import org.eclipse.birt.report.model.api.activity.SemanticException; import org.eclipse.birt.report.model.api.core.Listener; import org.eclipse.birt.report.model.api.core.UserPropertyDefn; import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants; import org.eclipse.birt.report.model.api.elements.ReportDesignConstants; import org.eclipse.birt.report.model.api.elements.structures.Action; import org.eclipse.birt.report.model.api.elements.structures.TOC; import org.eclipse.birt.report.model.api.metadata.IChoice; import org.eclipse.birt.report.model.api.metadata.IPredefinedStyle; import org.eclipse.birt.report.model.api.util.StringUtil; import org.eclipse.birt.report.model.elements.GroupElement; import org.eclipse.birt.report.model.elements.interfaces.IGroupElementModel; import org.eclipse.birt.report.model.elements.interfaces.IListingElementModel; import org.eclipse.birt.report.model.elements.interfaces.IStyleModel; import org.eclipse.birt.report.model.metadata.PropertyType; import org.eclipse.birt.report.model.util.ModelUtil; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.resource.JFaceColors; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; /** * Group Properties Dialog */ public class GroupDialog extends BaseDialog implements Listener { private static final String AC_GROUP_COLLAPSE_LEVEL_PROPERTY = "__ac_group_collapse_level"; //$NON-NLS-1$ private static final String GROUP_DLG_GROUP_FILTER_SORTING = Messages .getString("GroupDialog.Label.FilterSorting"); //$NON-NLS-1$ private static final String GROUP_DLG_GROUP_RANGE_LABEL = Messages.getString("GroupDialog.Label.Range"); //$NON-NLS-1$ private static final String GROUP_DLG_GROUP_INTERVAL_LABEL = Messages.getString("GroupDialog.Label.Interval"); //$NON-NLS-1$ private static final String GROUP_DLG_GROUP_KEY_LABEL = Messages.getString("GroupDialog.Label.GroupOn"); //$NON-NLS-1$ private static final String GROUP_DLG_GROUP_NAME_LABEL = Messages.getString("GroupDialog.Label.Name"); //$NON-NLS-1$ // private static final String TAB_BINDING = Messages.getString( // "GroupDialog.Tab.Binding" ); //$NON-NLS-1$ private static final String TAB_SORTING = Messages.getString("GroupDialog.Tab.Sorting"); //$NON-NLS-1$ private static final String TAB_FILTER = Messages.getString("GroupDialog.Tab.Filter"); //$NON-NLS-1$ // private static final String GROUP_DLG_INCLUDE_FOOTER_LABEL = // Messages.getString( "GroupDialog.Label.IncludeFooter" ); //$NON-NLS-1$ // private static final String GROUP_DLG_INCLUDE_HEADER_LABEL = // Messages.getString( "GroupDialog.Label.IncludeHeader" ); //$NON-NLS-1$; // private static final String GROUP_DLG_HEADER_FOOTER_LABEL = // Messages.getString( "GroupDialog.Label.HeaderFooter" ); //$NON-NLS-1$ private static final String GROUP_DLG_INTERVAL_BASE_LABEL = Messages .getString("GroupDialog.Label.IntervalBase"); //$NON-NLS-1$ private static final String GROUP_DLG_AREA_MSG = Messages.getString("GroupDialog.Dialog.GroupDetail"); //$NON-NLS-1$ public static final String GROUP_DLG_TITLE_NEW = Messages.getString("GroupDialog.Title.New"); //$NON-NLS-1$ public static final String GROUP_DLG_TITLE_EDIT = Messages.getString("GroupDialog.Title.Edit"); //$NON-NLS-1$ public static final String GROUP_DLG_HIDE_DETAIL = Messages.getString("GroupDialog.buttion.HideDetail"); //$NON-NLS-1$ public static final String HELPER_KEY_STARTCOLLAPSED = "start collapsed";//$NON-NLS-1$ public static final String START_COLLAPSED = "START_COLLAPSED";//$NON-NLS-1$ private List columnList; private GroupHandle inputGroup; /** * The name editor */ private Text nameEditor; /** * The group key and interval type combo box. */ private Combo keyChooser, intervalType; private Combo tocStyleType; /** The editor to input interval range. */ private Text intervalRange; /** * The include check box and sorting direction radio box */ private Button ascending, descending; private Button intervalBaseButton; private Text intervalBaseText; private Button hideDetail; private Text tocEditor; private Text bookmarkEditor; final private static IChoice[] intervalChoicesAll = DEUtil.getMetaDataDictionary() .getChoiceSet(DesignChoiceConstants.CHOICE_INTERVAL).getChoices(); final private static String SORT_GROUP_TITLE = DEUtil .getPropertyDefn(ReportDesignConstants.TABLE_GROUP_ELEMENT, GroupHandle.SORT_DIRECTION_PROP) .getDisplayName(); final private static IChoice[] pagebreakBeforeChoicesAll = DEUtil.getMetaDataDictionary() .getChoiceSet(DesignChoiceConstants.CHOICE_PAGE_BREAK_BEFORE).getChoices(); final private static IChoice[] pagebreakAfterChoicesAll = DEUtil.getMetaDataDictionary() .getChoiceSet(DesignChoiceConstants.CHOICE_PAGE_BREAK_AFTER).getChoices(); final private static IChoice[] pagebreakInsideChoicesAll = DEUtil.getMetaDataDictionary() .getChoiceSet(DesignChoiceConstants.CHOICE_PAGE_BREAK_INSIDE).getChoices(); private String[] sytleChoicesAll; final private static IChoice[] intervalChoicesString = getIntervalChoicesString(); final private static IChoice[] intervalChoicesDate = getIntervalChoicesDate(); final private static IChoice[] intervalChoicesNumeric = getIntervalChoicesNumeric(); private static IChoice[] intervalChoices = intervalChoicesAll; private String previoiusKeyExpression = ""; //$NON-NLS-1$ private Button repeatHeaderButton; private Combo pagebreakAfterCombo; private Combo pagebreakBeforeCombo; private Combo pagebreakInsideCombo; private Group sortingGroup; NumberFormat format = NumberFormat .getNumberInstance(SessionHandleAdapter.getInstance().getSessionHandle().getULocale().toLocale()); private IDialogHelper startCollapsedHelper; private boolean startCollapsed; /** * Constructor. * * @param parentShell */ public GroupDialog(Shell parentShell, String title) { super(parentShell, title); sytleChoicesAll = getAllStyleChoices(); } private String[] getAllStyleChoices() { String[] styles = ChoiceSetFactory.getStyles(); styles = filterPreStyles(styles); return styles; } private static String[] filterPreStyles(String items[]) { List preStyles = DesignEngine.getMetaDataDictionary().getPredefinedStyles(); List preStyleNames = new ArrayList(); for (int i = 0; i < preStyles.size(); i++) { preStyleNames.add(((IPredefinedStyle) preStyles.get(i)).getName()); } List sytleNames = new ArrayList(); for (int i = 0; i < items.length; i++) { if (preStyleNames.indexOf(items[i]) == -1) { sytleNames.add(items[i]); } } return (String[]) (sytleNames.toArray(new String[] {})); } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets * .Composite) */ protected Control createDialogArea(Composite parent) { // Assert.isNotNull( dataSetList ); if (sytleChoicesAll == null) { sytleChoicesAll = getAllStyleChoices(); } // Composite topComposite = (Composite) super.createDialogArea( parent // ); ScrolledComposite scrollContent = new ScrolledComposite((Composite) super.createDialogArea(parent), SWT.H_SCROLL | SWT.V_SCROLL); scrollContent.setAlwaysShowScrollBars(false); scrollContent.setExpandHorizontal(true); scrollContent.setMinWidth(600); scrollContent.setLayout(new FillLayout()); scrollContent.setLayoutData(new GridData(GridData.FILL_BOTH)); applyDialogFont(scrollContent); Composite topComposite = new Composite(scrollContent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); topComposite.setLayout(layout); createTitleArea(topComposite); Composite composite = new Composite(topComposite, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); composite.setLayout(new GridLayout(2, true)); createFieldArea(composite); createGroupArea(composite); createBookmarkArea(topComposite); createTOCArea(topComposite); createFilterSortingArea(topComposite); UIUtil.bindHelp(parent, IHelpContextIds.GROUP_DIALOG_ID); Point size = topComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT); topComposite.setSize(size.x, size.y); scrollContent.setContent(topComposite); return scrollContent; } private void createBookmarkArea(Composite parent) { Composite bookmakrComposite = new Composite(parent, SWT.NONE); bookmakrComposite.setLayout(new GridLayout()); GridData gd = new GridData(GridData.FILL_HORIZONTAL); GridLayout layout = new GridLayout(); layout.numColumns = 3; bookmakrComposite.setLayoutData(gd); bookmakrComposite.setLayout(layout); new Label(bookmakrComposite, SWT.NONE).setText(Messages.getString("GroupDialog.Label.Bookmark")); //$NON-NLS-1$ bookmarkEditor = new Text(bookmakrComposite, SWT.MULTI | SWT.BORDER); gd = new GridData(); gd.widthHint = 180; gd.heightHint = bookmarkEditor.computeSize(SWT.DEFAULT, SWT.DEFAULT).y - bookmarkEditor.getBorderWidth() * 2; bookmarkEditor.setLayoutData(gd); ExpressionButtonUtil.createExpressionButton(bookmakrComposite, bookmarkEditor, new ExpressionProvider(inputGroup), inputGroup.getContainer()); } private void createTOCArea(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText(Messages.getString("GroupDialog.Dialog.TOCGroup")); //$NON-NLS-1$ GridLayout layout = new GridLayout(); layout.numColumns = 2; group.setLayout(layout); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Creates TOC expression name Label new Label(group, SWT.NONE).setText(Messages.getString("GroupDialog.Dialog.TOC")); //$NON-NLS-1$ // Creates TOC area Composite tocArea = new Composite(group, SWT.NONE); tocArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); tocArea.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false)); // Creates expression editor tocEditor = new Text(tocArea, SWT.MULTI | SWT.BORDER); GridData gd = new GridData(); gd.widthHint = 200; gd.heightHint = tocEditor.computeSize(SWT.DEFAULT, SWT.DEFAULT).y - tocEditor.getBorderWidth() * 2; tocEditor.setLayoutData(gd); tocEditor.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (tocStyleType == null) return; if (tocEditor.getText().trim().equals("")) //$NON-NLS-1$ { tocStyleType.setEnabled(false); } else { tocStyleType.setEnabled(true); } } }); ExpressionButtonUtil.createExpressionButton(tocArea, tocEditor, new ExpressionProvider(inputGroup), inputGroup.getContainer()); new Label(group, SWT.NONE).setText(Messages.getString("GroupDialog.Dialog.TOCStyle")); //$NON-NLS-1$ tocStyleType = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.widthHint = 200; tocStyleType.setLayoutData(gd); tocStyleType.setVisibleItemCount(30); tocStyleType.setItems(sytleChoicesAll); } /** * Creates the title area * * @param parent * the parent composite */ private void createTitleArea(Composite parent) { int heightMargins = 3; int widthMargins = 8; final Composite titleArea = new Composite(parent, SWT.NONE); FormLayout layout = new FormLayout(); layout.marginHeight = heightMargins; layout.marginWidth = widthMargins; titleArea.setLayout(layout); Display display = parent.getDisplay(); Color background = JFaceColors.getBannerBackground(display); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL); layoutData.heightHint = 20 + (heightMargins * 2); titleArea.setLayoutData(layoutData); titleArea.setBackground(background); titleArea.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { e.gc.setForeground(titleArea.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); Rectangle bounds = titleArea.getClientArea(); bounds.height = bounds.height - 2; bounds.width = bounds.width - 1; e.gc.drawRectangle(bounds); } }); Label label = new Label(titleArea, SWT.NONE); label.setBackground(background); label.setFont(FontManager.getFont(label.getFont().toString(), 10, SWT.BOLD)); label.setText(GROUP_DLG_AREA_MSG); } /** * Creates the field area * * @param parent * the parent composite */ private void createFieldArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); GridData gd = new GridData(GridData.FILL_BOTH); gd.widthHint = 200; composite.setLayoutData(gd); // Creates group name Label new Label(composite, SWT.NONE).setText(GROUP_DLG_GROUP_NAME_LABEL); // Creates group name editor nameEditor = new Text(composite, SWT.SINGLE | SWT.BORDER); nameEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Creates group key Label new Label(composite, SWT.NONE).setText(GROUP_DLG_GROUP_KEY_LABEL); // Creates group key chooser Composite keyArea = new Composite(composite, SWT.NONE); keyArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); keyArea.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false)); keyChooser = new Combo(keyArea, SWT.DROP_DOWN); keyChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); keyChooser.setVisibleItemCount(30); keyChooser.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!keyChooser.getText().trim().equals("")) //$NON-NLS-1$ { resetInterval(); } } }); keyChooser.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (keyChooser.getSelectionIndex() != -1) { IExpressionConverter converter = ExpressionButtonUtil.getCurrentExpressionConverter(keyChooser); if (converter != null) { String value = ExpressionUtility .getExpression(columnList.get(keyChooser.getSelectionIndex()), converter); if (value != null) { tocEditor.setText(value); tocEditor.setData(ExpressionButtonUtil.EXPR_TYPE, ExpressionButtonUtil.getExpression(keyChooser).getType()); ExpressionButton button = ExpressionButtonUtil.getExpressionButton(tocEditor); if (button != null) { ((ExpressionButton) button).refresh(); } } } } } }); keyChooser.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { String key = UIUtil.convertToModelString(keyChooser.getText(), true); if (key != null) { String tocExp = null; IExpressionConverter converter = ExpressionButtonUtil.getCurrentExpressionConverter(keyChooser, false); if (converter != null) { if (keyChooser.indexOf(key) != -1) { tocExp = ExpressionUtility.getExpression(columnList.get(keyChooser.indexOf(key)), converter); } else { for (int i = 0; i < columnList.size(); i++) { if (key.equals(ExpressionUtility.getExpression(columnList.get(i), converter))) { tocExp = key; break; } } } } if (!tocEditor.getText().equals(tocExp)) { if (tocExp == null) { tocEditor.setText(""); //$NON-NLS-1$ } else { tocEditor.setText(tocExp); } } tocEditor.setData(ExpressionButtonUtil.EXPR_TYPE, ExpressionButtonUtil.getExpression(keyChooser).getType()); ExpressionButton button = ExpressionButtonUtil.getExpressionButton(tocEditor); if (button != null) { ((ExpressionButton) button).refresh(); } } } }); ExpressionHelper helper = new ExpressionHelper() { public String getExpression() { return GroupDialog.this.getKeyExpression(keyChooser, keyChooser.getText()); } public void setExpression(String expression) { GroupDialog.this.setKeyExpression(keyChooser, expression); } public IExpressionProvider getExpressionProvider() { return new ExpressionProvider(inputGroup); } public IExpressionContextFactory getExpressionContextFactory() { return new ExpressionContextFactoryImpl(getContextObject(), getExpressionProvider()); } }; ExpressionButtonUtil.createExpressionButton(keyArea, keyChooser, null, inputGroup.getContainer(), null, false, SWT.PUSH, helper); // Creates intervalRange area Composite intervalArea = new Composite(composite, SWT.NONE); intervalArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); intervalArea.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false)); Composite intervalTypeArea = new Composite(intervalArea, SWT.NONE); intervalTypeArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); intervalTypeArea.setLayout(UIUtil.createGridLayoutWithoutMargin(1, false)); Composite intervalRangeArea = new Composite(intervalArea, SWT.NONE); intervalRangeArea.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); intervalRangeArea.setLayout(UIUtil.createGridLayoutWithoutMargin(1, false)); // Creates intervalRange labels new Label(intervalTypeArea, SWT.NONE).setText(GROUP_DLG_GROUP_INTERVAL_LABEL); new Label(intervalRangeArea, SWT.NONE).setText(GROUP_DLG_GROUP_RANGE_LABEL); // Creates intervalRange type chooser intervalType = new Combo(intervalTypeArea, SWT.READ_ONLY | SWT.DROP_DOWN); intervalType.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); intervalType.setVisibleItemCount(30); for (int i = 0; i < intervalChoices.length; i++) { intervalType.add(intervalChoices[i].getDisplayName()); } intervalType.setData(intervalChoices); intervalType.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { intervalRange.setEnabled(intervalType.getSelectionIndex() != 0); intervalBaseButton .setEnabled(intervalType.getSelectionIndex() != 0 && (getColumnType() != String.class)); intervalBaseText.setEnabled(intervalBaseButton.getEnabled() && intervalBaseButton.getSelection()); } }); // Creates intervalRange range chooser intervalRange = new Text(intervalRangeArea, SWT.SINGLE | SWT.BORDER); intervalRange.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); intervalRange.addVerifyListener(new VerifyListener() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse. * swt.events.VerifyEvent) */ public void verifyText(VerifyEvent event) { if (event.text.length() <= 0) { return; } int beginIndex = Math.min(event.start, event.end); int endIndex = Math.max(event.start, event.end); String inputtedText = intervalRange.getText(); String newString = inputtedText.substring(0, beginIndex); newString += event.text; newString += inputtedText.substring(endIndex); event.doit = false; try { double value = format.parse(newString).doubleValue(); if (value >= 0) { event.doit = true; } } catch (Exception e) { event.doit = false; return; } } }); // Creates interval base editor intervalBaseButton = new Button(composite, SWT.CHECK); intervalBaseButton.setText(GROUP_DLG_INTERVAL_BASE_LABEL); //$NON-NLS-1$ intervalBaseButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); intervalBaseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { intervalBaseText.setEnabled(intervalBaseButton.getSelection()); } }); intervalBaseText = new Text(composite, SWT.SINGLE | SWT.BORDER); intervalBaseText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite buttonContainer = new Composite(composite, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; layout.numColumns = 2; buttonContainer.setLayout(layout); buttonContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); hideDetail = new Button(buttonContainer, SWT.CHECK); hideDetail.setText(GROUP_DLG_HIDE_DETAIL); createStartCollapsedSection(buttonContainer); } private void createStartCollapsedSection(Composite parent) { IDialogHelperProvider helperProvider = (IDialogHelperProvider) ElementAdapterManager.getAdapter(this, IDialogHelperProvider.class); if (helperProvider != null) { startCollapsedHelper = helperProvider.createHelper(this, HELPER_KEY_STARTCOLLAPSED); } if (startCollapsedHelper != null && inputGroup.getContainer().getSlot(IListingElementModel.GROUP_SLOT) != null) { List<String> groups = getGroupNames( inputGroup.getContainer().getStringProperty(AC_GROUP_COLLAPSE_LEVEL_PROPERTY)); String position = "" + (inputGroup.getContainer().getSlot(IListingElementModel.GROUP_SLOT).findPosn(inputGroup) + 1); startCollapsed = groups.contains(position); startCollapsedHelper.createContent(parent); startCollapsedHelper.setProperty(START_COLLAPSED, startCollapsed); startCollapsedHelper.update(true); GridData data = new GridData(GridData.FILL_HORIZONTAL); startCollapsedHelper.getControl().setLayoutData(data); startCollapsedHelper.addListener(SWT.Modify, new org.eclipse.swt.widgets.Listener() { public void handleEvent(Event event) { startCollapsedHelper.update(false); startCollapsed = (Boolean) startCollapsedHelper.getProperty(START_COLLAPSED); } }); } } /** * Creates the group area * * @param parent * the parent composite */ private void createGroupArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); layoutData.verticalSpan = 2; composite.setLayoutData(layoutData); composite.setLayout(new GridLayout()); sortingGroup = new Group(composite, SWT.NONE); sortingGroup.setText(SORT_GROUP_TITLE); sortingGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); sortingGroup.setLayout(new FillLayout(SWT.VERTICAL)); Composite sortingGroupComposite = new Composite(sortingGroup, SWT.NONE); sortingGroupComposite.setLayout(new GridLayout()); ascending = new Button(sortingGroupComposite, SWT.RADIO); // ascending.setText( sortByAscending.getDisplayName( ) ); ascending.setText(Messages.getString("GroupDialog.Button.Ascending")); //$NON-NLS-1$ descending = new Button(sortingGroupComposite, SWT.RADIO); // descending.setText( sortByDescending.getDisplayName( ) ); descending.setText(Messages.getString("GroupDialog.Button.Descending")); //$NON-NLS-1$ Group pagebreakGroup = new Group(composite, SWT.NONE); pagebreakGroup.setText(Messages.getString("GroupDialog.PageBreak")); //$NON-NLS-1$ pagebreakGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout layout = new GridLayout(); layout.numColumns = 3; pagebreakGroup.setLayout(layout); new Label(pagebreakGroup, SWT.NONE).setText(Messages.getString("GroupDialog.PageBreakBefore")); //$NON-NLS-1$ pagebreakBeforeCombo = new Combo(pagebreakGroup, SWT.READ_ONLY | SWT.DROP_DOWN); for (int i = 0; i < pagebreakBeforeChoicesAll.length; i++) { pagebreakBeforeCombo.add(pagebreakBeforeChoicesAll[i].getDisplayName()); } pagebreakBeforeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); pagebreakBeforeCombo.setVisibleItemCount(30); WidgetUtil.createGridPlaceholder(pagebreakGroup, 1, true); pagebreakBeforeCombo.setData(pagebreakBeforeChoicesAll); new Label(pagebreakGroup, SWT.NONE).setText(Messages.getString("GroupDialog.PageBreakAfter")); //$NON-NLS-1$ pagebreakAfterCombo = new Combo(pagebreakGroup, SWT.READ_ONLY | SWT.DROP_DOWN); for (int i = 0; i < pagebreakAfterChoicesAll.length; i++) { pagebreakAfterCombo.add(pagebreakAfterChoicesAll[i].getDisplayName()); } pagebreakAfterCombo.setVisibleItemCount(30); pagebreakAfterCombo.setData(pagebreakAfterChoicesAll); pagebreakAfterCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); WidgetUtil.createGridPlaceholder(pagebreakGroup, 1, true); new Label(pagebreakGroup, SWT.NONE).setText(Messages.getString("GroupDialog.PageBreakInside")); //$NON-NLS-1$ pagebreakInsideCombo = new Combo(pagebreakGroup, SWT.READ_ONLY | SWT.DROP_DOWN); for (int i = 0; i < pagebreakInsideChoicesAll.length; i++) { pagebreakInsideCombo.add(pagebreakInsideChoicesAll[i].getDisplayName()); } pagebreakInsideCombo.setVisibleItemCount(30); pagebreakInsideCombo.setData(pagebreakInsideChoicesAll); pagebreakInsideCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); WidgetUtil.createGridPlaceholder(pagebreakGroup, 1, true); repeatHeaderButton = new Button(pagebreakGroup, SWT.CHECK); repeatHeaderButton.setText(Messages.getString("GroupDialog.RepeatHeader")); //$NON-NLS-1$ GridData data = new GridData(); data.horizontalSpan = 3; repeatHeaderButton.setLayoutData(data); PropertyHandle propertyHandle = inputGroup.getPropertyHandle(TableHandle.SORT_PROP); if (propertyHandle.iterator().hasNext()) { ascending.setEnabled(false); descending.setEnabled(false); } } /** * Creates sorting and filter table area * * @param parent * the parent composite */ private void createFilterSortingArea(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText(GROUP_DLG_GROUP_FILTER_SORTING); group.setLayout(new GridLayout()); group.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).minSize(500, 250).create()); ArrayList list = new ArrayList(1); list.add(inputGroup); TabFolder tab = new TabFolder(group, SWT.TOP); tab.setLayoutData(new GridData(GridData.FILL_BOTH)); // TODO:remove databinding page by cnfree on 4.28.2006 /* * TabItem bindingItem = new TabItem( tab, SWT.NONE ); FormPage * bindingPage = new DataSetColumnBindingsFormPage( tab, new * DataSetColumnBindingsFormHandleProvider( ) ); bindingPage.setInput( * list ); bindingItem.setText( TAB_BINDING ); bindingItem.setControl( * bindingPage ); */ TabItem filterItem = new TabItem(tab, SWT.NONE); FormPage filterPage = new FormPage(tab, FormPage.FULL_FUNCTION_HORIZONTAL, new FilterHandleProvider() { public int[] getColumnWidths() { return new int[] { 200, 100, 100, 100 }; } @Override public boolean isEditGroup() { return editGroup(); } }, true); filterPage.setInput(list); filterItem.setText(TAB_FILTER); filterItem.setControl(filterPage); checkReadOnlyControl(IGroupElementModel.FILTER_PROP, filterPage); final TabItem sortItem = new TabItem(tab, SWT.NONE); FormPage sortPage = new FormPage(tab, FormPage.FULL_FUNCTION_HORIZONTAL, new SortingHandleProvider() { public int[] getColumnWidths() { return new int[] { 200, 100, 100, 100 }; } }, true); sortPage.setInput(list); sortItem.setText(TAB_SORTING); sortItem.setControl(sortPage); checkReadOnlyControl(IGroupElementModel.SORT_PROP, sortPage); } private boolean checkReadOnlyControl(String property, Control control) { PropertyHandle handle = inputGroup.getPropertyHandle(property); if (handle != null && handle.isReadOnly()) { if (control instanceof Text) ((Text) control).setEditable(false); else if (control instanceof Combo) ((Combo) control).setEnabled(false); else if (control instanceof Button) ((Button) control).setEnabled(false); else if (control instanceof Composite) { disableControl((Composite) control); } return handle.isReadOnly(); } return false; } private void disableControl(Composite container) { Control[] children = container.getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Composite) disableControl((Composite) children[i]); else if (!(children[i] instanceof Label)) children[i].setEnabled(false); } container.setEnabled(false); } /* * (non-Javadoc) * * @see * org.eclipse.birt.report.designer.internal.ui.dialogs.BaseDialog#initDialog * () */ protected boolean initDialog() { if (inputGroup.getName() != null) { nameEditor.setText(inputGroup.getName()); checkReadOnlyControl(IGroupElementModel.GROUP_NAME_PROP, nameEditor); } ExpressionButtonUtil.initExpressionButtonControl(bookmarkEditor, inputGroup, IGroupElementModel.BOOKMARK_PROP); checkReadOnlyControl(IGroupElementModel.BOOKMARK_PROP, bookmarkEditor); refreshColumnList(); setKeyExpression(inputGroup.getExpressionProperty(IGroupElementModel.KEY_EXPR_PROP)); if (checkReadOnlyControl(IGroupElementModel.KEY_EXPR_PROP, keyChooser)) ((ExpressionButton) keyChooser.getData(ExpressionButtonUtil.EXPR_BUTTON)).setEnabled(false); else ((ExpressionButton) keyChooser.getData(ExpressionButtonUtil.EXPR_BUTTON)).setEnabled(true); PropertyHandle property = inputGroup.getPropertyHandle(GroupElement.INTERVAL_RANGE_PROP); String range = property == null ? null : property.getDisplayValue(); intervalRange.setText(range == null ? "" : range); //$NON-NLS-1$ checkReadOnlyControl(GroupElement.INTERVAL_RANGE_PROP, intervalRange); int index = getIntervalTypeIndex(inputGroup.getInterval()); intervalType.select(index); checkReadOnlyControl(IGroupElementModel.INTERVAL_PROP, intervalType); if (index == 0) { intervalRange.setEnabled(false); intervalBaseButton.setEnabled(false); intervalBaseText.setEnabled(false); } else { intervalRange.setEnabled(true); if (getColumnType() == String.class) { intervalBaseButton.setEnabled(false); intervalBaseText.setEnabled(false); } else { intervalBaseButton.setEnabled(true); intervalBaseButton.setSelection(inputGroup.getIntervalBase() != null); intervalBaseText.setEnabled(intervalBaseButton.getSelection()); if (inputGroup.getIntervalBase() != null) { intervalBaseText.setText(inputGroup.getIntervalBase()); } } } checkReadOnlyControl(IGroupElementModel.INTERVAL_BASE_PROP, intervalBaseButton); checkReadOnlyControl(IGroupElementModel.INTERVAL_BASE_PROP, intervalBaseText); if (DesignChoiceConstants.SORT_DIRECTION_ASC.equals(inputGroup.getSortDirection())) { ascending.setSelection(true); } else { descending.setSelection(true); } checkReadOnlyControl(IGroupElementModel.SORT_DIRECTION_PROP, ascending); checkReadOnlyControl(IGroupElementModel.SORT_DIRECTION_PROP, descending); List list = new ArrayList(1); list.add(inputGroup); // filterPage.setInput( list ); ExpressionButtonUtil.initExpressionButtonControl(tocEditor, inputGroup.getTOC(), TOC.TOC_EXPRESSION); if (inputGroup.getTOC() != null) { index = getTocStyleIndex(inputGroup.getTOC().getStyleName()); if (index >= 0 && index < tocStyleType.getItemCount()) { tocStyleType.select(index); } else { if (inputGroup.getTOC().getStyleName() != null) tocStyleType.setText(inputGroup.getTOC().getStyleName()); } if (tocStyleType.getText() == null || tocStyleType.getText().trim().length() == 0) tocStyleType.setEnabled(false); } if (checkReadOnlyControl(IGroupElementModel.TOC_PROP, tocEditor)) { ((ExpressionButton) tocEditor.getData(ExpressionButtonUtil.EXPR_BUTTON)).setEnabled(false); tocStyleType.setEnabled(false); } else { ((ExpressionButton) tocEditor.getData(ExpressionButtonUtil.EXPR_BUTTON)).setEnabled(true); } index = getPagebreakBeforeIndex(inputGroup.getPageBreakBefore()); if (index < 0 || index >= pagebreakBeforeCombo.getItemCount()) { pagebreakBeforeCombo.setText(inputGroup.getPageBreakBefore()); } else { pagebreakBeforeCombo.select(index); } checkReadOnlyControl(IStyleModel.PAGE_BREAK_BEFORE_PROP, pagebreakBeforeCombo); index = getPagebreakAfterIndex(inputGroup.getPageBreakAfter()); if (index < 0 || index >= pagebreakAfterCombo.getItemCount()) { pagebreakAfterCombo.setText(inputGroup.getPageBreakAfter()); } else { pagebreakAfterCombo.select(index); } checkReadOnlyControl(IStyleModel.PAGE_BREAK_AFTER_PROP, pagebreakAfterCombo); index = getPagebreakInsideIndex(inputGroup.getPageBreakInside()); if (index < 0 || index >= pagebreakInsideCombo.getItemCount()) { pagebreakInsideCombo.setText(inputGroup.getPageBreakInside()); } else { pagebreakInsideCombo.select(index); } checkReadOnlyControl(IStyleModel.PAGE_BREAK_AFTER_PROP, pagebreakInsideCombo); if (inputGroup.repeatHeader()) { repeatHeaderButton.setSelection(true); } checkReadOnlyControl(IGroupElementModel.REPEAT_HEADER_PROP, repeatHeaderButton); hideDetail.setSelection(inputGroup.hideDetail()); checkReadOnlyControl(IGroupElementModel.HIDE_DETAIL_PROP, hideDetail); return true; } private void refreshColumnList() { String selected = keyChooser.getText(); keyChooser.removeAll(); columnList = DEUtil.getVisiableColumnBindingsList(inputGroup); columnList = DataUtil.getValidGroupKeyBindings(columnList); Iterator itor = columnList.iterator(); while (itor.hasNext()) { keyChooser.add(((ComputedColumnHandle) itor.next()).getName()); } int newIndex = keyChooser.indexOf(selected); if (newIndex != -1) { keyChooser.select(newIndex); } else { keyChooser.setText(selected); } } private int getPagebreakAfterIndex(String pageBreakAfter) { int index = 0; for (int i = 0; i < pagebreakAfterChoicesAll.length; i++) { if (pagebreakAfterChoicesAll[i].getName().equals(pageBreakAfter)) { index = i; break; } } return index; } private int getPagebreakInsideIndex(String pageBreakInside) { int index = 0; for (int i = 0; i < pagebreakInsideChoicesAll.length; i++) { if (pagebreakInsideChoicesAll[i].getName().equals(pageBreakInside)) { index = i; break; } } return index; } private int getPagebreakBeforeIndex(String pageBreakBefore) { int index = 0; for (int i = 0; i < pagebreakBeforeChoicesAll.length; i++) { if (pagebreakBeforeChoicesAll[i].getName().equals(pageBreakBefore)) { index = i; break; } } return index; } private int getTocStyleIndex(String style) { int index = -1; if (style == null || style.trim().length() == 0) { return 0; } for (int i = 0; i < sytleChoicesAll.length; i++) { if (sytleChoicesAll[i].equals(style)) { index = i; break; } } return index; } /** * Sets the model input. * * @param input */ public void setInput(Object input) { assert input instanceof GroupHandle; if (inputGroup != null) inputGroup.removeListener(this); inputGroup = (GroupHandle) input; inputGroup.addListener(this); } /** * Sets the dataset list to use. * * @param dataSetList */ // public void setDataSetList( List dataSetList ) // { // this.dataSetList = dataSetList; // } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ protected void okPressed() { try { inputGroup.setName(nameEditor.getText()); String bookmark = bookmarkEditor.getText(); if (bookmark != null && !bookmark.equals("")) //$NON-NLS-1$ { ExpressionButtonUtil.saveExpressionButtonControl(bookmarkEditor, inputGroup, IGroupElementModel.BOOKMARK_PROP); } else { inputGroup.setBookmark(null); } String tocText = tocEditor.getText(); if (tocText != null && !tocText.equals("")) //$NON-NLS-1$ { if (inputGroup.getTOC() != null) ExpressionButtonUtil.saveExpressionButtonControl(tocEditor, inputGroup.getTOC(), TOC.TOC_EXPRESSION); else { TOC toc = StructureFactory.createTOC(); ExpressionButtonUtil.saveExpressionButtonControl(tocEditor, toc, TOC.TOC_EXPRESSION); inputGroup.addTOC(toc); } } else { inputGroup.setTocExpression(null); } int index; if (inputGroup.getTOC() != null) { index = tocStyleType.getSelectionIndex(); if (index == 0) { inputGroup.getTOC().setStyleName(null); } else { inputGroup.getTOC().setStyleName(tocStyleType.getText()); } } index = keyChooser.getSelectionIndex(); if (index == -1 && UIUtil.convertToModelString(keyChooser.getText(), true) != null) { String groupKey = UIUtil.convertToModelString(keyChooser.getText(), true); if (keyChooser.indexOf(groupKey) != -1) { index = keyChooser.indexOf(groupKey); } else { for (int i = 0; i < columnList.size(); i++) { if (groupKey.equals(DEUtil.getExpression(columnList.get(i)))) { index = i; break; } } } } Expression oldKeyExpr = (Expression) inputGroup.getExpressionProperty(IGroupElementModel.KEY_EXPR_PROP) .getValue(); Expression newKeyExpr = new Expression(getKeyExpression(keyChooser, keyChooser.getText()), (String) keyChooser.getData(ExpressionButtonUtil.EXPR_TYPE)); inputGroup.setExpressionProperty(IGroupElementModel.KEY_EXPR_PROP, newKeyExpr); if (newKeyExpr != null && newKeyExpr.getStringExpression() != null && newKeyExpr.getStringExpression().trim().length() != 0 && !newKeyExpr.equals(oldKeyExpr) && index != -1) { SlotHandle slotHandle = null; // SlotHandle headerHandle = null; if (inputGroup instanceof ListGroupHandle) { slotHandle = inputGroup.getHeader(); // headerHandle = ( (ListHandle) inputGroup.getContainer( ) // ).getHeader( ); } else if (inputGroup instanceof TableGroupHandle) { if (inputGroup.getHeader().getCount() != 0) { RowHandle rowHandle = ((RowHandle) inputGroup.getHeader().get(0)); CellHandle cellHandle = (CellHandle) rowHandle.getCells().get(0); slotHandle = cellHandle.getContent(); } // headerHandle = ( (TableHandle) inputGroup.getContainer( ) // ).getHeader( ); // if ( headerHandle.getCount( ) != 0 ) // { // headerHandle = ( (RowHandle) headerHandle.get( 0 ) // ).getCells( ); // if ( headerHandle.getCount( ) != 0 ) // { // headerHandle = ( (CellHandle) headerHandle.get( 0 ) // ).getContent( ); // } // } } if (slotHandle != null) { // bugzilla 224242, add data item when cell is empty if (slotHandle.getContents().size() == 0) { DataItemHandle dataItemHandle = inputGroup.getElementFactory().newDataItem(null); ComputedColumnHandle columnHandle = (ComputedColumnHandle) columnList.get(index); dataItemHandle.setResultSetColumn(columnHandle.getName()); ColumnHintHandle hintHandle = findColumnHintHandle(columnHandle); setDataItemAction(hintHandle, dataItemHandle); StyleHandle styleHandle = dataItemHandle.getPrivateStyle(); if (hintHandle != null) { InsertInLayoutUtil.formatDataHandleDataType(columnHandle.getDataType(), hintHandle.getValueFormat(), styleHandle); } slotHandle.add(dataItemHandle); } } } index = intervalType.getSelectionIndex(); if (!intervalChoices[index].getName().equals(inputGroup.getInterval())) inputGroup.setInterval(intervalChoices[index].getName()); if (index != 0) { try { if (intervalRange.getText().trim().length() > 0) { inputGroup.setIntervalRange(format.parse(intervalRange.getText()).doubleValue()); } else { inputGroup.setIntervalRange(null); } } catch (ParseException e) { ExceptionHandler.handle(e); } } else { inputGroup.setProperty(GroupHandle.INTERVAL_RANGE_PROP, null); } if (intervalBaseText.getEnabled()) { inputGroup.setIntervalBase(UIUtil.convertToModelString(intervalBaseText.getText(), false)); } else { inputGroup.setIntervalBase(null); } if (inputGroup.hideDetail() != hideDetail.getSelection()) { inputGroup.setHideDetail(hideDetail.getSelection()); } if (ascending.getSelection()) { if (!DesignChoiceConstants.SORT_DIRECTION_ASC.equals(inputGroup.getSortDirection())) inputGroup.setSortDirection(DesignChoiceConstants.SORT_DIRECTION_ASC); } else { if (!DesignChoiceConstants.SORT_DIRECTION_DESC.equals(inputGroup.getSortDirection())) inputGroup.setSortDirection(DesignChoiceConstants.SORT_DIRECTION_DESC); } String choice = pagebreakBeforeChoicesAll[pagebreakBeforeCombo.getSelectionIndex()].getName(); if (!choice.equals(inputGroup.getPageBreakBefore())) inputGroup.setPageBreakBefore(choice); choice = pagebreakAfterChoicesAll[pagebreakAfterCombo.getSelectionIndex()].getName(); if (!choice.equals(inputGroup.getPageBreakAfter())) inputGroup.setPageBreakAfter(choice); choice = pagebreakInsideChoicesAll[pagebreakInsideCombo.getSelectionIndex()].getName(); if (!choice.equals(inputGroup.getPageBreakInside())) inputGroup.setPageBreakInside(choice); if (inputGroup.repeatHeader() != repeatHeaderButton.getSelection()) { inputGroup.setRepeatHeader(repeatHeaderButton.getSelection()); } if (this.startCollapsedHelper != null) { UserPropertyDefnHandle property = inputGroup.getContainer() .getUserPropertyDefnHandle(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); if (property != null && property.getType() != PropertyType.STRING_TYPE) { inputGroup.getContainer().dropUserPropertyDefn(property.getName()); } property = inputGroup.getContainer().getUserPropertyDefnHandle(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); if (property == null) { UserPropertyDefn propertyDefn = new UserPropertyDefn(); propertyDefn.setName(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); propertyDefn.setType(DEUtil.getMetaDataDictionary().getPropertyType(PropertyType.STRING_TYPE)); // propertyDefn.setVisible( false ); inputGroup.getContainer().addUserPropertyDefn(propertyDefn); } List<String> groups = getGroupNames( inputGroup.getContainer().getStringProperty(AC_GROUP_COLLAPSE_LEVEL_PROPERTY)); String position = "" + (inputGroup.getContainer().getSlot(IListingElementModel.GROUP_SLOT).findPosn(inputGroup) + 1); if (startCollapsed) { if (!groups.contains(position)) groups.add(position); } else { groups.remove(position); } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < groups.size(); i++) { buffer.append(groups.get(i)); if (i < groups.size() - 1) buffer.append(","); //$NON-NLS-1$ } String value = buffer.toString().trim().length() > 0 ? buffer.toString().trim() : null; inputGroup.getContainer().setStringProperty(AC_GROUP_COLLAPSE_LEVEL_PROPERTY, value); } if (this.startCollapsedHelper != null) { UserPropertyDefnHandle property = inputGroup.getContainer() .getUserPropertyDefnHandle(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); if (property != null && property.getType() != PropertyType.STRING_TYPE) { inputGroup.getContainer().dropUserPropertyDefn(property.getName()); } property = inputGroup.getContainer().getUserPropertyDefnHandle(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); if (property == null) { UserPropertyDefn propertyDefn = new UserPropertyDefn(); propertyDefn.setName(AC_GROUP_COLLAPSE_LEVEL_PROPERTY); propertyDefn.setType(DEUtil.getMetaDataDictionary().getPropertyType(PropertyType.STRING_TYPE)); // propertyDefn.setVisible( false ); inputGroup.getContainer().addUserPropertyDefn(propertyDefn); } List<String> groups = getGroupNames( inputGroup.getContainer().getStringProperty(AC_GROUP_COLLAPSE_LEVEL_PROPERTY)); String position = "" + (inputGroup.getContainer().getSlot(IListingElementModel.GROUP_SLOT).findPosn(inputGroup) + 1); if (startCollapsed) { if (!groups.contains(position)) groups.add(position); } else { groups.remove(position); } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < groups.size(); i++) { buffer.append(groups.get(i)); if (i < groups.size() - 1) buffer.append(","); //$NON-NLS-1$ } String value = buffer.toString().trim().length() > 0 ? buffer.toString().trim() : null; inputGroup.getContainer().setStringProperty(AC_GROUP_COLLAPSE_LEVEL_PROPERTY, value); } } catch (SemanticException e) { ExceptionHandler.handle(e); return; } setResult(inputGroup); super.okPressed(); } private List<String> getGroupNames(String s) { List<String> groups = new ArrayList<String>(); if (s == null) return groups; StringBuffer buffer = new StringBuffer(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == ',') { if (buffer.toString().trim().length() > 0) { groups.add(buffer.toString().trim()); } buffer = new StringBuffer(); } else { buffer.append(c); } } if (buffer.toString().trim().length() > 0) { groups.add(buffer.toString().trim()); } return groups; } private static void setDataItemAction(ColumnHintHandle model, DataItemHandle dataHandle) { if (model == null || dataHandle == null) { return; } ActionHandle actionHandle = model.getActionHandle(); if (actionHandle != null) { List source = new ArrayList(); source.add(actionHandle.getStructure()); List newAction = ModelUtil.cloneStructList(source); try { dataHandle.setAction((Action) newAction.get(0)); } catch (SemanticException e) { // Do nothing now } } } private static ColumnHintHandle findColumnHintHandle(ComputedColumnHandle column) { if (!(column.getElementHandle() instanceof ReportItemHandle)) { return null; } DataSetHandle dataset = ((ReportItemHandle) column.getElementHandle()).getDataSet(); if (dataset == null) { return null; } for (Iterator iter = dataset.getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP).iterator(); iter .hasNext();) { ColumnHintHandle element = (ColumnHintHandle) iter.next(); if (element.getColumnName().equals(column.getColumnName()) || column.getColumnName().equals(element.getAlias())) { return element; } } return null; } /** * Returns the internal type index by its value. * * @param interval */ private int getIntervalTypeIndex(String interval) { int index = 0; for (int i = 0; i < intervalChoices.length; i++) { if (intervalChoices[i].getName().equals(interval)) { index = i; break; } } return index; } private void setKeyExpression(ExpressionHandle key) { keyChooser.setData(ExpressionButtonUtil.EXPR_TYPE, key == null || key.getType() == null ? UIUtil.getDefaultScriptType() : (String) key.getType()); Object button = keyChooser.getData(ExpressionButtonUtil.EXPR_BUTTON); if (button instanceof ExpressionButton) { ((ExpressionButton) button).refresh(); } if (key == null) { keyChooser.setText(""); //$NON-NLS-1$ return; } keyChooser.deselectAll(); String keyValue = StringUtil.trimString(key.getStringExpression()); if (StringUtil.isBlank(keyValue)) { keyChooser.setText(""); //$NON-NLS-1$ return; } for (int i = 0; i < columnList.size(); i++) { if (keyValue.equals(ExpressionUtility.getExpression(columnList.get(i), ExpressionButtonUtil.getCurrentExpressionConverter(keyChooser, false)))) { keyChooser.select(i); return; } } keyChooser.setText(keyValue); } /** * Reset interval * */ private void resetInterval() { String currentKeyExpression = keyChooser.getText(); if (previoiusKeyExpression.equals(currentKeyExpression)) return; if (ExpressionUtility.isColumnExpression(currentKeyExpression)) intervalChoices = getSubIntervalChoice(); else intervalChoices = intervalChoicesAll; resetIntervalType(intervalChoices); previoiusKeyExpression = currentKeyExpression; } /** * Get subIntervalChoice, could be String,Date,Numeric or All * * @return */ private IChoice[] getSubIntervalChoice() { Class columnType = getColumnType(); if (columnType == null) return intervalChoicesAll; if (String.class.isAssignableFrom(columnType)) { return intervalChoicesString; } else if (Date.class.isAssignableFrom(columnType)) { return intervalChoicesDate; } else if (Number.class.isAssignableFrom(columnType)) { return intervalChoicesNumeric; } else { return intervalChoicesAll; } } private static IChoice[] getIntervalChoicesString() { String[] str = new String[] { DesignChoiceConstants.INTERVAL_NONE, DesignChoiceConstants.INTERVAL_PREFIX, }; return getIntervalChoiceArray(str); } private static IChoice[] getIntervalChoicesDate() { String[] str = new String[] { DesignChoiceConstants.INTERVAL_NONE, DesignChoiceConstants.INTERVAL_YEAR, DesignChoiceConstants.INTERVAL_QUARTER, DesignChoiceConstants.INTERVAL_MONTH, DesignChoiceConstants.INTERVAL_WEEK, DesignChoiceConstants.INTERVAL_DAY, DesignChoiceConstants.INTERVAL_HOUR, DesignChoiceConstants.INTERVAL_MINUTE, DesignChoiceConstants.INTERVAL_SECOND }; return getIntervalChoiceArray(str); } private static IChoice[] getIntervalChoicesNumeric() { String[] str = new String[] { DesignChoiceConstants.INTERVAL_NONE, DesignChoiceConstants.INTERVAL_INTERVAL, }; return getIntervalChoiceArray(str); } /** * Get intervalChoiceArray * * @param str * @return */ private static IChoice[] getIntervalChoiceArray(String[] str) { List choiceList = new ArrayList(); for (int i = 0; i < intervalChoicesAll.length; i++) { for (int j = 0; j < str.length; j++) { if (intervalChoicesAll[i].getName().equals(str[j])) { choiceList.add(intervalChoicesAll[i]); break; } } } IChoice[] choice = new IChoice[choiceList.size()]; return (IChoice[]) choiceList.toArray(choice); } /** * Get columnDataType * * @return */ private Class getColumnType() { for (int i = 0; i < columnList.size(); i++) { Object dataSetItemModel = columnList.get(i); if (dataSetItemModel instanceof DataSetItemModel) { if (((DataSetItemModel) dataSetItemModel).getDataSetColumnName().equals(keyChooser.getText())) return DataType.getClass(((DataSetItemModel) dataSetItemModel).getDataType()); } } return null; } /** * Reset intervalType * * @param choice */ private void resetIntervalType(IChoice[] choice) { intervalType.removeAll(); for (int i = 0; i < choice.length; i++) { intervalType.add(choice[i].getDisplayName()); } intervalType.setData(choice); intervalType.select(0); intervalType.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { intervalRange.setEnabled(intervalType.getSelectionIndex() != 0); intervalBaseButton .setEnabled(intervalType.getSelectionIndex() != 0 && (getColumnType() != String.class)); intervalBaseText.setEnabled(intervalBaseButton.getEnabled() && intervalBaseButton.getSelection()); } }); enableIntervalRangeAndBase(false); } /** * Enable the interval range and base right after refreshing the interval * type * */ private void enableIntervalRangeAndBase(boolean bool) { intervalRange.setEnabled(bool); intervalBaseButton.setEnabled(bool); intervalBaseText.setEnabled(bool); } private String getKeyExpression(Combo chooser, String key) { for (Iterator iter = columnList.iterator(); iter.hasNext();) { ComputedColumnHandle cachedColumn = (ComputedColumnHandle) iter.next(); if (cachedColumn.getName().equals(key)) { IExpressionConverter converter = ExpressionButtonUtil.getCurrentExpressionConverter(chooser); return ExpressionUtility.getExpression(cachedColumn, converter); } } return key; } private void setKeyExpression(Combo chooser, String key) { chooser.deselectAll(); key = StringUtil.trimString(key); if (StringUtil.isBlank(key)) { chooser.setText(""); //$NON-NLS-1$ return; } IExpressionConverter converter = ExpressionButtonUtil.getCurrentExpressionConverter(chooser); for (int i = 0; i < columnList.size(); i++) { if (key.equals(ExpressionUtility.getExpression(columnList.get(i), converter))) { // chooser.select( i ); chooser.setText(((ComputedColumnHandle) columnList.get(i)).getName()); return; } } chooser.setText(key); } public void elementChanged(DesignElementHandle focus, NotificationEvent ev) { PropertyHandle propertyHandle = inputGroup.getPropertyHandle(TableHandle.SORT_PROP); if (propertyHandle.iterator().hasNext()) { ascending.setEnabled(false); descending.setEnabled(false); } else { ascending.setEnabled(true); descending.setEnabled(true); } } @Override public boolean close() { inputGroup.removeListener(this); return super.close(); } private boolean editGroup() { if (GROUP_DLG_TITLE_EDIT.equals(getTitle())) { return true; } return false; } }