/******************************************************************************* * Copyright (c) 2005, 2015 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation * QNX - Alena Laskavaia Bug 240330 - [Memory View] Items per row should not be limited to 16 * Freescale - Teodor Madan Bug 248486 - [Memory View] Need a way to set default memory view format for a particular renderer *******************************************************************************/ package org.eclipse.debug.internal.ui.views.memory.renderings; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.internal.ui.DebugUIMessages; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.memory.IPersistableDebugElement; import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.PageBook; public class FormatTableRenderingDialog extends TrayDialog { // possible number of addressable units per column private int[] fColumnSizes = new int[] {1, 2, 4, 8, 16, 32, 64, 128}; // possible number of addressable units per column private int[] fRowSizes = new int[] {1, 2, 4, 8, 16, 32, 64, 128}; private Combo fColumnControl; private Combo fRowControl; private int fCurrentColIdx = -1; private int fCurrentRowIdx = -1; private Control fPreivewPage; private PageBook fPreviewPageBook; private Button fDefaultButton; private Text fDefaultColValue; private Text fDefaultRowValue; private AbstractBaseTableRendering fRendering; private int fColumnSize; private int fRowSize; private Label fMsgLabel; private boolean fDisableCancel = false; private String fMsg; public FormatTableRenderingDialog(AbstractBaseTableRendering rendering, Shell parentShell) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); fRendering = rendering; fMsg = DebugUIMessages.FormatTableRenderingAction_1; } @Override protected Control createDialogArea(Composite parent) { getShell().setText(DebugUIMessages.FormatTableRenderingAction_0); PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugUIConstants.PLUGIN_ID + ".FormatTableRenderingDialog_context"); //$NON-NLS-1$ Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.makeColumnsEqualWidth = false; composite.setLayout(layout); GridData data = new GridData(); data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true; data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.FILL; composite.setLayoutData(data); fMsgLabel = new Label(composite, SWT.NONE); fMsgLabel.setText(fMsg); data = new GridData(); data.grabExcessHorizontalSpace = true; data.horizontalAlignment = SWT.BEGINNING; data.horizontalSpan = 3; fMsgLabel.setLayoutData(data); Label rowLabel = new Label(composite, SWT.NONE); rowLabel.setText(DebugUIMessages.FormatTableRenderingAction_2); fRowControl = new Combo(composite, SWT.READ_ONLY); for (int i=0; i rowSize) { errorMsg.append("\n"); //$NON-NLS-1$ errorMsg.append(DebugUIMessages.FormatTableRenderingAction_13); } label.setText(errorMsg.toString()); return label; } Table table = new Table(parent, SWT.BORDER); table.setHeaderVisible(true); int numCol = rowSize/colSize; TableColumn addressCol = new TableColumn(table, SWT.NONE); TableColumn[] columns = new TableColumn[numCol]; for (int i=0; i rowSize) return false; return true; } private void refreshPreviewPage() { fPreivewPage.dispose(); int rowSize = fRowSizes[fRowControl.getSelectionIndex()]; int colSize = fColumnSizes[fColumnControl.getSelectionIndex()]; fPreivewPage = createPreviewPage(fPreviewPageBook, rowSize, colSize); fPreviewPageBook.showPage(fPreivewPage); } private void updateButtons() { int rowSize = fRowSizes[fRowControl.getSelectionIndex()]; int colSize = fColumnSizes[fColumnControl.getSelectionIndex()]; Button button = getButton(IDialogConstants.OK_ID); if (!isValid(rowSize, colSize)) { button.setEnabled(false); fDefaultButton.setEnabled(false); } else { button.setEnabled(true); fDefaultButton.setEnabled(true); } } private String getRowPrefId(String modelId) { String rowPrefId = IDebugPreferenceConstants.PREF_ROW_SIZE + ":" + modelId; //$NON-NLS-1$ return rowPrefId; } private String getColumnPrefId(String modelId) { String colPrefId = IDebugPreferenceConstants.PREF_COLUMN_SIZE + ":" + modelId; //$NON-NLS-1$ return colPrefId; } private int getDefaultRowSize() { int size = -1; IPersistableDebugElement elmt = fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class); if (elmt != null) { if (elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL)) return getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL); } size = getDefaultRowSize(fRendering.getMemoryBlock().getModelIdentifier()); return size; } private int getDefaultColumnSize() { int size = -1; IPersistableDebugElement elmt = fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class); if (elmt != null) { if (elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL)) return getDefaultFromPersistableElement(IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL); } size = getDefaultColumnSize(fRendering.getMemoryBlock().getModelIdentifier()); return size; } private int getDefaultRowSize(String modelId) { int row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId)); if (row == 0) { DebugUITools.getPreferenceStore().setValue(getRowPrefId(modelId), IDebugPreferenceConstants.PREF_ROW_SIZE_DEFAULT); row = DebugUITools.getPreferenceStore().getInt(getRowPrefId(modelId)); } return row; } private int getDefaultColumnSize(String modelId) { int col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId)); if (col == 0) { // if not yet defined, initialize with default DebugUITools.getPreferenceStore().setValue(getColumnPrefId(modelId), IDebugPreferenceConstants.PREF_COLUMN_SIZE_DEFAULT); col = DebugUITools.getPreferenceStore().getInt(getColumnPrefId(modelId)); } return col; } private void saveDefaults() { int columnSize = fColumnSizes[fColumnControl.getSelectionIndex()]; int rowSize = fRowSizes[fRowControl.getSelectionIndex()]; IPersistableDebugElement elmt = fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class); if (elmt != null && elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL) && elmt.supportsProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL)) { try { elmt.setProperty(fRendering, IDebugPreferenceConstants.PREF_ROW_SIZE_BY_MODEL, Integer.valueOf(rowSize)); elmt.setProperty(fRendering, IDebugPreferenceConstants.PREF_COL_SIZE_BY_MODEL, Integer.valueOf(columnSize)); } catch (CoreException e) { DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), DebugUIMessages.FormatTableRenderingDialog_4, DebugUIMessages.FormatTableRenderingDialog_5, e); } } else { // save preference // find model id String modelId = fRendering.getMemoryBlock().getModelIdentifier(); // constrcut preference id String rowPrefId = getRowPrefId(modelId); String colPrefId = getColumnPrefId(modelId); // save setting IPreferenceStore prefStore = DebugUITools.getPreferenceStore(); prefStore.setValue(rowPrefId, rowSize); prefStore.setValue(colPrefId, columnSize); } fDefaultColValue.setText(String.valueOf(getDefaultColumnSize())); fDefaultRowValue.setText(String.valueOf(getDefaultRowSize())); fDefaultRowValue.getParent().layout(); } private void restoreDefaults() { // Determine the default values by using the following search order: // IPersistableDebugElement, workspace preference, plugin defaults // issue: 248486 int defaultRowSize = getDefaultRowSize(); int defaultColSize = getDefaultColumnSize(); populateControl(defaultRowSize, fRowSizes, fRowControl); populateControl(defaultColSize, fColumnSizes, fColumnControl); fCurrentRowIdx = fRowControl.getSelectionIndex(); fCurrentColIdx = fColumnControl.getSelectionIndex(); refreshPreviewPage(); updateButtons(); } public int getColumnSize() { return fColumnSize; } public int getRowSize() { return fRowSize; } public void setCurrentRowColSizes(int row, int col) { fCurrentColIdx = populateControl(col, fColumnSizes, fColumnControl); fCurrentRowIdx = populateControl(row, fRowSizes, fRowControl); } @Override protected Control createButtonBar(Composite parent) { Control ret = super.createButtonBar(parent); if (fDisableCancel) getButton(IDialogConstants.CANCEL_ID).setEnabled(false); updateButtons(); return ret; } public void openError(String msg) { fDisableCancel = true; fMsg = msg; open(); } private int getDefaultFromPersistableElement(String propertyId) { int defaultValue = -1; IPersistableDebugElement elmt = fRendering.getMemoryBlock().getAdapter(IPersistableDebugElement.class); if (elmt != null) { try { Object valueMB = elmt.getProperty(this, propertyId); if (valueMB != null && !(valueMB instanceof Integer)) { IStatus status = DebugUIPlugin.newErrorStatus("Model returned invalid type on " + propertyId, null); //$NON-NLS-1$ DebugUIPlugin.log(status); } if (valueMB != null) { Integer value = (Integer)valueMB; defaultValue = value.intValue(); } } catch (CoreException e) { DebugUIPlugin.log(e); } } return defaultValue; } }