From 806000c4cce933cd16519f8896644a13f0d6c91a Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 14 Dec 2021 21:16:11 +0100 Subject: [PATCH 01/28] add missing icon --- plugins/com.minres.scviewer.ui/plugin.xml | 2 +- .../com.minres.scviewer.ui/res/images/wave.png | Bin 0 -> 3324 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 plugins/com.minres.scviewer.ui/res/images/wave.png diff --git a/plugins/com.minres.scviewer.ui/plugin.xml b/plugins/com.minres.scviewer.ui/plugin.xml index 7861519..4e7ff60 100644 --- a/plugins/com.minres.scviewer.ui/plugin.xml +++ b/plugins/com.minres.scviewer.ui/plugin.xml @@ -5,7 +5,7 @@ diff --git a/plugins/com.minres.scviewer.ui/res/images/wave.png b/plugins/com.minres.scviewer.ui/res/images/wave.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad8f1852af17922d5d376a8a218954272a86fa2 GIT binary patch literal 3324 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 Date: Thu, 2 Dec 2021 16:26:47 +0100 Subject: [PATCH 02/28] add first elements --- .../icons/bullet_left.png | Bin 0 -> 307 bytes .../icons/bullet_right.png | Bin 0 -> 307 bytes .../ui/swt/internal/HorizontalSpinner.java | 1113 +++++++++++++++++ .../ui/swt/internal/WaveformSlider.java | 95 ++ .../ui/swt/internal/WaveformView.java | 22 +- .../ui/swt/internal/ZoomingScrollbar.java | 108 ++ .../database/ui/swt/sb/ActionScheduler.java | 18 + .../database/ui/swt/sb/ButtonClick.java | 45 + .../database/ui/swt/sb/ClickControl.java | 98 ++ .../ui/swt/sb/ComponentDistribution.java | 105 ++ .../database/ui/swt/sb/Decrementer.java | 24 + .../database/ui/swt/sb/Direction.java | 203 +++ .../database/ui/swt/sb/DragControl.java | 105 ++ .../database/ui/swt/sb/DragDetector.java | 60 + .../database/ui/swt/sb/DragShifter.java | 59 + .../database/ui/swt/sb/FastDecrementer.java | 49 + .../database/ui/swt/sb/FastIncrementer.java | 42 + .../database/ui/swt/sb/FlatScrollBar.java | 295 +++++ .../ui/swt/sb/FlatScrollBarLayout.java | 23 + .../database/ui/swt/sb/ImageDrawer.java | 109 ++ .../database/ui/swt/sb/ImageUpdate.java | 46 + .../database/ui/swt/sb/Incrementer.java | 24 + .../ui/swt/sb/MouseDownActionTimer.java | 37 + .../database/ui/swt/sb/MouseTracker.java | 66 + .../database/ui/swt/sb/MouseWheelShifter.java | 69 + .../database/ui/swt/sb/ResizeObserver.java | 19 + .../database/ui/swt/sb/ShiftData.java | 32 + .../ui/swt/sb/UntypedSelectionAdapter.java | 43 + .../database/ui/swt/sb/ViewComponent.java | 7 + .../org/eclipse/wb/swt/ResourceManager.java | 438 +++++++ .../eclipse/wb/swt/SWTResourceManager.java | 267 ++-- .../scviewer.product | 1 - 32 files changed, 3490 insertions(+), 132 deletions(-) create mode 100644 plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/HorizontalSpinner.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformSlider.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ActionScheduler.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ButtonClick.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ClickControl.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ComponentDistribution.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Decrementer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Direction.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragControl.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragDetector.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragShifter.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastDecrementer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastIncrementer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBar.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBarLayout.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageDrawer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageUpdate.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Incrementer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseDownActionTimer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseTracker.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseWheelShifter.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ResizeObserver.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ShiftData.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/UntypedSelectionAdapter.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ViewComponent.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/ResourceManager.java diff --git a/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png b/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png new file mode 100644 index 0000000000000000000000000000000000000000..96b446605ebf85c7142eb9ec096460ba2a9b330a GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~Unv^o$cHPZFwf!uL_esT;#rYmU(lg^$`c4sSKX3elF{r5}E*Evu=$5 literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png b/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e809d370116b96a15258bb1e0551101f8bc2d74d GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~f)_POe%sw|Iw383oe`7fwavx4 q6W*+l74C_@$!4K{RdLdXyWCG1nK!En^U45CW$<+Mb6Mw<&;$VPI%^*Q literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/HorizontalSpinner.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/HorizontalSpinner.java new file mode 100644 index 0000000..521bb8d --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/HorizontalSpinner.java @@ -0,0 +1,1113 @@ +package com.minres.scviewer.database.ui.swt.internal; + +import java.text.DecimalFormatSymbols; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Image; +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.Menu; +import org.eclipse.swt.widgets.Text; + +/** + * Instances of this class are selectable user interface objects that allow the + * user to enter and modify numeric values. + *

+ *

+ *
Styles:
+ *
READ_ONLY, FLAT
+ *
Events:
+ *
Selection, Modify
+ *
+ *

+ */ +public class HorizontalSpinner extends Composite { + + private enum ALIGNMENT { + LEFT, RIGHT, BOTH + }; + + private final List modifyListeners = new ArrayList(); + + private Button leftButton; + private Button rightButton; + private Text text; + private int digits = 0; + private int increment = 1; + private int maximum = 0; + private int minimum = 255; + private int pageIncrement = 10; + private int storedValue = 0; + private ALIGNMENT alignment = ALIGNMENT.BOTH; + + private final char decimalFormatSeparator; + + /** + * Constructs a new instance of this class given its parent and a style + * value describing its behavior and appearance. + *

+ * The style value is either one of the style constants defined in class + * SWT which is applicable to instances of this class, or must + * be built by bitwise OR'ing together (that is, using the + * int "|" operator) two or more of those SWT + * style constants. The class description lists the style constants that are + * applicable to the class. Style bits are also inherited from superclasses. + *

+ * + * @param parent a composite control which will be the parent of the new + * instance (cannot be null) + * @param style the style of control to construct + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the parent is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the parent
  • + *
  • ERROR_INVALID_SUBCLASS - if this class is not an + * allowed subclass
  • + *
+ * + * @see SWT#READ_ONLY + * @see SWT#FLAT + */ + public HorizontalSpinner(final Composite parent, final int style) { + super(parent, style); + + if ((style & SWT.LEFT) == SWT.LEFT) { + alignment = ALIGNMENT.LEFT; + } + + if ((style & SWT.RIGHT) == SWT.RIGHT) { + alignment = ALIGNMENT.RIGHT; + } + + final GridLayout gd = new GridLayout(3, false); + gd.horizontalSpacing = gd.verticalSpacing = 0; + gd.marginWidth = gd.marginHeight = 0; + setLayout(gd); + + createContent(style); + addTextListeners(); + addButtonsListener(); + addModifyListeners(); + + decimalFormatSeparator = new DecimalFormatSymbols().getDecimalSeparator(); + } + + /** + * Create the content of the widget + * + * @param style style of the widget + */ + private void createContent(final int style) { + final boolean readOnly = (style & SWT.READ_ONLY) == SWT.READ_ONLY; + final boolean flat = (style & SWT.FLAT) == SWT.FLAT; + final int buttonStyle = SWT.ARROW | (flat ? SWT.FLAT : SWT.NONE); + + if (alignment == ALIGNMENT.BOTH) { + createMinusButton(buttonStyle); + createText(readOnly); + createPlusButton(buttonStyle); + } else if (alignment == ALIGNMENT.LEFT) { + createMinusButton(buttonStyle); + createPlusButton(buttonStyle); + createText(readOnly); + } else { + createText(readOnly); + createMinusButton(buttonStyle); + createPlusButton(buttonStyle); + } + } + + /** + * Create minus button + * + * @param buttonStyle button style + */ + private void createMinusButton(final int buttonStyle) { + leftButton = new Button(this, buttonStyle | SWT.LEFT); + leftButton.setFont(getFont()); + leftButton.setBackground(getBackground()); + leftButton.setCursor(getCursor()); + leftButton.setEnabled(getEnabled()); + leftButton.setFont(getFont()); + leftButton.setForeground(getForeground()); + leftButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false)); + } + + /** + * Create the text zone + * + * @param readOnly if true, the text is read only + */ + private void createText(final boolean readOnly) { + text = new Text(this, readOnly ? SWT.READ_ONLY : SWT.NONE); + final GridData gd = new GridData(GridData.FILL, GridData.CENTER, true, false); + gd.minimumWidth = 40; + text.setLayoutData(gd); + } + + /** + * Create plus button + * + * @param buttonStyle button style + */ + private void createPlusButton(final int buttonStyle) { + rightButton = new Button(this, buttonStyle | SWT.RIGHT); + rightButton.setFont(getFont()); + rightButton.setBackground(getBackground()); + rightButton.setCursor(getCursor()); + rightButton.setEnabled(getEnabled()); + rightButton.setFont(getFont()); + rightButton.setForeground(getForeground()); + rightButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false)); + } + + /** + * Add the text listeners + */ + private void addTextListeners() { + text.addListener(SWT.Verify, e -> { + if (e.character != 0 && !(Character.isDigit(e.character) || e.character == '-') && e.keyCode != SWT.BS && e.keyCode != SWT.DEL) { + e.doit = false; + return; + } + e.doit = verifyEntryAndStoreValue(e.text, e.keyCode); + }); + + text.addListener(SWT.KeyUp, e -> { + if (e.keyCode == SWT.ARROW_UP) { + increaseValue(increment); + } + if (e.keyCode == SWT.ARROW_DOWN) { + decreaseValue(increment); + } + if (e.keyCode == SWT.PAGE_UP) { + increaseValue(pageIncrement); + } + if (e.keyCode == SWT.PAGE_DOWN) { + decreaseValue(pageIncrement); + } + + }); + + text.addListener(SWT.FocusOut, e -> { + if (text.getText().trim().equals("")) { + setSelection(storedValue); + } + }); + } + + /** + * Verify the entry and store the value in the field storedValue + * + * @param entry entry to check + * @param keyCode code of the typed key + * @return true if the entry if correct, false + * otherwise + */ + private boolean verifyEntryAndStoreValue(final String entry, final int keyCode) { + + return true; + } + + /** + * Add the listener to the buttons + */ + private void addButtonsListener() { + leftButton.addListener(SWT.Selection, e -> { + decreaseValue(increment); + }); + + rightButton.addListener(SWT.Selection, e -> { + increaseValue(increment); + }); + + } + + /** + * Increase the value stored in this snippet + * + * @param value value to increase + */ + private void increaseValue(final int value) { + setSelection(getSelection() + value); + + } + + /** + * Decrease the value stored in this snippet + * + * @param value value to decrease + */ + private void decreaseValue(final int value) { + setSelection(getSelection() - value); + } + + /** + * Add the modify listeners + */ + private void addModifyListeners() { + text.addModifyListener(e -> { + for (final ModifyListener m : modifyListeners) { + m.modifyText(e); + } + }); + + } + + /** + * Adds the listener to the collection of listeners who will be notified + * when the receiver's text is modified, by sending it one of the messages + * defined in the ModifyListener interface. + * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see ModifyListener + * @see #removeModifyListener + * @see org.eclipse.swt.widgets.Spinner#addModifyListener(org.eclipse.swt.events.ModifyListener) + */ + + public void addModifyListener(final ModifyListener listener) { + checkWidget(); + modifyListeners.add(listener); + } + + /** + * Adds the listener to the collection of listeners who will be notified + * when the control is selected by the user, by sending it one of the + * messages defined in the SelectionListener interface. + *

+ * widgetSelected is not called for texts. + * widgetDefaultSelected is typically called when ENTER is + * pressed in a single-line text. + *

+ * + * @param listener the listener which should be notified when the control is + * selected by the user + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #removeSelectionListener + * @see SelectionEvent + */ + public void addSelectionListener(final SelectionListener listener) { + checkWidget(); + } + + /** + * Copies the selected text. + *

+ * The current selection is copied to the clipboard. + *

+ * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void copy() { + checkWidget(); + text.copy(); + } + + /** + * Cuts the selected text. + *

+ * The current selection is first copied to the clipboard and then deleted + * from the widget. + *

+ * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void cut() { + checkWidget(); + text.cut(); + } + + /** + * Returns the number of decimal places used by the receiver. + * + * @return the digits + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getDigits() { + checkWidget(); + return digits; + } + + /** + * Returns the amount that the receiver's value will be modified by when the + * up/down arrows are pressed. + * + * @return the increment + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getIncrement() { + checkWidget(); + return increment; + } + + /** + * Returns the maximum value which the receiver will allow. + * + * @return the maximum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getMaximum() { + checkWidget(); + return maximum; + } + + /** + * Returns the minimum value which the receiver will allow. + * + * @return the minimum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getMinimum() { + checkWidget(); + return minimum; + } + + /** + * Returns the amount that the receiver's position will be modified by when + * the page up/down keys are pressed. + * + * @return the page increment + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getPageIncrement() { + checkWidget(); + return pageIncrement; + } + + /** + * Returns the selection, which is the receiver's position. + * + * @return the selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getSelection() { + checkWidget(); + return storedValue; + } + + /** + * Returns a string containing a copy of the contents of the receiver's text + * field, or an empty string if there are no contents. + * + * @return the receiver's text + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + */ + public String getText() { + checkWidget(); + return text.getText(); + } + + /** + * Returns the maximum number of characters that the receiver's text field + * is capable of holding. If this has not been changed by + * setTextLimit(), it will be the constant + * Spinner.LIMIT. + * + * @return the text limit + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see #LIMIT + */ + public int getTextLimit() { + checkWidget(); + return text.getTextLimit(); + } + + /** + * Pastes text from clipboard. + *

+ * The selected text is deleted from the widget and new text inserted from + * the clipboard. + *

+ * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void paste() { + checkWidget(); + text.paste(); + } + + /** + * Removes the listener from the collection of listeners who will be + * notified when the receiver's text is modified. + * + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see ModifyListener + * @see #addModifyListener + */ + public void removeModifyListener(final ModifyListener listener) { + checkWidget(); + modifyListeners.remove(listener); + } + + /** + * Removes the listener from the collection of listeners who will be + * notified when the control is selected by the user. + * + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #addSelectionListener + */ + public void removeSelectionListener(final SelectionListener listener) { + checkWidget(); + } + + /** + * Sets the number of decimal places used by the receiver. + *

+ * The digit setting is used to allow for floating point values in the + * receiver. For example, to set the selection to a floating point value of + * 1.37 call setDigits() with a value of 2 and setSelection() with a value + * of 137. Similarly, if getDigits() has a value of 2 and getSelection() + * returns 137 this should be interpreted as 1.37. This applies to all + * numeric APIs. + *

+ * + * @param value the new digits (must be greater than or equal to zero) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the value is less than + * zero
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setDigits(final int value) { + checkWidget(); + digits = value; + convertSelectionToStringValue(); + } + + /** + * Sets the amount that the receiver's value will be modified by when the + * up/down arrows are pressed to the argument, which must be at least one. + * + * @param value the new increment (must be greater than zero) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setIncrement(final int value) { + checkWidget(); + increment = value; + } + + /** + * Sets the maximum value that the receiver will allow. This new value will + * be ignored if it is less than the receiver's current minimum value. If + * the new maximum is applied then the receiver's selection value will be + * adjusted if necessary to fall within its new range. + * + * @param value the new maximum, which must be greater than or equal to the + * current minimum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setMaximum(final int value) { + checkWidget(); + maximum = value; + } + + /** + * Sets the minimum value that the receiver will allow. This new value will + * be ignored if it is greater than the receiver's current maximum value. If + * the new minimum is applied then the receiver's selection value will be + * adjusted if necessary to fall within its new range. + * + * @param value the new minimum, which must be less than or equal to the + * current maximum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setMinimum(final int value) { + checkWidget(); + minimum = value; + } + + /** + * Sets the amount that the receiver's position will be modified by when the + * page up/down keys are pressed to the argument, which must be at least + * one. + * + * @param value the page increment (must be greater than zero) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setPageIncrement(final int value) { + checkWidget(); + pageIncrement = value; + } + + /** + * Sets the selection, which is the receiver's position, to the + * argument. If the argument is not within the range specified by minimum + * and maximum, it will be adjusted to fall within this range. + * + * @param value the new selection (must be zero or greater) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setSelection(int selection) { + checkWidget(); + if (selection < minimum) { + selection = minimum; + } else if (selection > maximum) { + selection = maximum; + } + + storedValue = selection; + text.setText(convertSelectionToStringValue()); + } + + /** + * Convert the selection into a string + * + * @return the string representation of the selection + */ + private String convertSelectionToStringValue() { + if (getDigits() == 0) { + return String.valueOf(storedValue); + } + final StringBuilder unformatted = new StringBuilder(String.valueOf(storedValue * Math.pow(10, -1 * getDigits()))); + for (int i = 0; i < digits; i++) { + unformatted.append("0"); + } + final int position = unformatted.indexOf("."); + final String temp = unformatted.substring(0, position + 1 + digits); + return temp.replace('.', decimalFormatSeparator); + + } + + /** + * Sets the maximum number of characters that the receiver's text field is + * capable of holding to be the argument. + *

+ * To reset this value to the default, use + * setTextLimit(Spinner.LIMIT). Specifying a limit value larger + * than Spinner.LIMIT sets the receiver's limit to + * Spinner.LIMIT. + *

+ * + * @param limit new text limit + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_CANNOT_BE_ZERO - if the limit is zero
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see #LIMIT + */ + public void setTextLimit(final int limit) { + checkWidget(); + text.setTextLimit(limit); + } + + /** + * Sets the receiver's selection, minimum value, maximum value, digits, + * increment and page increment all at once. + *

+ * Note: This is similar to setting the values individually using the + * appropriate methods, but may be implemented in a more efficient fashion + * on some platforms. + *

+ * + * @param selection the new selection value + * @param minimum the new minimum value + * @param maximum the new maximum value + * @param digits the new digits value + * @param increment the new increment value + * @param pageIncrement the new pageIncrement value + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setValues(final int selection, final int minimum, final int maximum, final int digits, final int increment, final int pageIncrement) { + setMinimum(minimum); + setMaximum(maximum); + setDigits(digits); + setIncrement(increment); + setPageIncrement(pageIncrement); + setSelection(selection); + } + + /** + * Sets the receiver's drag detect state. If the argument is + * true, the receiver will detect drag gestures, otherwise + * these gestures will be ignored. + * + * @param dragDetect the new drag detect state + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public boolean setFocus() { + checkWidget(); + return text.setFocus(); + } + + /** + * Forces the receiver to have the keyboard focus, causing all + * keyboard events to be delivered to it. + * + * @return true if the control got focus, and + * false if it was unable to. + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see #setFocus + */ + @Override + public boolean forceFocus() { + checkWidget(); + return text.forceFocus(); + } + + /** + * Sets the receiver's background color to the color specified by the + * argument, or to the default system color for the control if the argument + * is null. + *

+ * Note: This operation is a hint and may be overridden by the platform. For + * example, on Windows the background of a Button cannot be changed. + *

+ * + * @param color the new color (or null) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the argument has been + * disposed
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setBackground(final Color color) { + super.setBackground(color); + leftButton.setBackground(color); + rightButton.setBackground(color); + text.setBackground(color); + } + + /** + * Sets the receiver's background image to the image specified by the + * argument, or to the default system color for the control if the argument + * is null. The background image is tiled to fill the available space. + *

+ * Note: This operation is a hint and may be overridden by the platform. For + * example, on Windows the background of a Button cannot be changed. + *

+ * + * @param image the new image (or null) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the argument has been + * disposed
  • + *
  • ERROR_INVALID_ARGUMENT - if the argument is not a + * bitmap
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setBackgroundImage(final Image image) { + super.setBackgroundImage(image); + leftButton.setBackgroundImage(image); + rightButton.setBackgroundImage(image); + text.setBackgroundImage(image); + + } + + /** + * Sets the receiver's cursor to the cursor specified by the argument, or to + * the default cursor for that kind of control if the argument is null. + *

+ * When the mouse pointer passes over a control its appearance is changed to + * match the control's cursor. + *

+ * + * @param cursor the new cursor (or null) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the argument has been + * disposed
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setCursor(final Cursor cursor) { + super.setCursor(cursor); + leftButton.setCursor(cursor); + rightButton.setCursor(cursor); + text.setCursor(cursor); + } + + /** + * Enables the receiver if the argument is true, and disables + * it otherwise. A disabled control is typically not selectable from the + * user interface and draws with an inactive or "grayed" look. + * + * @param enabled the new enabled state + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setEnabled(final boolean enabled) { + super.setEnabled(enabled); + leftButton.setEnabled(enabled); + rightButton.setEnabled(enabled); + text.setEnabled(enabled); + } + + /** + * Sets the font that the receiver will use to paint textual information to + * the font specified by the argument, or to the default font for that kind + * of control if the argument is null. + * + * @param font the new font (or null) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the argument has been + * disposed
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setFont(final Font font) { + super.setFont(font); + text.setFont(font); + } + + /** + * Sets the receiver's foreground color to the color specified by the + * argument, or to the default system color for the control if the argument + * is null. + *

+ * Note: This operation is a hint and may be overridden by the platform. + *

+ * + * @param color the new color (or null) + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_INVALID_ARGUMENT - if the argument has been + * disposed
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setForeground(final Color color) { + super.setForeground(color); + leftButton.setForeground(color); + rightButton.setForeground(color); + text.setForeground(color); + } + + /** + * Sets the receiver's pop up menu to the argument. All controls may + * optionally have a pop up menu that is displayed when the user requests + * one for the control. The sequence of key strokes, button presses and/or + * button releases that are used to request a pop up menu is platform + * specific. + *

+ * Note: Disposing of a control that has a pop up menu will dispose of the + * menu. To avoid this behavior, set the menu to null before the control is + * disposed. + *

+ * + * @param menu the new pop up menu + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_MENU_NOT_POP_UP - the menu is not a pop up menu
  • + *
  • ERROR_INVALID_PARENT - if the menu is not in the same + * widget tree
  • + *
  • ERROR_INVALID_ARGUMENT - if the menu has been disposed + *
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setMenu(final Menu menu) { + super.setMenu(menu); + leftButton.setMenu(menu); + rightButton.setMenu(menu); + text.setMenu(menu); + } + + /** + * Sets the receiver's tool tip text to the argument, which may be null + * indicating that the default tool tip for the control will be shown. For a + * control that has a default tool tip, such as the Tree control on Windows, + * setting the tool tip text to an empty string replaces the default, + * causing no tool tip text to be shown. + *

+ * The mnemonic indicator (character '&') is not displayed in a tool + * tip. To display a single '&' in the tool tip, the character '&' + * can be escaped by doubling it in the string. + *

+ * + * @param string the new tool tip text (or null) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + @Override + public void setToolTipText(final String tooltipText) { + super.setToolTipText(tooltipText); + leftButton.setToolTipText(tooltipText); + rightButton.setToolTipText(tooltipText); + text.setToolTipText(tooltipText); + } + +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformSlider.java new file mode 100644 index 0000000..20c909a --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformSlider.java @@ -0,0 +1,95 @@ +package com.minres.scviewer.database.ui.swt.internal; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +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.Slider; +import org.eclipse.wb.swt.SWTResourceManager; + +public class WaveformSlider extends Composite { + + Slider slider; + + Color buttonColor; + + public WaveformSlider(Composite parent, int style) { + super(parent, style); + GridLayout gridLayout = new GridLayout(3, false); + gridLayout.horizontalSpacing = 0; + gridLayout.verticalSpacing = 0; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + setLayout(gridLayout); + + buttonColor = getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY); + + Button scrlLeft = new Button(this, /*SWT.BORDER |*/ SWT.FLAT | SWT.CENTER); + scrlLeft.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); + GridData gd_scrlLeft = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); + gd_scrlLeft.heightHint = 16; + gd_scrlLeft.widthHint = 16; + scrlLeft.setLayoutData(gd_scrlLeft); + scrlLeft.addPaintListener(paintEvent -> { + GC gc = paintEvent.gc; + gc.setBackground(buttonColor); + gc.setForeground(buttonColor); + int left = paintEvent.x+4; + int top = paintEvent.y+5; + int width=paintEvent.width-11; + int height= paintEvent.height-10; + int[] triangle = new int[] { + left, top+height/2, + left+width, top, + left+width, top+height}; + gc.fillPolygon( triangle ); + gc.drawPolygon( triangle ); + }); + scrlLeft.addSelectionListener(new SelectionAdapter() { + public void widgetSelected (SelectionEvent e){ + slider.setSelection(slider.getSelection()-10); + } + }); + scrlLeft.redraw(); + + slider = new Slider(this, SWT.NONE); + slider.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); + GridData gd_canvas = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); + gd_canvas.heightHint = 16; + slider.setLayoutData(gd_canvas); + + Button scrlRight = new Button(this, /*SWT.BORDER |*/ SWT.FLAT | SWT.CENTER); + scrlRight.setAlignment(SWT.CENTER); + GridData gd_scrlRight = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_scrlRight.heightHint = 16; + gd_scrlRight.widthHint = 16; + scrlRight.setLayoutData(gd_scrlRight); + scrlRight.addPaintListener(paintEvent -> { + GC gc = paintEvent.gc; + gc.setBackground(buttonColor); + gc.setForeground(buttonColor); + int left = paintEvent.x+6; + int top = paintEvent.y+5; + int width=paintEvent.width-11; + int height= paintEvent.height-10; + int[] triangle = new int[] { + left, top, + left+width, top+height/2, + left, top+height}; + gc.fillPolygon( triangle ); + gc.drawPolygon( triangle ); + }); + scrlRight.addSelectionListener(new SelectionAdapter() { + public void widgetSelected (SelectionEvent e){ + slider.setSelection(slider.getSelection()+10); + } + }); + redraw(); + } +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 5742af5..bbd9525 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -54,6 +54,7 @@ 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.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; @@ -61,6 +62,7 @@ import org.eclipse.swt.graphics.TextLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -69,6 +71,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ScrollBar; +import org.eclipse.swt.widgets.Slider; import org.eclipse.swt.widgets.Widget; import org.eclipse.wb.swt.SWTResourceManager; @@ -91,6 +94,7 @@ import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.database.ui.swt.sb.FlatScrollBar; public class WaveformView implements IWaveformView { @@ -330,8 +334,22 @@ public class WaveformView implements IWaveformView { rightSash.setBackground(SWTResourceManager.getColor(SWT.COLOR_GRAY)); Composite valuePane = new Composite(rightSash, SWT.NONE); - waveformCanvas = new WaveformCanvas(rightSash, SWT.NONE, styleProvider); - + + Composite waveformPane = new Composite(rightSash, SWT.NONE); + GridLayout gl_waveformPane = new GridLayout(1, false); + gl_waveformPane.verticalSpacing = 0; + gl_waveformPane.marginWidth = 0; + gl_waveformPane.marginHeight = 0; + waveformPane.setLayout(gl_waveformPane); + + waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider); + waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE); + GridData gd_timeSlider = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); + gd_timeSlider.heightHint = 18; + timeSliderPane.setLayoutData(gd_timeSlider); + // create the name pane createTextPane(namePane, "Name"); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java new file mode 100644 index 0000000..96445f1 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java @@ -0,0 +1,108 @@ +package com.minres.scviewer.database.ui.swt.internal; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.layout.GridData; +import org.eclipse.wb.swt.ResourceManager; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.widgets.Slider; +import org.eclipse.wb.swt.SWTResourceManager; +import org.eclipse.swt.widgets.Scale; +import org.eclipse.jface.fieldassist.ControlDecoration; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.FillLayout; + +public class ZoomingScrollbar extends Composite { + + /** + * Create the composite. + * @param parent + * @param style + */ + public ZoomingScrollbar(Composite parent, int style) { + super(parent, SWT.BORDER | SWT.NO_FOCUS); + GridLayout gridLayout = new GridLayout(3, false); + gridLayout.horizontalSpacing = 0; + gridLayout.verticalSpacing = 0; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + setLayout(gridLayout); + + Button scrlLeft = new Button(this, SWT.BORDER | SWT.FLAT | SWT.CENTER); + scrlLeft.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); + GridData gd_scrlLeft = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); + gd_scrlLeft.heightHint = 16; + gd_scrlLeft.widthHint = 16; + scrlLeft.setLayoutData(gd_scrlLeft); + + Slider slider = new Slider(this, SWT.NONE); + slider.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); + GridData gd_canvas = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); + gd_canvas.heightHint = 16; + slider.setLayoutData(gd_canvas); + + Button scrlRight = new Button(this, SWT.BORDER | SWT.FLAT | SWT.CENTER); + scrlRight.setAlignment(SWT.CENTER); + GridData gd_scrlRight = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_scrlRight.heightHint = 16; + gd_scrlRight.widthHint = 16; + scrlRight.setLayoutData(gd_scrlRight); + + SashForm sashForm = new SashForm(this, SWT.NONE); + sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); + + Composite composite = new Composite(sashForm, SWT.NONE); + composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_MAGENTA)); + composite.setLayout(null); + + Composite wavformPane = new Composite(sashForm, SWT.BORDER | SWT.NO_FOCUS); + wavformPane.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE)); + GridLayout gl_wavformPane = new GridLayout(1, false); + gl_wavformPane.verticalSpacing = 0; + gl_wavformPane.marginWidth = 0; + gl_wavformPane.marginHeight = 0; + wavformPane.setLayout(gl_wavformPane); + + Composite waveformCanvas = new Composite(wavformPane, SWT.NONE); + waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + + Composite timeSlider = new Composite(wavformPane, SWT.BORDER | SWT.NO_FOCUS); + GridLayout gl_timeSlider = new GridLayout(3, false); + gl_timeSlider.marginWidth = 0; + gl_timeSlider.verticalSpacing = 0; + gl_timeSlider.marginHeight = 0; + gl_timeSlider.horizontalSpacing = 0; + timeSlider.setLayout(gl_timeSlider); + GridData gd_timeSlider = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); + gd_timeSlider.heightHint = 16; + timeSlider.setLayoutData(gd_timeSlider); + + Button buttonLeft = new Button(timeSlider, SWT.BORDER | SWT.FLAT | SWT.CENTER); + buttonLeft.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); + GridData gd_buttonLeft = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); + gd_buttonLeft.widthHint = 10; + gd_buttonLeft.heightHint = 16; + buttonLeft.setLayoutData(gd_buttonLeft); + + Slider slider2 = new Slider(timeSlider, SWT.NONE); + slider2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1)); + + Button buttonRight = new Button(timeSlider, SWT.FLAT | SWT.CENTER); + buttonRight.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); + GridData gd_buttonRight = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); + gd_buttonRight.widthHint = 10; + gd_buttonRight.heightHint = 16; + buttonRight.setLayoutData(gd_buttonRight); + sashForm.setWeights(new int[] {1, 1}); + + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ActionScheduler.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ActionScheduler.java new file mode 100644 index 0000000..8207914 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ActionScheduler.java @@ -0,0 +1,18 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.widgets.Display; + +public class ActionScheduler { + + private final Display display; + private final Runnable action; + + public ActionScheduler( Display display, Runnable action ) { + this.display = display; + this.action = action; + } + + public void schedule( int delay ) { + display.timerExec( delay, action ); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ButtonClick.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ButtonClick.java new file mode 100644 index 0000000..fe217a5 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ButtonClick.java @@ -0,0 +1,45 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Control; + +public class ButtonClick { + + public static final int LEFT_BUTTON = 1; + + private boolean armed; + + public boolean isArmed() { + return armed; + } + + public void arm( MouseEvent event ) { + if( event.button == LEFT_BUTTON ) { + armed = true; + } + } + + public void disarm() { + armed = false; + } + + public void trigger( MouseEvent event, Runnable action ) { + try { + doTrigger( event, action ); + } finally { + disarm(); + } + } + + private void doTrigger( MouseEvent event, Runnable action ) { + if( armed && inRange( event ) ) { + action.run(); + } + } + + private static boolean inRange( MouseEvent event ) { + Point size = ( ( Control )event.widget ).getSize(); + return event.x >= 0 && event.x <= size.x && event.y >= 0 && event.y <= size.y; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ClickControl.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ClickControl.java new file mode 100644 index 0000000..959d20e --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ClickControl.java @@ -0,0 +1,98 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + + +class ClickControl extends ControlAdapter implements ViewComponent, MouseDownActionTimer.TimerAction, MouseListener, MouseTrackListener { + + private final MouseDownActionTimer mouseDownActionTimer; + private final ClickAction clickAction; + private final ButtonClick buttonClick; + private final Label control; + private final ImageUpdate imageUpdate; + + public interface ClickAction extends Runnable { + void setCoordinates( int x, int y ); + } + + ClickControl( Composite parent, ClickAction clickAction, int maxExtension ) { + this.control = new Label( parent, SWT.NONE ); + this.imageUpdate = new ImageUpdate( control, maxExtension ); + this.buttonClick = new ButtonClick(); + this.mouseDownActionTimer = new MouseDownActionTimer( this, buttonClick, control.getDisplay() ); + this.clickAction = clickAction; + this.control.addMouseTrackListener( this ); + this.control.addMouseListener( this ); + this.control.addControlListener( this ); + } + + @Override + public void controlResized( ControlEvent event ) { + imageUpdate.update(); + } + + @Override + public Label getControl() { + return control; + } + + @Override + public void mouseDown( MouseEvent event ) { + buttonClick.arm( event ); + clickAction.setCoordinates( event.x, event.y ); + mouseDownActionTimer.activate(); + } + + @Override + public void mouseUp( MouseEvent event ) { + buttonClick.trigger( event, clickAction ); + } + + @Override + public void run() { + clickAction.run(); + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public void mouseExit( MouseEvent event ) { + buttonClick.disarm(); + } + + void setForeground( Color color ) { + imageUpdate.setForeground( color ); + } + + Color getForeground() { + return imageUpdate.getForeground(); + } + + void setBackground( Color color ) { + imageUpdate.setBackground( color ); + } + + Color getBackground() { + return imageUpdate.getBackground(); + } + + @Override + public void mouseEnter( MouseEvent event ) {} + + @Override + public void mouseHover( MouseEvent event ) {} + + @Override + public void mouseDoubleClick( MouseEvent event ) {} +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ComponentDistribution.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ComponentDistribution.java new file mode 100644 index 0000000..0111ee1 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ComponentDistribution.java @@ -0,0 +1,105 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static java.lang.Math.max; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +class ComponentDistribution { + + private static final int MIN_DRAG_LENGTH = 17; + + final int upFastLength; + final int dragStart; + final int dragLength; + final int downFastStart; + final int downFastLength; + final int downStart; + final int buttonLen; + + ComponentDistribution( int buttonLen, int len, int range, int pos, int thumb ) { + int slideLen = slideLen( buttonLen, len ); + int relDragLen = relDragLen( slideLen, range, thumb ); + int minDragLength = max( MIN_DRAG_LENGTH, buttonLen ); + int interval = interval( range, relDragLen, minDragLength ); + this.dragLength = dragLen( minDragLength, relDragLen ); + this.upFastLength = upFastLen( minDragLength, interval, pos, slideLen, relDragLen, dragLength ); + this.downStart = downStart( buttonLen, len ); + this.downFastStart = downFastStart( buttonLen, upFastLength, dragLength ); + this.dragStart = dragStart( buttonLen, upFastLength ); + this.downFastLength = downFastLen( minDragLength, interval, pos, slideLen, relDragLen, dragLength, upFastLength ); + this.buttonLen = buttonLen; + } + + private static int slideLen( int buttonLen, int len ) { + return len - buttonLen * 2; + } + + private static int relDragLen( int slideLen, int range, int thumb ) { + return divide( slideLen * thumb, range ); + } + + private static int interval( int range, int relDragLen, int minDragLength ) { + int result = range; + if( useMinDragLen( minDragLength, relDragLen ) ) { + result += minDragLength - relDragLen / 2; + } + return result; + } + + private static int dragLen( int buttonLen, int relDragLen ) { + return max( relDragLen, buttonLen ); + } + + private static int upFastLen( int buttonLen, int range, int pos, int slideLen, int relDragLen, int dragLen ) { + int result = slideLen * pos / range; + if( useMinDragLen( buttonLen, relDragLen ) ) { + result -= divide( ( dragLen - relDragLen ) * pos, range ); + } + return result; + } + + private static int downStart( int buttonLen, int len ) { + return len - buttonLen; + } + + private static int downFastStart( int buttonLen, int upFastLength, int dragLength ) { + return buttonLen + upFastLength + dragLength; + } + + private static int dragStart( int buttonLen, int upFastLen ) { + return buttonLen + upFastLen; + } + + private static int downFastLen( + int buttonLen, int range, int pos, int slideLen, int relDragLen, int dragLen, int upFastLen ) + { + int result = divide( slideLen * ( range - pos ), range ) - dragLen; + if( useMinDragLen( buttonLen, relDragLen ) ) { + result += divide( ( dragLen - relDragLen ) * pos, range ); + } + return adjustDownFastLen( result, slideLen, dragLen, upFastLen ); + } + + private static boolean useMinDragLen( int buttonLen, int relDragLen ) { + return relDragLen < buttonLen; + } + + static int divide( int dividend, int divisor ) { + BigDecimal bigDividend = new BigDecimal( dividend ); + BigDecimal bigDivisor = new BigDecimal( divisor ); + return bigDividend .divide( bigDivisor, 0, RoundingMode.HALF_EVEN ) .intValue(); + } + + private static int adjustDownFastLen( int tentative, int slideLen, int dragLen, int upFastLen ) { + // TODO [fappel]: Without this there is a flickering of the downFast label of one pixel. + // Check whether this can be resolved by better rounding or whatsoever. + int result = tentative; + if( slideLen < upFastLen + dragLen + result ) { + result--; + } else if( slideLen > upFastLen + dragLen + result ) { + result++; + } + return result; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Decrementer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Decrementer.java new file mode 100644 index 0000000..5627882 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Decrementer.java @@ -0,0 +1,24 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; + +import com.minres.scviewer.database.ui.swt.sb.ClickControl.ClickAction; + +class Decrementer implements ClickAction { + + private final FlatScrollBar scrollBar; + + Decrementer( FlatScrollBar scrollBar ) { + this.scrollBar = scrollBar; + } + + @Override + public void run() { + int selection = scrollBar.getSelection() - scrollBar.getIncrement(); + scrollBar.setSelectionInternal( selection, SWT.ARROW_UP ); + } + + @Override + public void setCoordinates( int x, int y ) { + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Direction.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Direction.java new file mode 100644 index 0000000..f2678ae --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Direction.java @@ -0,0 +1,203 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static com.minres.scviewer.database.ui.swt.sb.FlatScrollBar.BAR_BREADTH; +import static java.lang.Math.max; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +enum Direction { + + HORIZONTAL( SWT.HORIZONTAL ) { + + @Override + protected void layout( FlatScrollBar scrollBar, int buttonLength ) { + ComponentDistribution distribution = calculateComponentDistribution( scrollBar, buttonLength ); + Rectangle[] componentBounds = calculateComponentBounds( distribution, scrollBar ); + applyComponentBounds( scrollBar, componentBounds ); + } + + private ComponentDistribution calculateComponentDistribution( FlatScrollBar scrollBar, int buttonLength ) { + return calculateComponentDistribution( scrollBar, buttonLength, getControlBounds( scrollBar ).width ); + } + + private Rectangle[] calculateComponentBounds( ComponentDistribution distribution, FlatScrollBar scrollBar ) { + int width = getControlBounds( scrollBar ).width; + int height = getControlBounds( scrollBar ).height - FlatScrollBar.BAR_BREADTH + 1; + int balance = getRoundingBalance( distribution, scrollBar ); + return new Rectangle[] { + calcButtons( distribution, width, $( 0, CLEARANCE, distribution.buttonLen, height ) ), + $( distribution.buttonLen, CLEARANCE, distribution.upFastLength, height ), + calcDrag( distribution, $( distribution.dragStart, CLEARANCE, distribution.dragLength + balance, height ) ), + $( distribution.downFastStart, CLEARANCE, distribution.downFastLength - balance, height ), + calcButtons( distribution, width, $( distribution.downStart, CLEARANCE, distribution.buttonLen, height ) ) + }; + } + + private Rectangle calcButtons( ComponentDistribution distribution, int length, Rectangle bounds ) { + Rectangle result = bounds; + if( length <= distribution.buttonLen* 2 ) { + int downStart = calcDownStartForSmallLength( bounds.x, length ); + result = $( downStart, CLEARANCE, length / 2, bounds.height ); + } + return result; + } + + @Override + protected void setDefaultSize( Control control ) { + Point size = control.getSize(); + control.setSize( size.x, FlatScrollBar.BAR_BREADTH ); + } + + @Override + protected Point computeSize( Composite composite, int wHint, int hHint, boolean changed ) { + int x = wHint == SWT.DEFAULT ? composite.getParent().getClientArea().width : wHint; + return new Point( x, FlatScrollBar.BAR_BREADTH ); + } + + @Override + protected void expand( Control control, int maxExpansion ) { + Rectangle bounds = control.getBounds(); + int expand = expand( bounds.height, maxExpansion ); + control.setBounds( bounds.x, bounds.y - expand, bounds.width, bounds.height + expand ); + } + }, + + VERTICAL( SWT.VERTICAL ) { + + @Override + protected void layout( FlatScrollBar scrollBar, int buttonLength ) { + ComponentDistribution calculation = calculateComponentDistribution( scrollBar, buttonLength ); + applyComponentBounds( scrollBar, calculateComponentBounds( calculation, scrollBar ) ); + } + + private ComponentDistribution calculateComponentDistribution( FlatScrollBar scrollBar, int buttonLength ) { + return calculateComponentDistribution( scrollBar, buttonLength, getControlBounds( scrollBar ).height ); + } + + private Rectangle[] calculateComponentBounds( ComponentDistribution distribution, FlatScrollBar scrollBar ) { + int width = getControlBounds( scrollBar ).width - FlatScrollBar.BAR_BREADTH + 1; + int height = getControlBounds( scrollBar ).height; + int balance = getRoundingBalance( distribution, scrollBar ); + return new Rectangle[] { + calculateButtons( distribution, height, $( CLEARANCE, 0, width, distribution.buttonLen ) ), + $( CLEARANCE, distribution.buttonLen, width, distribution.upFastLength ), + calcDrag( distribution, $( CLEARANCE, distribution.dragStart, width, distribution.dragLength + balance ) ), + $( CLEARANCE, distribution.downFastStart, width, distribution.downFastLength - balance ), + calculateButtons( distribution, height, $( CLEARANCE, distribution.downStart, width, distribution.buttonLen ) ) + }; + } + + private Rectangle calculateButtons( ComponentDistribution distribution, int length, Rectangle bounds ) { + Rectangle result = bounds; + if( length <= distribution.buttonLen * 2 ) { + int downStart = calcDownStartForSmallLength( bounds.y, length ); + result = $( CLEARANCE, downStart, bounds.width, length / 2 ); + } + return result; + } + + @Override + protected void setDefaultSize( Control control ) { + Point size = control.getSize(); + control.setSize( FlatScrollBar.BAR_BREADTH, size.y ); + } + + @Override + protected Point computeSize( Composite composite, int wHint, int hHint, boolean changed ) { + int y = hHint == SWT.DEFAULT ? composite.getParent().getClientArea().height : hHint; + return new Point( FlatScrollBar.BAR_BREADTH, y ); + } + + @Override + protected void expand( Control control, int maxExpansion ) { + Rectangle bounds = control.getBounds(); + int expand = expand( bounds.width, maxExpansion ); + control.setBounds( bounds.x - expand, bounds.y, bounds.width + expand, bounds.height ); + } + }; + + static final Rectangle EMPTY_RECTANGLE = $( 0, 0, 0, 0 ); + static final int CLEARANCE = BAR_BREADTH - 2; + + private final int value; + + protected abstract void layout( FlatScrollBar scrollBar, int buttonLength ); + protected abstract void setDefaultSize( Control control ); + protected abstract Point computeSize( Composite comp, int wHint, int hHint, boolean changed ); + protected abstract void expand( Control control, int maxExpansion ); + + Direction( int value ) { + this.value = value; + } + + public int value() { + return value; + } + + private static ComponentDistribution calculateComponentDistribution( + FlatScrollBar scrollBar , int buttonLength , int length ) + { + int range = scrollBar.getMaximum() - scrollBar.getMinimum(); + int position = scrollBar.getSelection() - scrollBar.getMinimum(); + int thumb = scrollBar.getThumb(); + return new ComponentDistribution( buttonLength, length, range, position, thumb ); + } + + private static Rectangle getControlBounds( FlatScrollBar scrollBar ) { + return scrollBar.getClientArea(); + } + + private static void applyComponentBounds( FlatScrollBar scrollBar, Rectangle[] bounds ) { + scrollBar.up.getControl().setBounds( bounds[ 0 ] ); + scrollBar.upFast.getControl().setBounds( bounds[ 1 ] ); + scrollBar.drag.getControl().setBounds( bounds[ 2 ] ); + scrollBar.downFast.getControl().setBounds( bounds[ 3 ] ); + scrollBar.down.getControl().setBounds( bounds[ 4 ] ); + } + + // TODO [fappel]: There is a 1 pixel rounding problem at the seam of drag/downFast with down. + // Seems to work but I would prefer a better solution if possible + private static int getRoundingBalance( ComponentDistribution calculation, FlatScrollBar scrollBar ) { + int result = 0; + int maximumSelection = scrollBar.getMaximum() - scrollBar.getThumb(); + if( scrollBar.getSelection() == maximumSelection && 0 != calculation.downFastLength ) { + result = 1; + } + return result; + } + + private static int expand( int toExpand, int maxExpansion ) { + return max( 0, FlatScrollBar.BAR_BREADTH + maxExpansion - max( FlatScrollBar.BAR_BREADTH, toExpand ) ); + } + + private static Rectangle calcDrag( ComponentDistribution distribution, Rectangle bounds ) { + Rectangle result = bounds; + if( isUndercutOfDragVisibility( distribution ) ) { + result = EMPTY_RECTANGLE; + } + return result; + } + + private static boolean isUndercutOfDragVisibility( ComponentDistribution distribution ) { + return distribution.dragLength + distribution.buttonLen >= distribution.downStart; + } + + private static int calcDownStartForSmallLength( int position, int length ) { + int result = position; + if( isDownStartPosition( position ) ) { + result = length / 2; + } + return result; + } + private static boolean isDownStartPosition( int position ) { + return position > 0 || position < 0; + } + + private static Rectangle $( int x, int y, int width, int height ) { + return new Rectangle( x, y , width , height ); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragControl.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragControl.java new file mode 100644 index 0000000..4ca38eb --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragControl.java @@ -0,0 +1,105 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.DragDetectEvent; +import org.eclipse.swt.events.DragDetectListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseMoveListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + + +class DragControl + extends ControlAdapter + implements ViewComponent, DragDetectListener, MouseListener, MouseMoveListener +{ + + private final DragDetector dragDetector; + private final ImageUpdate imageUpdate; + private final DragAction dragAction; + private final Label control; + + private Point startingPosition; + + public interface DragAction { + void start(); + void run( int startX, int startY, int currentX, int currentY ); + void end(); + } + + DragControl( Composite parent, DragAction dragAction, int maxExpansion ) { + this.control = new Label( parent, SWT.NONE ); + this.imageUpdate = new ImageUpdate( control, maxExpansion ); + this.dragDetector = new DragDetector( control, 0 ); + this.dragAction = dragAction; + initializeControl(); + } + + @Override + public Label getControl() { + return control; + } + + @Override + public void dragDetected( DragDetectEvent event ) { + if( startingPosition != null ) { + dragAction.run( startingPosition.x, startingPosition.y, event.x, event.y ); + } + dragDetector.dragHandled(); + } + + @Override + public void mouseDown( MouseEvent event ) { + startingPosition = new Point( event.x, event.y ); + dragAction.start(); + } + + @Override + public void mouseUp( MouseEvent event ) { + if( startingPosition != null ) { + dragAction.end(); + } + startingPosition = null; + } + + @Override + public void mouseMove( MouseEvent event ) { + dragDetector.mouseMove( event ); + } + + @Override + public void controlResized( ControlEvent event ) { + imageUpdate.update(); + } + + void setForeground( Color color ) { + imageUpdate.setForeground( color ); + } + + Color getForeground() { + return imageUpdate.getForeground(); + } + + Color getBackground() { + return imageUpdate.getBackground(); + } + + void setBackground( Color color ) { + imageUpdate.setBackground( color ); + } + + private void initializeControl( ) { + control.addMouseListener( this ); + control.addMouseMoveListener( this ); + control.addControlListener( this ); + control.addDragDetectListener( this ); + } + + @Override + public void mouseDoubleClick( MouseEvent event ) {} +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragDetector.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragDetector.java new file mode 100644 index 0000000..b3e33a6 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragDetector.java @@ -0,0 +1,60 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; + +// TODO [fappel]: This is a workaround for a problem described here: +// http://stackoverflow.com/questions/3908290/mousedown-events-are-not-delivered-until-mouseup-when-a-drag-source-is-present +// This seems to be related to https://bugs.eclipse.org/bugs/show_bug.cgi?id=328396 +// which is resolved. As it did not work on my setup I adapted the workaround of the last +// stackoverflow answer. + +public class DragDetector { + + int lastMouseX; + int lastMouseY; + boolean dragEventGenerated; + + private final Control control; + private final int sensibility; + + public DragDetector( Control control, int sensibility ) { + this.control = control; + this.sensibility = sensibility; + this.control.setDragDetect( false ); + } + + public void mouseMove( MouseEvent e ) { + if( ( e.stateMask & SWT.BUTTON1 ) > 0 ) { + int deltaX = lastMouseX - e.x; + int deltaY = lastMouseY - e.y; + int dragDistance = deltaX * deltaX + deltaY * deltaY; + if( !dragEventGenerated && dragDistance > sensibility ) { + dragEventGenerated = true; + Event event = createDragEvent( e ); + control.notifyListeners( SWT.DragDetect, event ); + } + lastMouseX = e.x; + lastMouseY = e.y; + } + } + + public void dragHandled() { + dragEventGenerated = false; + } + + private Event createDragEvent( MouseEvent e ) { + Event event = new Event(); + event.type = SWT.DragDetect; + event.display = control.getDisplay(); + event.widget = control; + event.button = e.button; + event.stateMask = e.stateMask; + event.time = e.time; + event.x = e.x; + event.y = e.y; + return event; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragShifter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragShifter.java new file mode 100644 index 0000000..289223d --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/DragShifter.java @@ -0,0 +1,59 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static com.minres.scviewer.database.ui.swt.sb.Direction.HORIZONTAL; +import static com.minres.scviewer.database.ui.swt.sb.ShiftData.calculateSelectionRange; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; + +import com.minres.scviewer.database.ui.swt.sb.DragControl.DragAction; + +final class DragShifter implements DragAction { + + private final FlatScrollBar scrollBar; + private final int buttonLength; + + public DragShifter( FlatScrollBar scrollBar, int buttonLength ) { + this.scrollBar = scrollBar; + this.buttonLength = buttonLength; + } + + @Override + public void start() { + scrollBar.notifyListeners( SWT.DRAG ); + } + + @Override + public void run( int startX, int startY, int currentX, int currentY ) { + ShiftData shiftData = newShiftData( startX, startY, currentX, currentY ); + if( shiftData.canShift() ) { + int selectionRange = calculateSelectionRange( scrollBar ); + int selectionDelta = shiftData.calculateSelectionDelta( selectionRange ); + int selection = scrollBar.getSelection() + selectionDelta; + scrollBar.setSelectionInternal( selection, SWT.DRAG ); + } + } + + @Override + public void end() { + scrollBar.notifyListeners( SWT.NONE ); + } + + private ShiftData newShiftData( int startX, int startY, int currentX, int currentY ) { + ShiftData result; + if( scrollBar.direction == HORIZONTAL ) { + result = new ShiftData( buttonLength, getScrollBarSize().x, getDragSize().x, currentX - startX ); + } else { + result = new ShiftData( buttonLength, getScrollBarSize().y, getDragSize().y, currentY - startY ); + } + return result; + } + + private Point getScrollBarSize() { + return scrollBar.getSize(); + } + + private Point getDragSize() { + return scrollBar.drag.getControl().getSize(); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastDecrementer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastDecrementer.java new file mode 100644 index 0000000..744f522 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastDecrementer.java @@ -0,0 +1,49 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; + +import com.minres.scviewer.database.ui.swt.sb.ClickControl.ClickAction; + +class FastDecrementer implements ClickAction { + + private final FlatScrollBar scrollBar; + + private int x; + private int y; + + FastDecrementer( FlatScrollBar scrollBar ) { + this.scrollBar = scrollBar; + } + + @Override + public void run() { + Rectangle drag = getDragBounds(); + Point mouse = getMouseLocation(); + if( mouse.x <= drag.x || mouse.y <= drag.y ) { + int selection = scrollBar.getSelection() - scrollBar.getPageIncrement(); + scrollBar.setSelectionInternal( selection, SWT.PAGE_UP ); + } + } + + @Override + public void setCoordinates( int x, int y ) { + this.x = x; + this.y = y; + } + + private Point getMouseLocation() { + return getDisplay().map( scrollBar.upFast.getControl(), null, x, y ); + } + + private Rectangle getDragBounds() { + Rectangle dragBounds = scrollBar.drag.getControl().getBounds(); + return getDisplay().map( scrollBar, null, dragBounds ); + } + + private Display getDisplay() { + return scrollBar.getDisplay(); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastIncrementer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastIncrementer.java new file mode 100644 index 0000000..5ce4181 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FastIncrementer.java @@ -0,0 +1,42 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; + +import com.minres.scviewer.database.ui.swt.sb.ClickControl.ClickAction; + +class FastIncrementer implements ClickAction { + + private final FlatScrollBar scrollBar; + + private Point mouse; + + FastIncrementer( FlatScrollBar scrollBar ) { + this.scrollBar = scrollBar; + } + + @Override + public void run() { + Rectangle drag = getDragBounds(); + if( mouse.x > drag.x + drag.width || mouse.y > drag.y + drag.height ) { + int selection = scrollBar.getSelection() + scrollBar.getPageIncrement(); + scrollBar.setSelectionInternal( selection, SWT.PAGE_DOWN ); + } + } + + @Override + public void setCoordinates( int x, int y ) { + mouse = getMouseLocation( x, y ); + } + + private Point getMouseLocation(int x, int y) { + return Display.getCurrent().map( scrollBar.downFast.getControl(), null, x, y ); + } + + private Rectangle getDragBounds() { + Rectangle dragBounds = scrollBar.drag.getControl().getBounds(); + return Display.getCurrent().map( scrollBar, null, dragBounds ); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBar.java new file mode 100644 index 0000000..802d86a --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBar.java @@ -0,0 +1,295 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static com.minres.scviewer.database.ui.swt.sb.UntypedSelectionAdapter.lookup; + +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Layout; +import org.eclipse.swt.widgets.Listener; + +public class FlatScrollBar extends Composite { + + public static final int BAR_BREADTH = 6; + + static final int DEFAULT_MINIMUM = 0; + static final int DEFAULT_MAXIMUM = 100; + static final int DEFAULT_INCREMENT = 1; + static final int DEFAULT_THUMB = 10; + static final int DEFAULT_PAGE_INCREMENT = DEFAULT_THUMB; + static final int DEFAULT_SELECTION = 0; + static final int DEFAULT_BUTTON_LENGTH = 0; + static final int DEFAULT_MAX_EXPANSION = Direction.CLEARANCE + 2; + + final ClickControl up; + final ClickControl upFast; + final DragControl drag; + final ClickControl downFast; + final ClickControl down; + final Direction direction; + final MouseWheelShifter mouseWheelHandler; + final Collection listeners; + + private int minimum; + private int maximum; + private int increment; + private int pageIncrement; + private int thumb; + private int selection; + private boolean onDrag; + private int buttonLength; + + public FlatScrollBar( final Composite parent, int style ) { + this( parent, style, DEFAULT_BUTTON_LENGTH, DEFAULT_MAX_EXPANSION ); + } + + FlatScrollBar( Composite parent, int style, int buttonLength, int maxExpansion ) { + super( parent, SWT.NONE ); + super.setLayout( new FlatScrollBarLayout( getDirection( style ) ) ); + this.minimum = DEFAULT_MINIMUM; + this.maximum = DEFAULT_MAXIMUM; + this.increment = DEFAULT_INCREMENT; + this.pageIncrement = DEFAULT_PAGE_INCREMENT; + this.thumb = DEFAULT_THUMB; + this.selection = DEFAULT_SELECTION; + this.buttonLength = buttonLength; + this.direction = getDirection( style ); + this.direction.setDefaultSize( this ); + this.up = new ClickControl( this, new Decrementer( this ), maxExpansion ); + this.upFast = new ClickControl( this, new FastDecrementer( this ), maxExpansion ); + this.drag = new DragControl( this, new DragShifter( this, buttonLength ), maxExpansion ); + this.downFast = new ClickControl( this, new FastIncrementer( this ), maxExpansion ); + this.down = new ClickControl( this, new Incrementer( this ), maxExpansion ); + this.mouseWheelHandler = new MouseWheelShifter( this, parent, buttonLength ); + this.listeners = new HashSet(); + addMouseTrackListener( new MouseTracker( this, maxExpansion ) ); + addControlListener( new ResizeObserver( this ) ); + setDefaultColorScheme(); + } + + @Override + public void setLayout( Layout layout ) { + throw new UnsupportedOperationException( FlatScrollBar.class.getName() + " does not allow to change layout." ); + }; + + @Override + public int getStyle() { + return direction != null ? super.getStyle() | direction.value() : super.getStyle(); + }; + + Direction getDirection() { + return direction; + } + + public void setMinimum( int minimum ) { + if( this.minimum != minimum && minimum >= 0 && minimum < maximum ) { + this.minimum = minimum; + adjustThumb(); + adjustSelection(); + layout(); + } + } + + public int getMinimum() { + return minimum; + } + + public void setMaximum( int maximum ) { + if( this.maximum != maximum && maximum >= 0 && maximum > minimum ) { + this.maximum = maximum; + adjustThumb(); + adjustSelection(); + layout(); + } + } + + public int getMaximum() { + return maximum; + } + + public void setThumb( int thumb ) { + if( this.thumb != thumb && thumb >= 1 ) { + this.thumb = thumb; + adjustThumb(); + adjustSelection(); + layout(); + } + } + + public int getThumb() { + return thumb; + } + + public void setIncrement( int increment ) { + if( this.increment != increment ) { + this.increment = increment; + layout(); + } + } + + public int getIncrement() { + return increment; + } + + public void setPageIncrement( int pageIncrement ) { + this.pageIncrement = pageIncrement; + } + + public int getPageIncrement() { + return pageIncrement; + } + + public void setSelection( int selection ) { + if( !onDrag ) { + updateSelection( selection ); + } + } + + public int getSelection() { + return selection; + } + + public void addSelectionListener( SelectionListener selectionListener ) { + listeners.add( selectionListener ); + } + + public void removeSelectionListener( SelectionListener selectionListener ) { + listeners.remove( selectionListener ); + } + + @Override + public void addListener( int eventType, final Listener listener ) { + if( eventType == SWT.Selection ) { + addSelectionListener( new UntypedSelectionAdapter( listener ) ); + } else { + super.addListener( eventType, listener ); + } + } + + @Override + public void removeListener( int eventType, Listener listener ) { + if( eventType == SWT.Selection ) { + removeSelectionListener( lookup( listeners, listener ) ); + } else { + super.removeListener( eventType, listener ); + } + } + + @Override + public void layout() { + direction.layout( this, buttonLength ); + update(); + } + + public void setIncrementButtonLength( int length ) { + this.buttonLength = length; + layout(); + } + + public int getIncrementButtonLength() { + return buttonLength; + } + + public void setIncrementColor( Color color ) { + up.setForeground( color ); + down.setForeground( color ); + } + + public Color getIncrementColor() { + return up.getForeground(); + } + + public void setPageIncrementColor( Color color ) { + upFast.setForeground( color ); + downFast.setForeground( color ); + } + + public Color getPageIncrementColor() { + return upFast.getForeground(); + } + + public void setThumbColor( Color color ) { + drag.setForeground( color ); + } + + public Color getThumbColor() { + return drag.getForeground(); + } + + @Override + public void setBackground( Color color ) { + up.setBackground( color ); + upFast.setBackground( color ); + drag.setBackground( color ); + downFast.setBackground( color ); + down.setBackground( color ); + super.setBackground( color ); + } + + protected void setSelectionInternal( int selection, int detail ) { + int oldSelection = this.selection; + updateSelection( selection ); + if( oldSelection != this.selection ) { + notifyListeners( detail ); + } + } + + private void updateSelection( int selection ) { + if( this.selection != selection ) { + this.selection = selection; + adjustSelection(); + layout(); + } + } + + public void notifyListeners( int detail ) { + updateOnDrag( detail ); + SelectionEvent selectionEvent = createEvent( detail ); + for( SelectionListener listener : listeners ) { + listener.widgetSelected( selectionEvent ); + } + } + + private void updateOnDrag( int detail ) { + onDrag = ( onDrag || ( SWT.DRAG & detail ) > 0 ) && ( SWT.NONE != detail ); + } + + private SelectionEvent createEvent( int detail ) { + Event event = new Event(); + event.widget = this; + event.detail = detail; + return new SelectionEvent( event ); + } + + private void adjustThumb() { + if( thumb > maximum - minimum ) { + thumb = Math.min( maximum - minimum, thumb ); + thumb = Math.max( 1, thumb ); + } + } + + private void adjustSelection() { + selection = Math.min( selection, maximum - thumb ); + selection = Math.max( selection, minimum ); + } + + private static Direction getDirection( int style ) { + return ( style & SWT.HORIZONTAL ) > 0 ? Direction.HORIZONTAL : Direction.VERTICAL; + } + + private void setDefaultColorScheme() { + up.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) ); + upFast.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) ); + drag.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_FOREGROUND ) ); + downFast.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) ); + down.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) ); + setBackground( getBackground() ); + } +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBarLayout.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBarLayout.java new file mode 100644 index 0000000..b8106bb --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/FlatScrollBarLayout.java @@ -0,0 +1,23 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Layout; + +class FlatScrollBarLayout extends Layout { + + private final Direction direction; + + public FlatScrollBarLayout( Direction orientation ) { + this.direction = orientation; + } + + @Override + protected void layout( Composite composite, boolean flushCache ) { + } + + @Override + protected Point computeSize( Composite composite, int wHint, int hHint, boolean flushCache ) { + return direction.computeSize( composite, wHint, hHint, flushCache ); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageDrawer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageDrawer.java new file mode 100644 index 0000000..8fb7495 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageDrawer.java @@ -0,0 +1,109 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static java.lang.Math.min; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; + +class ImageDrawer { + + static final String IMAGE_DRAWER_IS_DISPOSED = "ImageDrawer is disposed."; + + private final int maxExpansion; + + private Color background; + private Color foreground; + + ImageDrawer( int expansion ) { + this( expansion, getSystemColor( SWT.COLOR_WIDGET_DARK_SHADOW ), getSystemColor( SWT.COLOR_LIST_BACKGROUND ) ); + } + + ImageDrawer( int expansion, Color background, Color foreground ) { + this.maxExpansion = expansion; + this.foreground = defensiveCopy( background ); + this.background = defensiveCopy( foreground ); + } + + void setForeground( Color foreground ) { + checkDisposed(); + if( foreground != null ) { + this.foreground = prepareColorAttribute( this.foreground, foreground ); + } + } + + Color getForeground() { + checkDisposed(); + return foreground; + } + + void setBackground( Color background ) { + checkDisposed(); + if( background != null ) { + this.background = prepareColorAttribute( this.background, background ); + } + } + + Color getBackground() { + checkDisposed(); + return background; + } + + Image draw( int width, int height ) { + checkDisposed(); + Image result = new Image( getDisplay(), width, height ); + GC gc = new GC( result ); + try { + draw( gc, width, height ); + } finally { + gc.dispose(); + } + return result; + } + + boolean isDisposed() { + return background.isDisposed(); + } + + void dispose() { + if( !isDisposed() ) { + this.background.dispose(); + this.foreground.dispose(); + } + } + + private void draw( GC gc, int width, int height ) { + gc.setBackground( background ); + gc.fillRectangle( 0, 0, width, height ); + gc.setBackground( foreground ); + gc.setAdvanced( true ); + gc.setAntialias( SWT.ON ); + int arc = min( width, height ) == 1 ? 1 : maxExpansion + 2; + gc.fillRoundRectangle( 0, 0, width, height, arc, arc ); + } + + private void checkDisposed() { + if( isDisposed() ) { + throw new IllegalStateException( IMAGE_DRAWER_IS_DISPOSED ); + } + } + + private static Color getSystemColor( int colorCode ) { + return getDisplay().getSystemColor( colorCode ); + } + + private static Color prepareColorAttribute( Color oldColor, Color newColor ) { + oldColor.dispose(); + return defensiveCopy( newColor ); + } + + private static Color defensiveCopy( Color background ) { + return new Color( getDisplay(), background.getRGB() ); + } + + private static Display getDisplay() { + return Display.getCurrent(); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageUpdate.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageUpdate.java new file mode 100644 index 0000000..73719a9 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ImageUpdate.java @@ -0,0 +1,46 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Label; + +class ImageUpdate { + + private final ImageDrawer imageDrawer; + private final Label control; + + ImageUpdate( Label control, int maxExpansion ) { + this.imageDrawer = new ImageDrawer( maxExpansion ); + this.control = control; + this.control.addListener( SWT.Dispose, evt -> imageDrawer.dispose() ); + } + + void setForeground( Color color ) { + imageDrawer.setForeground( color ); + } + + Color getForeground() { + return imageDrawer.getForeground(); + } + + void setBackground( Color color ) { + imageDrawer.setBackground( color ); + } + + Color getBackground() { + return imageDrawer.getBackground(); + } + + void update() { + if( !control.isDisposed() ) { + if( control.getImage() != null ) { + control.getImage().dispose(); + } + Point size = control.getSize(); + if( size.x > 0 && size.y > 0 ) { + control.setImage( imageDrawer.draw( size.x, size.y ) ); + } + } + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Incrementer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Incrementer.java new file mode 100644 index 0000000..351e058 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/Incrementer.java @@ -0,0 +1,24 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.SWT; + +import com.minres.scviewer.database.ui.swt.sb.ClickControl.ClickAction; + +class Incrementer implements ClickAction { + + private final FlatScrollBar scrollBar; + + Incrementer( FlatScrollBar scrollBar ) { + this.scrollBar = scrollBar; + } + + @Override + public void run() { + int selection = scrollBar.getSelection() + scrollBar.getIncrement(); + scrollBar.setSelectionInternal( selection, SWT.ARROW_DOWN ); + } + + @Override + public void setCoordinates( int x, int y ) { + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseDownActionTimer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseDownActionTimer.java new file mode 100644 index 0000000..1de6295 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseDownActionTimer.java @@ -0,0 +1,37 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.widgets.Display; + +public class MouseDownActionTimer implements Runnable { + + public static final int INITIAL_DELAY = 300; + public static final int FAST_DELAY = 50; + + private final ActionScheduler scheduler; + private final TimerAction timerAction; + private final ButtonClick mouseClick; + + public interface TimerAction extends Runnable { + boolean isEnabled(); + } + + public MouseDownActionTimer( TimerAction timerAction, ButtonClick mouseClick, Display display ) { + this.scheduler = new ActionScheduler( display, this ); + this.timerAction = timerAction; + this.mouseClick = mouseClick; + } + + public void activate() { + if( timerAction.isEnabled() ) { + scheduler.schedule( INITIAL_DELAY ); + } + } + + @Override + public void run() { + if( mouseClick.isArmed() && timerAction.isEnabled() ) { + timerAction.run(); + scheduler.schedule( FAST_DELAY ); + } + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseTracker.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseTracker.java new file mode 100644 index 0000000..f36e825 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseTracker.java @@ -0,0 +1,66 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseTrackAdapter; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; + +class MouseTracker extends MouseTrackAdapter implements Runnable, DisposeListener { + + static final int DELAY = 500; + + private final FlatScrollBar scrollBar; + private final int maxExpansion; + + private Rectangle expandedBounds; + private Rectangle originBounds; + private boolean mouseOver; + private boolean disposed; + + MouseTracker( FlatScrollBar scrollBar, int maxExpansion ) { + this.scrollBar = scrollBar; + this.maxExpansion = maxExpansion; + this.scrollBar.addDisposeListener( this ); + this.scrollBar.up.getControl().addMouseTrackListener( this ); + this.scrollBar.upFast.getControl().addMouseTrackListener( this ); + this.scrollBar.drag.getControl().addMouseTrackListener( this ); + this.scrollBar.downFast.getControl().addMouseTrackListener( this ); + this.scrollBar.down.getControl().addMouseTrackListener( this ); + } + + @Override + public void mouseEnter( MouseEvent event ) { + mouseOver = true; + if( !disposed && originBounds == null ) { + originBounds = scrollBar.getBounds(); + scrollBar.getDirection().expand( scrollBar, maxExpansion ); + expandedBounds = scrollBar.getBounds(); + } + } + + @Override + public void mouseExit( MouseEvent event ) { + mouseOver = false; + if( !disposed ) { + Display.getCurrent().timerExec( DELAY, this ); + } + } + + @Override + public void run() { + if( !disposed && !mouseOver ) { + if( scrollBar.getBounds().equals( expandedBounds ) ) { + scrollBar.setBounds( originBounds ); + } + originBounds = null; + expandedBounds = null; + } + } + + @Override + public void widgetDisposed( DisposeEvent e ) { + disposed = true; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseWheelShifter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseWheelShifter.java new file mode 100644 index 0000000..4baa1be --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/MouseWheelShifter.java @@ -0,0 +1,69 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static com.minres.scviewer.database.ui.swt.sb.Direction.HORIZONTAL; +import static com.minres.scviewer.database.ui.swt.sb.ShiftData.calculateSelectionRange; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; + +public class MouseWheelShifter implements Listener, DisposeListener { + + private final FlatScrollBar scrollBar; + private final Composite parent; + private final int buttonLength; + + MouseWheelShifter( FlatScrollBar scrollBar, Composite parent, int buttonLength ) { + this.scrollBar = scrollBar; + this.parent = parent; + this.buttonLength = buttonLength; + parent.addListener( getListenerType(), this ); + scrollBar.addDisposeListener( this ); + } + + @Override + public void handleEvent( Event event ) { + handleMouseWheelScroll( event ); + } + + @Override + public void widgetDisposed( DisposeEvent e ) { + parent.removeListener( getListenerType(), this ); + } + + private void handleMouseWheelScroll( Event event ) { + ShiftData shiftData = newShiftData( event.count ); + if( shiftData.canShift() ) { + int selectionRange = calculateSelectionRange( scrollBar ); + int selectionDelta = shiftData.calculateSelectionDelta( selectionRange ); + int selection = scrollBar.getSelection() - selectionDelta; + scrollBar.setSelectionInternal( selection, scrollBar.direction.value() ); + } + } + + private ShiftData newShiftData( int delta ) { + ShiftData result; + if( scrollBar.direction == Direction.HORIZONTAL ) { + result = new ShiftData( buttonLength, getScrollBarSize().x, getDragSize().x, delta ); + } else { + result = new ShiftData( buttonLength, getScrollBarSize().y, getDragSize().y, delta ); + } + return result; + } + + private Point getScrollBarSize() { + return scrollBar.getSize(); + } + + private Point getDragSize() { + return scrollBar.drag.getControl().getSize(); + } + + private int getListenerType() { + return scrollBar.direction == HORIZONTAL ? SWT.MouseHorizontalWheel: SWT.MouseVerticalWheel; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ResizeObserver.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ResizeObserver.java new file mode 100644 index 0000000..20cb2b3 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ResizeObserver.java @@ -0,0 +1,19 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; + +class ResizeObserver extends ControlAdapter { + + private final FlatScrollBar flatScrollBar; + + public ResizeObserver( FlatScrollBar flatScrollBar ) { + this.flatScrollBar = flatScrollBar; + } + + @Override + public void controlResized( ControlEvent event ) { + flatScrollBar.layout(); + flatScrollBar.moveAbove( null ); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ShiftData.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ShiftData.java new file mode 100644 index 0000000..0bdeccd --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ShiftData.java @@ -0,0 +1,32 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import static com.minres.scviewer.database.ui.swt.sb.ComponentDistribution.divide; + +class ShiftData { + + private final int slidePixels; + private final int movedPixels; + private final int buttonLength; + + ShiftData( int buttonLength, int scrollBarPixels, int dragPixels, int movedPixels ) { + this.buttonLength = buttonLength; + this.slidePixels = calculateSlidePixels( scrollBarPixels, dragPixels ); + this.movedPixels = movedPixels; + } + + boolean canShift( ) { + return slidePixels > 0; + } + + int calculateSelectionDelta( int selectionRange ) { + return divide( movedPixels * selectionRange, slidePixels ); + } + + static int calculateSelectionRange( FlatScrollBar scrollBar ) { + return scrollBar.getMaximum() - scrollBar.getMinimum() - scrollBar.getThumb(); + } + + private int calculateSlidePixels( int scrollBarPixels, int dragPixels ) { + return scrollBarPixels - 2 * buttonLength - dragPixels; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/UntypedSelectionAdapter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/UntypedSelectionAdapter.java new file mode 100644 index 0000000..d5fffd8 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/UntypedSelectionAdapter.java @@ -0,0 +1,43 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import java.util.Collection; + +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; + +class UntypedSelectionAdapter extends SelectionAdapter { + + final Listener listener; + + UntypedSelectionAdapter( Listener listener ) { + this.listener = listener; + } + + @Override + public void widgetSelected( SelectionEvent selectionEvent ) { + Event event = new Event(); + event.widget = selectionEvent.widget; + event.detail = selectionEvent.detail; + listener.handleEvent( event ); + } + + static SelectionListener lookup( Collection listeners, Listener untypedListener ) { + for( SelectionListener listener : listeners ) { + if( isAdapterType( listener ) && matches( untypedListener, listener ) ) { + return listener; + } + } + return null; + } + + private static boolean isAdapterType( SelectionListener listener ) { + return listener instanceof UntypedSelectionAdapter; + } + + private static boolean matches( Listener untypedListener, SelectionListener listener ) { + return ( ( UntypedSelectionAdapter )listener ).listener == untypedListener; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ViewComponent.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ViewComponent.java new file mode 100644 index 0000000..af1779c --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/sb/ViewComponent.java @@ -0,0 +1,7 @@ +package com.minres.scviewer.database.ui.swt.sb; + +import org.eclipse.swt.widgets.Control; + +public interface ViewComponent { + Control getControl(); +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/ResourceManager.java b/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/ResourceManager.java new file mode 100644 index 0000000..8e96dfe --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/ResourceManager.java @@ -0,0 +1,438 @@ +/******************************************************************************* + * Copyright (c) 2011 Google, Inc. and others + * 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: + * Google, Inc. - initial API and implementation + * Wim Jongman - 1.8 and higher compliance + *******************************************************************************/ +package org.eclipse.wb.swt; + +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.resource.CompositeImageDescriptor; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.ImageDataProvider; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.osgi.framework.Bundle; + +/** + * Utility class for managing OS resources associated with SWT/JFace controls + * such as colors, fonts, images, etc. + * + * This class is created automatically when you fiddle around with images and + * colors in WB. You might want to prevent your application from using this + * class and provide your own more effective means of resource caching. + * + * Even though this class can be used to manage these resources, if they are + * here for the duration of the application and not used then you still have an + * effective resource leak. + * + * Application code must explicitly invoke the dispose() method to + * release the operating system resources managed by cached objects when those + * objects and OS resources are no longer needed. + * + * This class may be freely distributed as part of any application or plugin. + *

+ * + * @author scheglov_ke + * @author Dan Rubel + * @author Wim Jongman + */ +public class ResourceManager extends SWTResourceManager { + + /** + * The map where we store our images. + */ + private static Map m_descriptorImageMap = new HashMap(); + + /** + * Returns an {@link ImageDescriptor} stored in the file at the specified path + * relative to the specified class. + * + * @param clazz the {@link Class} relative to which to find the image + * descriptor. + * @param path the path to the image file. + * @return the {@link ImageDescriptor} stored in the file at the specified path. + */ + public static ImageDescriptor getImageDescriptor(Class clazz, String path) { + return ImageDescriptor.createFromFile(clazz, path); + } + + /** + * Returns an {@link ImageDescriptor} stored in the file at the specified path. + * + * @param path the path to the image file. + * @return the {@link ImageDescriptor} stored in the file at the specified path. + */ + public static ImageDescriptor getImageDescriptor(String path) { + try { + return ImageDescriptor.createFromURL(new File(path).toURI().toURL()); + } catch (MalformedURLException e) { + return null; + } + } + + /** + * Returns an {@link Image} based on the specified {@link ImageDescriptor}. + * + * @param descriptor the {@link ImageDescriptor} for the {@link Image}. + * @return the {@link Image} based on the specified {@link ImageDescriptor}. + */ + public static Image getImage(ImageDescriptor descriptor) { + if (descriptor == null) { + return null; + } + Image image = m_descriptorImageMap.get(descriptor); + if (image == null) { + image = descriptor.createImage(); + m_descriptorImageMap.put(descriptor, image); + } + return image; + } + + /** + * Maps images to decorated images. + */ + @SuppressWarnings("unchecked") + private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; + + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage the base {@link Image} that should be decorated. + * @param decorator the {@link Image} to decorate the base image. + * @return {@link Image} The resulting decorated image. + */ + public static Image decorateImage(Image baseImage, Image decorator) { + return decorateImage(baseImage, decorator, BOTTOM_RIGHT); + } + + /** + * Returns an {@link Image} composed of a base image decorated by another image. + * + * @param baseImage + * the base {@link Image} that should be decorated. + * @param decorator + * the {@link Image} to decorate the base image. + * @param corner + * the corner to place decorator image. + * @return the resulting decorated {@link Image}. + */ + public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { + if (corner <= 0 || corner >= LAST_CORNER_KEY) { + throw new IllegalArgumentException("Wrong decorate corner"); + } + Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; + if (cornerDecoratedImageMap == null) { + cornerDecoratedImageMap = new HashMap>(); + m_decoratedImageMap[corner] = cornerDecoratedImageMap; + } + Map decoratedMap = cornerDecoratedImageMap.get(baseImage); + if (decoratedMap == null) { + decoratedMap = new HashMap(); + cornerDecoratedImageMap.put(baseImage, decoratedMap); + } + // + Image result = decoratedMap.get(decorator); + if (result == null) { + final Rectangle bib = baseImage.getBounds(); + final Rectangle dib = decorator.getBounds(); + final Point baseImageSize = new Point(bib.width, bib.height); + CompositeImageDescriptor compositImageDesc = new CompositeImageDescriptor() { + @Override + protected void drawCompositeImage(int width, int height) { + drawImage(createCachedImageDataProvider(baseImage), 0, 0); + if (corner == TOP_LEFT) { + drawImage(getUnzoomedImageDataProvider(decorator.getImageData()) , 0, 0); + } else if (corner == TOP_RIGHT) { + drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), bib.width - dib.width, 0); + } else if (corner == BOTTOM_LEFT) { + drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), 0, bib.height - dib.height); + } else if (corner == BOTTOM_RIGHT) { + drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), bib.width - dib.width, bib.height - dib.height); + } + } + @Override + protected Point getSize() { + return baseImageSize; + } + }; + // + result = compositImageDesc.createImage(); + decoratedMap.put(decorator, result); + } + return result; + } + + private static ImageDataProvider getUnzoomedImageDataProvider(ImageData imageData) { + return zoom -> zoom == 100 ? imageData : null; + } + + + /** + * Dispose all of the cached images. + */ + public static void disposeImages() { + SWTResourceManager.disposeImages(); + // dispose ImageDescriptor images + { + for (Iterator I = m_descriptorImageMap.values().iterator(); I.hasNext();) { + I.next().dispose(); + } + m_descriptorImageMap.clear(); + } + // dispose decorated images + for (int i = 0; i < m_decoratedImageMap.length; i++) { + Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; + if (cornerDecoratedImageMap != null) { + for (Map decoratedMap : cornerDecoratedImageMap.values()) { + for (Image image : decoratedMap.values()) { + image.dispose(); + } + decoratedMap.clear(); + } + cornerDecoratedImageMap.clear(); + } + } + // dispose plugin images + { + for (Iterator I = m_URLImageMap.values().iterator(); I.hasNext();) { + I.next().dispose(); + } + m_URLImageMap.clear(); + } + } + + //////////////////////////////////////////////////////////////////////////// + // + // Plugin images support + // + //////////////////////////////////////////////////////////////////////////// + /** + * Maps URL to images. + */ + private static Map m_URLImageMap = new HashMap(); + + /** + * Provider for plugin resources, used by WindowBuilder at design time. + */ + public interface PluginResourceProvider { + URL getEntry(String symbolicName, String path); + } + + /** + * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design + * time. + */ + private static PluginResourceProvider m_designTimePluginResourceProvider = null; + + /** + * Returns an {@link Image} based on a plugin and file path. + * + * @param plugin the plugin {@link Object} containing the image + * @param name the path to the image within the plugin + * @return the {@link Image} stored in the file at the specified path + * + * @deprecated Use {@link #getPluginImage(String, String)} instead. + */ + @Deprecated + public static Image getPluginImage(Object plugin, String name) { + try { + URL url = getPluginImageURL(plugin, name); + if (url != null) { + return getPluginImageFromUrl(url); + } + } catch (Throwable e) { + // Ignore any exceptions + } + return null; + } + + /** + * Returns an {@link Image} based on a {@link Bundle} and resource entry path. + * + * @param symbolicName the symbolic name of the {@link Bundle}. + * @param path the path of the resource entry. + * @return the {@link Image} stored in the file at the specified path. + */ + public static Image getPluginImage(String symbolicName, String path) { + try { + URL url = getPluginImageURL(symbolicName, path); + if (url != null) { + return getPluginImageFromUrl(url); + } + } catch (Throwable e) { + // Ignore any exceptions + } + return null; + } + + /** + * Returns an {@link Image} based on given {@link URL}. + */ + private static Image getPluginImageFromUrl(URL url) { + try { + try { + String key = url.toExternalForm(); + Image image = m_URLImageMap.get(key); + if (image == null) { + InputStream stream = url.openStream(); + try { + image = getImage(stream); + m_URLImageMap.put(key, image); + } finally { + stream.close(); + } + } + return image; + } catch (Throwable e) { + // Ignore any exceptions + } + } catch (Throwable e) { + // Ignore any exceptions + } + return null; + } + + /** + * Returns an {@link ImageDescriptor} based on a plugin and file path. + * + * @param plugin the plugin {@link Object} containing the image. + * @param name the path to th eimage within the plugin. + * @return the {@link ImageDescriptor} stored in the file at the specified path. + * + * @deprecated Use {@link #getPluginImageDescriptor(String, String)} instead. + */ + @Deprecated + public static ImageDescriptor getPluginImageDescriptor(Object plugin, String name) { + try { + try { + URL url = getPluginImageURL(plugin, name); + return ImageDescriptor.createFromURL(url); + } catch (Throwable e) { + // Ignore any exceptions + } + } catch (Throwable e) { + // Ignore any exceptions + } + return null; + } + + /** + * Returns an {@link ImageDescriptor} based on a {@link Bundle} and resource + * entry path. + * + * @param symbolicName the symbolic name of the {@link Bundle}. + * @param path the path of the resource entry. + * @return the {@link ImageDescriptor} based on a {@link Bundle} and resource + * entry path. + */ + public static ImageDescriptor getPluginImageDescriptor(String symbolicName, String path) { + try { + URL url = getPluginImageURL(symbolicName, path); + if (url != null) { + return ImageDescriptor.createFromURL(url); + } + } catch (Throwable e) { + // Ignore any exceptions + } + return null; + } + + /** + * Returns an {@link URL} based on a {@link Bundle} and resource entry path. + */ + private static URL getPluginImageURL(String symbolicName, String path) { + // try runtime plugins + { + Bundle bundle = Platform.getBundle(symbolicName); + if (bundle != null) { + return bundle.getEntry(path); + } + } + // try design time provider + if (m_designTimePluginResourceProvider != null) { + return m_designTimePluginResourceProvider.getEntry(symbolicName, path); + } + // no such resource + return null; + } + + /** + * Returns an {@link URL} based on a plugin and file path. + * + * @param plugin the plugin {@link Object} containing the file path. + * @param name the file path. + * @return the {@link URL} representing the file at the specified path. + * @throws Exception + */ + private static URL getPluginImageURL(Object plugin, String name) throws Exception { + // try to work with 'plugin' as with OSGI BundleContext + try { + Class BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$ + Class BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$ + if (BundleContextClass.isAssignableFrom(plugin.getClass())) { + Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$ + Object bundle = getBundleMethod.invoke(plugin, new Object[0]); + // + Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ + Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); + Object path = pathConstructor.newInstance(new Object[] { name }); + // + Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ + Class PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$ + Method findMethod = PlatformClass.getMethod("find", new Class[] { BundleClass, IPathClass }); //$NON-NLS-1$ + return (URL) findMethod.invoke(null, new Object[] { bundle, path }); + } + } catch (Throwable e) { + // Ignore any exceptions + } + // else work with 'plugin' as with usual Eclipse plugin + { + Class PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$ + if (PluginClass.isAssignableFrom(plugin.getClass())) { + // + Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ + Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); + Object path = pathConstructor.newInstance(new Object[] { name }); + // + Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ + Method findMethod = PluginClass.getMethod("find", new Class[] { IPathClass }); //$NON-NLS-1$ + return (URL) findMethod.invoke(plugin, new Object[] { path }); + } + } + return null; + } + + //////////////////////////////////////////////////////////////////////////// + // + // General + // + //////////////////////////////////////////////////////////////////////////// + /** + * Dispose of cached objects and their underlying OS resources. This should only + * be called when the cached objects are no longer needed (e.g. on application + * shutdown). + */ + public static void dispose() { + disposeColors(); + disposeFonts(); + disposeImages(); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java b/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java index 0024a03..d8a2858 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/SWTResourceManager.java @@ -29,17 +29,14 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; /** - * Utility class for managing OS resources associated with SWT controls such as - * colors, fonts, images, etc. + * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc. *

- * !!! IMPORTANT !!! Application code must explicitly invoke the - * dispose() method to release the operating system resources - * managed by cached objects when those objects and OS resources are no longer + * !!! IMPORTANT !!! Application code must explicitly invoke the dispose() method to release the + * operating system resources managed by cached objects when those objects and OS resources are no longer * needed (e.g. on application shutdown) *

* This class may be freely distributed as part of any application or plugin. *

- * * @author scheglov_ke * @author Dan Rubel */ @@ -49,54 +46,57 @@ public class SWTResourceManager { // Color // //////////////////////////////////////////////////////////////////////////// - private static Map colorMap = new HashMap<>(); - - private SWTResourceManager() {} - + private static Map m_colorMap = new HashMap(); /** * Returns the system {@link Color} matching the specific ID. * - * @param systemColorID the ID value for the color + * @param systemColorID + * the ID value for the color * @return the system {@link Color} matching the specific ID */ public static Color getColor(int systemColorID) { Display display = Display.getCurrent(); return display.getSystemColor(systemColorID); } - /** * Returns a {@link Color} given its red, green and blue component values. * - * @param r the red component of the color - * @param g the green component of the color - * @param b the blue component of the color - * @return the {@link Color} matching the given red, green and blue component - * values + * @param r + * the red component of the color + * @param g + * the green component of the color + * @param b + * the blue component of the color + * @return the {@link Color} matching the given red, green and blue component values */ public static Color getColor(int r, int g, int b) { return getColor(new RGB(r, g, b)); } - /** * Returns a {@link Color} given its RGB value. * - * @param rgb the {@link RGB} value of the color + * @param rgb + * the {@link RGB} value of the color * @return the {@link Color} matching the RGB value */ public static Color getColor(RGB rgb) { - return colorMap.computeIfAbsent(rgb, k -> new Color(Display.getCurrent(), rgb)); + Color color = m_colorMap.get(rgb); + if (color == null) { + Display display = Display.getCurrent(); + color = new Color(display, rgb); + m_colorMap.put(rgb, color); + } + return color; } - /** * Dispose of all the cached {@link Color}'s. */ public static void disposeColors() { - for (Color color : colorMap.values()) { + for (Color color : m_colorMap.values()) { color.dispose(); } - colorMap.clear(); + m_colorMap.clear(); } - //////////////////////////////////////////////////////////////////////////// // // Image @@ -105,12 +105,12 @@ public class SWTResourceManager { /** * Maps image paths to images. */ - private static Map imageMap = new HashMap<>(); - + private static Map m_imageMap = new HashMap(); /** * Returns an {@link Image} encoded by the specified {@link InputStream}. * - * @param stream the {@link InputStream} encoding the image data + * @param stream + * the {@link InputStream} encoding the image data * @return the {@link Image} encoded by the specified input stream */ protected static Image getImage(InputStream stream) throws IOException { @@ -125,55 +125,52 @@ public class SWTResourceManager { stream.close(); } } - /** * Returns an {@link Image} stored in the file at the specified path. * - * @param path the path to the image file + * @param path + * the path to the image file * @return the {@link Image} stored in the file at the specified path */ public static Image getImage(String path) { - Image image = imageMap.get(path); + Image image = m_imageMap.get(path); if (image == null) { try { image = getImage(new FileInputStream(path)); - imageMap.put(path, image); + m_imageMap.put(path, image); } catch (Exception e) { image = getMissingImage(); - imageMap.put(path, image); + m_imageMap.put(path, image); } } return image; } - /** - * Returns an {@link Image} stored in the file at the specified path relative to - * the specified class. + * Returns an {@link Image} stored in the file at the specified path relative to the specified class. * - * @param clazz the {@link Class} relative to which to find the image - * @param path the path to the image file, if starts with '/' + * @param clazz + * the {@link Class} relative to which to find the image + * @param path + * the path to the image file, if starts with '/' * @return the {@link Image} stored in the file at the specified path */ public static Image getImage(Class clazz, String path) { String key = clazz.getName() + '|' + path; - Image image = imageMap.get(key); + Image image = m_imageMap.get(key); if (image == null) { try { image = getImage(clazz.getResourceAsStream(path)); - imageMap.put(key, image); + m_imageMap.put(key, image); } catch (Exception e) { image = getMissingImage(); - imageMap.put(key, image); + m_imageMap.put(key, image); } } return image; } - private static final int MISSING_IMAGE_SIZE = 10; - /** - * @return the small {@link Image} that can be used as placeholder for missing - * image. + * @return the small {@link Image} that can be used as placeholder for missing image. */ private static Image getMissingImage() { Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); @@ -185,7 +182,6 @@ public class SWTResourceManager { // return image; } - /** * Style constant for placing decorator image in top left corner of base image. */ @@ -195,13 +191,11 @@ public class SWTResourceManager { */ public static final int TOP_RIGHT = 2; /** - * Style constant for placing decorator image in bottom left corner of base - * image. + * Style constant for placing decorator image in bottom left corner of base image. */ public static final int BOTTOM_LEFT = 3; /** - * Style constant for placing decorator image in bottom right corner of base - * image. + * Style constant for placing decorator image in bottom right corner of base image. */ public static final int BOTTOM_RIGHT = 4; /** @@ -212,77 +206,83 @@ public class SWTResourceManager { * Maps images to decorated images. */ @SuppressWarnings("unchecked") - private static Map>[] decoratedImageMap = new Map[LAST_CORNER_KEY]; - + private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; /** * Returns an {@link Image} composed of a base image decorated by another image. * - * @param baseImage the base {@link Image} that should be decorated - * @param decorator the {@link Image} to decorate the base image + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image * @return {@link Image} The resulting decorated image */ public static Image decorateImage(Image baseImage, Image decorator) { return decorateImage(baseImage, decorator, BOTTOM_RIGHT); } - /** * Returns an {@link Image} composed of a base image decorated by another image. * - * @param baseImage the base {@link Image} that should be decorated - * @param decorator the {@link Image} to decorate the base image - * @param corner the corner to place decorator image + * @param baseImage + * the base {@link Image} that should be decorated + * @param decorator + * the {@link Image} to decorate the base image + * @param corner + * the corner to place decorator image * @return the resulting decorated {@link Image} */ public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { if (corner <= 0 || corner >= LAST_CORNER_KEY) { throw new IllegalArgumentException("Wrong decorate corner"); } - Map> cornerDecoratedImageMap = decoratedImageMap[corner]; + Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; if (cornerDecoratedImageMap == null) { - cornerDecoratedImageMap = new HashMap<>(); - decoratedImageMap[corner] = cornerDecoratedImageMap; + cornerDecoratedImageMap = new HashMap>(); + m_decoratedImageMap[corner] = cornerDecoratedImageMap; } - Map decoratedMap = cornerDecoratedImageMap.computeIfAbsent(baseImage, - k -> new HashMap()); - return decoratedMap.computeIfAbsent(decorator, k -> { + Map decoratedMap = cornerDecoratedImageMap.get(baseImage); + if (decoratedMap == null) { + decoratedMap = new HashMap(); + cornerDecoratedImageMap.put(baseImage, decoratedMap); + } + // + Image result = decoratedMap.get(decorator); + if (result == null) { Rectangle bib = baseImage.getBounds(); Rectangle dib = decorator.getBounds(); - Image result = new Image(Display.getCurrent(), bib.width, bib.height); + // + result = new Image(Display.getCurrent(), bib.width, bib.height); + // GC gc = new GC(result); gc.drawImage(baseImage, 0, 0); - switch (corner) { - case TOP_LEFT: + if (corner == TOP_LEFT) { gc.drawImage(decorator, 0, 0); - break; - case TOP_RIGHT: + } else if (corner == TOP_RIGHT) { gc.drawImage(decorator, bib.width - dib.width, 0); - break; - case BOTTOM_LEFT: + } else if (corner == BOTTOM_LEFT) { gc.drawImage(decorator, 0, bib.height - dib.height); - break; - case BOTTOM_RIGHT: + } else if (corner == BOTTOM_RIGHT) { gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height); - break; - default: - // do nothing } gc.dispose(); - return result; - }); + // + decoratedMap.put(decorator, result); + } + return result; } - /** * Dispose all of the cached {@link Image}'s. */ public static void disposeImages() { // dispose loaded images - for (Image image : imageMap.values()) { - image.dispose(); + { + for (Image image : m_imageMap.values()) { + image.dispose(); + } + m_imageMap.clear(); } - imageMap.clear(); // dispose decorated images - for (int i = 0; i < decoratedImageMap.length; i++) { - Map> cornerDecoratedImageMap = decoratedImageMap[i]; + for (int i = 0; i < m_decoratedImageMap.length; i++) { + Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; if (cornerDecoratedImageMap != null) { for (Map decoratedMap : cornerDecoratedImageMap.values()) { for (Image image : decoratedMap.values()) { @@ -294,7 +294,6 @@ public class SWTResourceManager { } } } - //////////////////////////////////////////////////////////////////////////// // // Font @@ -303,39 +302,45 @@ public class SWTResourceManager { /** * Maps font names to fonts. */ - private static Map fontMap = new HashMap<>(); + private static Map m_fontMap = new HashMap(); /** * Maps fonts to their bold versions. */ - private static Map fontToBoldFontMap = new HashMap<>(); - + private static Map m_fontToBoldFontMap = new HashMap(); /** * Returns a {@link Font} based on its name, height and style. * - * @param name the name of the font - * @param height the height of the font - * @param style the style of the font + * @param name + * the name of the font + * @param height + * the height of the font + * @param style + * the style of the font * @return {@link Font} The font matching the name, height and style */ public static Font getFont(String name, int height, int style) { return getFont(name, height, style, false, false); } - /** - * Returns a {@link Font} based on its name, height and style. Windows-specific - * strikeout and underline flags are also supported. + * Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline + * flags are also supported. * - * @param name the name of the font - * @param size the size of the font - * @param style the style of the font - * @param strikeout the strikeout flag (warning: Windows only) - * @param underline the underline flag (warning: Windows only) - * @return {@link Font} The font matching the name, height, style, strikeout and - * underline + * @param name + * the name of the font + * @param size + * the size of the font + * @param style + * the style of the font + * @param strikeout + * the strikeout flag (warning: Windows only) + * @param underline + * the underline flag (warning: Windows only) + * @return {@link Font} The font matching the name, height, style, strikeout and underline */ public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline; - return fontMap.computeIfAbsent(fontName, k -> { + Font font = m_fontMap.get(fontName); + if (font == null) { FontData fontData = new FontData(name, size, style); if (strikeout || underline) { try { @@ -349,45 +354,47 @@ public class SWTResourceManager { logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ } } - } catch (Exception e) { + } catch (Throwable e) { + System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$ } } - return new Font(Display.getCurrent(), fontData); - - }); - + font = new Font(Display.getCurrent(), fontData); + m_fontMap.put(fontName, font); + } + return font; } - /** * Returns a bold version of the given {@link Font}. * - * @param baseFont the {@link Font} for which a bold version is desired + * @param baseFont + * the {@link Font} for which a bold version is desired * @return the bold version of the given {@link Font} */ public static Font getBoldFont(Font baseFont) { - return fontToBoldFontMap.computeIfAbsent(baseFont, k -> { - FontData[] fontDatas = baseFont.getFontData(); + Font font = m_fontToBoldFontMap.get(baseFont); + if (font == null) { + FontData fontDatas[] = baseFont.getFontData(); FontData data = fontDatas[0]; - return new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD); - }); + font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD); + m_fontToBoldFontMap.put(baseFont, font); + } + return font; } - /** * Dispose all of the cached {@link Font}'s. */ public static void disposeFonts() { // clear fonts - for (Font font : fontMap.values()) { + for (Font font : m_fontMap.values()) { font.dispose(); } - fontMap.clear(); + m_fontMap.clear(); // clear bold fonts - for (Font font : fontToBoldFontMap.values()) { + for (Font font : m_fontToBoldFontMap.values()) { font.dispose(); } - fontToBoldFontMap.clear(); + m_fontToBoldFontMap.clear(); } - //////////////////////////////////////////////////////////////////////////// // // Cursor @@ -396,38 +403,40 @@ public class SWTResourceManager { /** * Maps IDs to cursors. */ - private static Map idToCursorMap = new HashMap<>(); - + private static Map m_idToCursorMap = new HashMap(); /** * Returns the system cursor matching the specific ID. * - * @param id int The ID value for the cursor + * @param id + * int The ID value for the cursor * @return Cursor The system cursor matching the specific ID */ public static Cursor getCursor(int id) { Integer key = Integer.valueOf(id); - return idToCursorMap.computeIfAbsent(key, k -> new Cursor(Display.getDefault(), id)); + Cursor cursor = m_idToCursorMap.get(key); + if (cursor == null) { + cursor = new Cursor(Display.getDefault(), id); + m_idToCursorMap.put(key, cursor); + } + return cursor; } - /** * Dispose all of the cached cursors. */ public static void disposeCursors() { - for (Cursor cursor : idToCursorMap.values()) { + for (Cursor cursor : m_idToCursorMap.values()) { cursor.dispose(); } - idToCursorMap.clear(); + m_idToCursorMap.clear(); } - //////////////////////////////////////////////////////////////////////////// // // General // //////////////////////////////////////////////////////////////////////////// /** - * Dispose of cached objects and their underlying OS resources. This should only - * be called when the cached objects are no longer needed (e.g. on application - * shutdown). + * Dispose of cached objects and their underlying OS resources. This should only be called when the cached + * objects are no longer needed (e.g. on application shutdown). */ public static void dispose() { disposeColors(); diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index 3e2be35..fb43cfd 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -80,7 +80,6 @@ - From 93a8c067fc2cbf60bfb5f2526dc673a97b284132 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 3 Jan 2022 14:15:59 +0100 Subject: [PATCH 03/28] add sliuder variant --- .../ui/swt/internal/WaveformView.java | 39 +- .../ui/swt/internal/slider/ImageButton.java | 129 ++ .../ui/swt/internal/slider/RangeSlider.java | 1453 +++++++++++++++++ .../swt/internal/slider/ReflectionUtils.java | 48 + .../slider/SelectionListenerUtil.java | 74 + .../ui/swt/internal/slider/bullet_left.png | Bin 0 -> 307 bytes .../ui/swt/internal/slider/bullet_right.png | Bin 0 -> 307 bytes .../ui/swt/internal/slider/h-slider-drag.png | Bin 0 -> 1057 bytes .../ui/swt/internal/slider/h-slider-hover.png | Bin 0 -> 1057 bytes .../swt/internal/slider/h-slider-normal.png | Bin 0 -> 1055 bytes .../swt/internal/slider/h-slider-selected.png | Bin 0 -> 1041 bytes .../ui/swt/internal/slider/marker_r.png | Bin 0 -> 358 bytes .../ui/swt/internal/slider/marker_r_bl.png | Bin 0 -> 386 bytes .../ui/swt/internal/slider/marker_r_bl_lt.png | Bin 0 -> 366 bytes .../ui/swt/internal/slider/marker_r_lt.png | Bin 0 -> 345 bytes .../ui/swt/internal/slider/slider-drag.png | Bin 0 -> 1085 bytes .../ui/swt/internal/slider/slider-hover.png | Bin 0 -> 1083 bytes .../ui/swt/internal/slider/slider-normal.png | Bin 0 -> 1072 bytes .../swt/internal/slider/slider-selected.png | Bin 0 -> 430 bytes .../org/eclipse/wb/swt/ResourceManager.java | 438 ----- 20 files changed, 1737 insertions(+), 444 deletions(-) create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ReflectionUtils.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/SelectionListenerUtil.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-hover.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-normal.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-selected.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-hover.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-selected.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/org/eclipse/wb/swt/ResourceManager.java diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index bbd9525..0deaa44 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -56,13 +56,13 @@ import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.TextLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -71,7 +71,6 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ScrollBar; -import org.eclipse.swt.widgets.Slider; import org.eclipse.swt.widgets.Widget; import org.eclipse.wb.swt.SWTResourceManager; @@ -94,6 +93,8 @@ import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.database.ui.swt.internal.slider.ImageButton; +import com.minres.scviewer.database.ui.swt.internal.slider.RangeSlider; import com.minres.scviewer.database.ui.swt.sb.FlatScrollBar; public class WaveformView implements IWaveformView { @@ -345,11 +346,37 @@ public class WaveformView implements IWaveformView { waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider); waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE); - GridData gd_timeSlider = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); - gd_timeSlider.heightHint = 18; - timeSliderPane.setLayoutData(gd_timeSlider); + //Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE); + Composite timeSliderPane = new Composite(waveformPane, SWT.NONE); +// timeSliderPane.setBackground(SWTResourceManager.getColor(SWT.COLOR_RED)); + GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); +// gd_timeSliderPane.heightHint = 22; + timeSliderPane.setLayoutData(gd_timeSliderPane); + GridLayout gl_timeSliderPane = new GridLayout(3, false); + gl_timeSliderPane.marginHeight=0; + gl_timeSliderPane.marginWidth=0; + gl_timeSliderPane.horizontalSpacing=0; + gl_timeSliderPane.verticalSpacing=0; + timeSliderPane.setLayout(gl_timeSliderPane); + ImageButton b1 = new ImageButton(timeSliderPane, SWT.NONE); + GridData gd_b1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_b1.widthHint=18; + gd_b1.heightHint=18; + b1.setLayoutData(gd_b1); + b1.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_left.png")); + + Composite timeSlider = new RangeSlider(timeSliderPane, SWT.ON|SWT.HIGH|SWT.SMOOTH|SWT.CONTROL); + GridData gd_timeSlide = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + timeSlider.setLayoutData(gd_timeSlide); + + ImageButton b2 = new ImageButton(timeSliderPane, SWT.NONE); + GridData gd_b2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_b2.widthHint=18; + gd_b2.heightHint=18; + b2.setLayoutData(gd_b2); + b2.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_right.png")); + // create the name pane createTextPane(namePane, "Name"); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java new file mode 100644 index 0000000..21483d6 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java @@ -0,0 +1,129 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.Transform; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; + +public class ImageButton extends Composite +{ + private Color textColor; + private Image image; + private Image grayImage; + private ImageData imageData; + private String text = ""; + private int width; + private int height; + private boolean hover; + + public ImageButton(Composite parent, int style) + { + super(parent, style); + + textColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE); + + /* Add dispose listener for the image */ + addListener(SWT.Dispose, event -> { + if (image != null) + image.dispose(); + }); + + /* Add custom paint listener that paints the stars */ + addListener(SWT.Paint, event -> { + paintControl(event); + }); + + /* Listen for click events */ + addListener(SWT.MouseDown, event -> { + System.out.println("Click"); + }); + addListener(SWT.MouseDown, event -> { + }); + + addListener(SWT.MouseUp, event -> { + }); + + addListener(SWT.MouseMove, event -> { + hover=false; + redraw(); + }); + + addListener(SWT.MouseWheel, event -> { + }); + + addListener(SWT.MouseHover, event -> { + hover=true; + redraw(); + }); + + addListener(SWT.MouseDoubleClick, event -> { + }); + } + + private void paintControl(Event event) { + GC gc = event.gc; + + if (image != null) + { +// gc.drawImage(image, 1, 1); +// if(hover) { +// Rectangle rect = image.getBounds (); +// Transform tr = new Transform (event.display); +// tr.setElements (1, 0, 0, -1, 1, 2*(1+rect.height)); +// gc.setTransform (tr); +// gc.drawImage (image, 1, 1); +// gc.setTransform (null); +// } + if(hover) { + gc.drawImage(image, 1, 1); + } else { + gc.drawImage(grayImage, 1, 1); + } + Point textSize = gc.textExtent(text); + gc.setForeground(textColor); + gc.drawText(text, (width - textSize.x) / 2 + 1, (height - textSize.y) / 2 + 1, true); + } + } + + public void setImage(Image img) + { + image = new Image(Display.getDefault(), img, SWT.IMAGE_COPY); + grayImage = new Image(Display.getDefault(),img,SWT.IMAGE_GRAY); + width = img.getBounds().width; + height = img.getBounds().height; + imageData = img.getImageData(); + redraw(); + } + + public void setText(String text) + { + this.text = text; + redraw(); + } + + @Override + public Point computeSize(int wHint, int hHint, boolean changed) + { + int overallWidth = width; + int overallHeight = height; + + /* Consider hints */ + if (wHint != SWT.DEFAULT && wHint < overallWidth) + overallWidth = wHint; + + if (hHint != SWT.DEFAULT && hHint < overallHeight) + overallHeight = hHint; + + /* Return computed dimensions plus border */ + return new Point(overallWidth + 2, overallHeight + 2); + } + +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java new file mode 100644 index 0000000..d146b53 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java @@ -0,0 +1,1453 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; + +import java.text.Format; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Widget; +import org.eclipse.wb.swt.SWTResourceManager; + +/** + * Instances of this class provide a slider with two thumbs to control lower and + * upper integer values. + *

+ *

+ *
Styles:
+ *
BORDER
+ *
HORIZONTAL
+ *
VERTICAL
+ *
CONTROL - Allow key and mouse manipulation to control both lower and + * upper value thumbs simultaneously
+ *
ON - Indicates that selection listeners are notified continuously during + * thumb drag events. Otherwise, notification occurs only after the drag event + * terminates.
+ *
HIGH - Indicates high quality tick marks are generated dynamically to a + * factor of the pageIncrement or increment. Otherwise, tick marks divide the + * scale evenly into ten parts.
+ *
SMOOTH - Indicates mouse manipulation of upper and lower values are + * computed smoothly from the exact mouse cursor position disregarding the + * increment value. Otherwise, values are constrained to an incremental + * value.
+ *
Events:
+ *
Selection
+ *
+ *

+ *

+ * Note: Styles HORIZONTAL and VERTICAL are mutually exclusive. + *

+ */ +public class RangeSlider extends Canvas { + + private static final byte NONE = 0; + private static final byte UPPER = 1 << 0; + private static final byte LOWER = 1 << 1; + private static final byte BOTH = UPPER | LOWER; + + private static int minWidth = 18; + private static int minHeight = 18; + private static int imgWidth = 8; + private int minimum; + private int maximum; + private int lowerValue; + private int upperValue; + private final Image slider, sliderHover, sliderDrag, sliderSelected; + private final Image vSlider, vSliderHover, vSliderDrag, vSliderSelected; + private int orientation; + private int increment; + private int pageIncrement; + private byte selectedElement, priorSelectedElement; + private boolean dragInProgress; + private boolean upperHover, lowerHover; + private int previousUpperValue, previousLowerValue; + private int startDragUpperValue, startDragLowerValue; + private Point startDragPoint; + private boolean hasFocus; + private final boolean isSmooth; + private final boolean isFullSelection; + private final boolean isHighQuality; + private final boolean isOn; + private Format toolTipFormatter; + private String clientToolTipText; + + /** + * Constructs a new instance of this class given its parent and a style value + * describing its behavior and appearance. + *

+ * The style value is either one of the style constants defined in class + * SWT which is applicable to instances of this class, or must be + * built by bitwise OR'ing together (that is, using the + * int "|" operator) two or more of those SWT style + * constants. The class description lists the style constants that are + * applicable to the class. Style bits are also inherited from superclasses. + *

+ * + * @param parent a composite control which will be the parent of the new + * instance (cannot be null) + * @param style the style of control to construct. Default style is HORIZONTAL + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the parent is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the parent
  • + *
+ * @see SWT#HORIZONTAL + * @see SWT#VERTICAL + * @see Widget#getStyle + * + */ + public RangeSlider(final Composite parent, final int style) { + super(parent, SWT.DOUBLE_BUFFERED | ((style & SWT.BORDER) == SWT.BORDER ? SWT.BORDER : SWT.NONE)); + minimum = lowerValue = 0; + maximum = upperValue = 100; + increment = 1; + pageIncrement = 10; + slider = SWTResourceManager.getImage(this.getClass(), "marker_r.png"); + sliderHover = SWTResourceManager.getImage(this.getClass(), "marker_r_lt.png"); + sliderDrag = SWTResourceManager.getImage(this.getClass(), "marker_r_bl.png"); + sliderSelected = SWTResourceManager.getImage(this.getClass(), "marker_r_bl_lt.png"); + + vSlider = SWTResourceManager.getImage(this.getClass(), "h-slider-normal.png"); + vSliderHover = SWTResourceManager.getImage(this.getClass(), "h-slider-hover.png"); + vSliderDrag = SWTResourceManager.getImage(this.getClass(), "h-slider-drag.png"); + vSliderSelected = SWTResourceManager.getImage(this.getClass(), "h-slider-selected.png"); + + if ((style & SWT.VERTICAL) == SWT.VERTICAL) { + orientation = SWT.VERTICAL; + } else { + orientation = SWT.HORIZONTAL; + } + isSmooth = (style & SWT.SMOOTH) == SWT.SMOOTH; + isFullSelection = (style & SWT.CONTROL) == SWT.CONTROL; + isHighQuality = (style & SWT.HIGH) == SWT.HIGH; + isOn = (style & SWT.ON) == SWT.ON; + selectedElement = isFullSelection ? BOTH : LOWER; + +// addListener(SWT.Dispose, event -> { +// SWTResourceManager.dsafeDispose(slider); +// SWTGraphicUtil.safeDispose(sliderHover); +// SWTGraphicUtil.safeDispose(sliderDrag); +// SWTGraphicUtil.safeDispose(sliderSelected); +// +// SWTGraphicUtil.safeDispose(vSlider); +// SWTGraphicUtil.safeDispose(vSliderHover); +// SWTGraphicUtil.safeDispose(vSliderDrag); +// SWTGraphicUtil.safeDispose(vSliderSelected); +// }); + addMouseListeners(); + addListener(SWT.Resize, event -> { + }); + addListener(SWT.FocusIn, e -> { + hasFocus = true; + redraw(); + }); + addListener(SWT.FocusOut, e -> { + hasFocus = false; + redraw(); + }); + addListener(SWT.KeyDown, event -> { + handleKeyDown(event); + }); + addPaintListener(event -> { + drawWidget(event); + }); + } + + @Override + public int getStyle() { + return super.getStyle() | orientation | (isSmooth ? SWT.SMOOTH : SWT.NONE) | // + (isOn ? SWT.ON : SWT.NONE) | // + (isFullSelection ? SWT.CONTROL : SWT.NONE) | // + (isHighQuality ? SWT.HIGH : SWT.NONE); + } + + /** + * Add the mouse listeners (mouse up, mouse down, mouse move, mouse wheel) + */ + private void addMouseListeners() { + addListener(SWT.MouseDown, event -> { + handleMouseDown(event); + }); + + addListener(SWT.MouseUp, event -> { + handleMouseUp(event); + }); + + addListener(SWT.MouseMove, event -> { + handleMouseMove(event); + }); + + addListener(SWT.MouseWheel, event -> { + handleMouseWheel(event); + }); + + addListener(SWT.MouseHover, event -> { + handleMouseHover(event); + }); + + addListener(SWT.MouseDoubleClick, event -> { + handleMouseDoubleClick(event); + }); + } + + /** + * Code executed when the mouse is down + * + * @param e event + */ + private void handleMouseDown(final Event e) { + selectKnobs(e); + if (e.count == 1) { + priorSelectedElement = selectedElement; + } + if (upperHover || lowerHover) { + selectedElement = isFullSelection && lowerHover && upperHover ? BOTH : lowerHover ? LOWER : upperHover ? UPPER : selectedElement; + dragInProgress = true; + startDragLowerValue = previousLowerValue = lowerValue; + startDragUpperValue = previousUpperValue = upperValue; + startDragPoint = new Point(e.x, e.y); + } + } + + /** + * Code executed when the mouse is up + * + * @param e event + */ + private void handleMouseUp(final Event e) { + if (dragInProgress) { + startDragPoint = null; + validateNewValues(e); + dragInProgress = false; + super.setToolTipText(clientToolTipText); + } + } + + /** + * invoke selection listeners if either upper or lower value has changed. if + * listeners reject the change, restore the previous values. redraw if either + * upper or lower value has changed. + * + * @param e event + */ + private void validateNewValues(final Event e) { + if (upperValue != previousUpperValue || lowerValue != previousLowerValue) { + if (!SelectionListenerUtil.fireSelectionListeners(this,e)) { + upperValue = previousUpperValue; + lowerValue = previousLowerValue; + } + previousUpperValue = upperValue; + previousLowerValue = lowerValue; + redraw(); + } + } + + + /** + * Code executed when the mouse pointer is moving + * + * @param e event + */ + private void handleMouseMove(final Event e) { + if (!dragInProgress) { + final boolean wasUpper = upperHover; + final boolean wasLower = lowerHover; + selectKnobs(e); + if (wasUpper != upperHover || wasLower != lowerHover) { + redraw(); + } + } else { // dragInProgress + final int x = e.x, y = e.y; + if (orientation == SWT.HORIZONTAL) { + if (selectedElement == BOTH) { + final int diff = (int) ((startDragPoint.x - x) / computePixelSizeForHorizontalSlider()) + minimum; + int newUpper = startDragUpperValue - diff; + int newLower = startDragLowerValue - diff; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - (startDragUpperValue - startDragLowerValue); + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + startDragUpperValue - startDragLowerValue; + } + upperValue = newUpper; + lowerValue = newLower; + if (!isSmooth) { + lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; + } + handleToolTip(lowerValue, upperValue); + } else if ((selectedElement & UPPER) != 0) { + upperValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; + if (!isSmooth) { + upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; + } + checkUpperValue(); + handleToolTip(upperValue); + } else { + lowerValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; + if (!isSmooth) { + lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + } + checkLowerValue(); + handleToolTip(lowerValue); + } + } else { + if (selectedElement == BOTH) { + final int diff = (int) ((startDragPoint.y - y) / computePixelSizeForVerticalSlider()) + minimum; + int newUpper = startDragUpperValue - diff; + int newLower = startDragLowerValue - diff; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - (startDragUpperValue - startDragLowerValue); + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + startDragUpperValue - startDragLowerValue; + } + upperValue = newUpper; + lowerValue = newLower; + if (!isSmooth) { + lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; + } + handleToolTip(lowerValue, upperValue); + } else if ((selectedElement & UPPER) != 0) { + upperValue = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; + if (!isSmooth) { + upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; + } + checkUpperValue(); + handleToolTip(upperValue); + } else { + lowerValue = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; + if (!isSmooth) { + lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + } + checkLowerValue(); + handleToolTip(lowerValue); + } + } + if (isOn) { + validateNewValues(e); + } else { + redraw(); + } + } + } + + /** + * determine whether the input coordinate is within the scale bounds and between + * the current upper and lower values. + * + * @param x + * @param y + * @return + */ + private boolean isBetweenKnobs(int x, int y) { + return orientation == SWT.HORIZONTAL ? x < coordUpper.x && x > coordLower.x && y >= minHeight/3 && y <= minHeight/3 + getClientArea().height - 2*minHeight/3 : // + y < coordUpper.y && y > coordLower.y && x >= minWidth/3 && x <= minWidth/3 + getClientArea().width - 2*minWidth/3; + } + + /** + * set the upperHover and lowerHover values according to the coordinates of the + * input event, the key modifier state, and whether the style allows selection + * of both knobs. + * + * @param e + */ + private void selectKnobs(final Event e) { + if (coordLower == null) { + return; + } + final Image img = orientation == SWT.HORIZONTAL ? slider : vSlider; + final int x = e.x, y = e.y; + lowerHover = x >= coordLower.x && x <= coordLower.x + img.getBounds().width && y >= coordLower.y && y <= coordLower.y + img.getBounds().height; + upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // + x >= coordUpper.x && x <= coordUpper.x + img.getBounds().width && // + y >= coordUpper.y && y <= coordUpper.y + img.getBounds().height; + lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; + if (!lowerHover && !upperHover && isFullSelection && isBetweenKnobs(x, y)) { + lowerHover = upperHover = true; + } + } + + /** + * if the input coordinate is within the scale bounds, return the corresponding + * scale value of the coordinate. otherwise return -1. + * + * @param x x coordinate value + * @param y y coordinate value + * @return + */ + private int getCursorValue(int x, int y) { + int value = -1; + final Rectangle clientArea = getClientArea(); + if (orientation == SWT.HORIZONTAL) { + if (x < 9 + clientArea.width - 20 && x >= 9 && y >= 9 && y <= 9 + clientArea.height - 20) { + value = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; + } + } else if (y < 9 + clientArea.height - 20 && y >= 9 && x >= 9 && x <= 9 + clientArea.width - 20) { + value = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; + } + return value; + } + + /** + * Code executed when the mouse double click + * + * @param e event + */ + private void handleMouseDoubleClick(final Event e) { + final int value = getCursorValue(e.x, e.y); + if (value >= 0) { + selectedElement = priorSelectedElement; + if (value > upperValue) { + if (selectedElement == BOTH) { + lowerValue += value - upperValue; + upperValue = value; + } else if ((selectedElement & UPPER) != 0) { + upperValue = value; + } else if ((selectedElement & LOWER) != 0) { + final int diff = upperValue - lowerValue; + if (value + diff > maximum) { + upperValue = maximum; + lowerValue = maximum - diff; + } else { + upperValue = value + diff; + lowerValue = value; + } + } + } else if (value < lowerValue) { + if (selectedElement == BOTH) { + upperValue += value - lowerValue; + lowerValue = value; + } else if ((selectedElement & LOWER) != 0) { + lowerValue = value; + } else if ((selectedElement & UPPER) != 0) { + final int diff = upperValue - lowerValue; + if (value - diff < minimum) { + lowerValue = minimum; + upperValue = minimum + diff; + } else { + upperValue = value; + lowerValue = value - diff; + } + } + } else if (value > lowerValue && value < upperValue && selectedElement != BOTH) { + if ((selectedElement & LOWER) != 0) { + lowerValue = value; + } else if ((selectedElement & UPPER) != 0) { + upperValue = value; + } + } + validateNewValues(e); + } + } + + private StringBuffer toolTip; + private Point coordUpper; + private Point coordLower; + + /** + * set the tooltip if a toolTipFormatter is present. either one or two values + * are accepted. + * + * @param values + */ + private void handleToolTip(int... values) { + if (toolTipFormatter != null) { + try { + if (values.length == 1) { + toolTip.setLength(0); + toolTipFormatter.format(values[0], toolTip, null); + super.setToolTipText(toolTip.toString()); + } else if (values.length == 2) { + toolTip.setLength(0); + toolTipFormatter.format(values[0], toolTip, null); + toolTip.append(" \u2194 "); // LEFT RIGHT ARROW + toolTipFormatter.format(values[1], toolTip, null); + super.setToolTipText(toolTip.toString()); + } + } catch (final IllegalArgumentException ex) { + super.setToolTipText(clientToolTipText); + } + } + } + + /** + * Code executed on mouse hover + * + * @param e event + */ + private void handleMouseHover(final Event e) { + if (!dragInProgress && toolTipFormatter != null) { + final int value = getCursorValue(e.x, e.y); + if (value >= 0) { + try { + toolTip.setLength(0); + toolTipFormatter.format(value, toolTip, null); + super.setToolTipText(toolTip.toString()); + } catch (final IllegalArgumentException ex) { + super.setToolTipText(clientToolTipText); + } + } else { + super.setToolTipText(clientToolTipText); + } + } + } + + /** + * a formatter for displaying a tool tip when hovering over the scale and during + * thumb modification events. The + * {@link Format#format(Object, StringBuffer, java.text.FieldPosition)} method + * is invoked to retrieve the text for the tooltip where the input + * {@code Object} is an {@code Integer} with a value within the minimum and + * maximum. + * + * @param formatter + */ + public void setToolTipFormatter(Format formatter) { + toolTip = formatter != null ? new StringBuffer() : null; + toolTipFormatter = formatter; + } + + @Override + public void setToolTipText(String string) { + super.setToolTipText(clientToolTipText = string); + } + + /** + * Code executed when the mouse wheel is activated + * + * @param e event + */ + private void handleMouseWheel(final Event e) { + if (selectedElement == NONE || dragInProgress) { + e.doit = false; // we are consuming this event + return; + } + previousLowerValue = lowerValue; + previousUpperValue = upperValue; + final int amount = increment * ((e.stateMask & SWT.SHIFT) != 0 ? 10 : (e.stateMask & SWT.CTRL) != 0 ? 2 : 1); + if (selectedElement == BOTH) { + int newLower = lowerValue + e.count * amount; + int newUpper = upperValue + e.count * amount; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - (upperValue - lowerValue); + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + upperValue - lowerValue; + } + upperValue = newUpper; + lowerValue = newLower; + } else if ((selectedElement & LOWER) != 0) { + lowerValue += e.count * amount; + checkLowerValue(); + } else { + upperValue += e.count * amount; + checkUpperValue(); + } + validateNewValues(e); + e.doit = false; // we are consuming this event + } + + /** + * Check if the lower value is in ranges + */ + private void checkLowerValue() { + if (lowerValue < minimum) { + lowerValue = minimum; + } + if (lowerValue > maximum) { + lowerValue = maximum; + } + if (lowerValue > upperValue) { + lowerValue = upperValue; + } + } + + /** + * Check if the upper value is in ranges + */ + private void checkUpperValue() { + if (upperValue < minimum) { + upperValue = minimum; + } + if (upperValue > maximum) { + upperValue = maximum; + } + if (upperValue < lowerValue) { + upperValue = lowerValue; + } + } + + /** + * Draws the widget + * + * @param e paint event + */ + private void drawWidget(final PaintEvent e) { + final Rectangle rect = getClientArea(); + if (rect.width == 0 || rect.height == 0) { + return; + } + e.gc.setAdvanced(true); + e.gc.setAntialias(SWT.ON); + if (orientation == SWT.HORIZONTAL) { + drawHorizontalRangeSlider(e.gc); + } else { + drawVerticalRangeSlider(e.gc); + } + + } + + /** + * Draw the range slider (horizontal) + * + * @param gc graphic context + */ + private void drawHorizontalRangeSlider(final GC gc) { + drawBackgroundHorizontal(gc); + drawBarsHorizontal(gc); + if (lowerHover || (selectedElement & LOWER) != 0) { + coordUpper = drawHorizontalKnob(gc, upperValue, true); + coordLower = drawHorizontalKnob(gc, lowerValue, false); + } else { + coordLower = drawHorizontalKnob(gc, lowerValue, false); + coordUpper = drawHorizontalKnob(gc, upperValue, true); + } + } + + /** + * Draw the background + * + * @param gc graphic context + */ + private void drawBackgroundHorizontal(final GC gc) { + final Rectangle clientArea = getClientArea(); + + gc.setBackground(getBackground()); + gc.fillRectangle(clientArea); + + if (isEnabled()) { + gc.setForeground(getForeground()); + } else { + gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + gc.drawRoundRectangle(minHeight/3+imgWidth, minHeight/3, clientArea.width - 2*(minHeight/3+imgWidth), clientArea.height - 2*minHeight/3+3, 3, 3); + + final float pixelSize = computePixelSizeForHorizontalSlider(); + final int startX = (int) (pixelSize * lowerValue); + final int endX = (int) (pixelSize * upperValue); + if (isEnabled()) { + gc.setBackground(getForeground()); + } else { + gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + gc.fillRectangle(minHeight/3+3 + startX, minHeight/3, endX - startX - 3, clientArea.height - 2*minHeight/3+3); + + } + + /** + * @return how many pixels corresponds to 1 point of value + */ + private float computePixelSizeForHorizontalSlider() { + return (getClientArea().width - 20f) / (maximum - minimum); + } + + /** + * Draw the bars + * + * @param gc graphic context + */ + private void drawBarsHorizontal(final GC gc) { + } + + /** + * Draws an horizontal knob + * + * @param gc graphic context + * @param value corresponding value + * @param upper if true, draws the upper knob. If + * false, draws the lower knob + * @return the coordinate of the upper left corner of the knob + */ + private Point drawHorizontalKnob(final GC gc, final int value, final boolean upper) { + final float pixelSize = computePixelSizeForHorizontalSlider(); + final int x = (int) (pixelSize * value); + Image image; + if (upper) { + if (upperHover) { + image = dragInProgress || (selectedElement & UPPER) != 0 ? sliderDrag : sliderHover; + } else if ((selectedElement & UPPER) != 0 && !lowerHover) { + image = hasFocus ? sliderSelected : sliderHover; + } else { + image = slider; + } + } else { + if (lowerHover) { + image = dragInProgress || (selectedElement & LOWER) != 0 ? sliderDrag : sliderHover; + } else if ((selectedElement & LOWER) != 0 && !upperHover) { + image = hasFocus ? sliderSelected : sliderHover; + } else { + image = slider; + } + } + if (isEnabled()) { + gc.drawImage(image, x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + } else { + final Image temp = new Image(getDisplay(), image, SWT.IMAGE_DISABLE); + gc.drawImage(temp, x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + temp.dispose(); + } + return new Point(x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + } + + /** + * Draw the range slider (vertical) + * + * @param gc graphic context + */ + private void drawVerticalRangeSlider(final GC gc) { + drawBackgroundVertical(gc); + drawBarsVertical(gc); + if (lowerHover || (selectedElement & LOWER) != 0) { + coordUpper = drawVerticalKnob(gc, upperValue, true); + coordLower = drawVerticalKnob(gc, lowerValue, false); + } else { + coordLower = drawVerticalKnob(gc, lowerValue, false); + coordUpper = drawVerticalKnob(gc, upperValue, true); + } + } + + /** + * Draws the background + * + * @param gc graphic context + */ + private void drawBackgroundVertical(final GC gc) { + final Rectangle clientArea = getClientArea(); + gc.setBackground(getBackground()); + gc.fillRectangle(clientArea); + + if (isEnabled()) { + gc.setForeground(getForeground()); + } else { + gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + gc.drawRoundRectangle(9, 9, clientArea.width - 20, clientArea.height - 20, 3, 3); + + final float pixelSize = computePixelSizeForVerticalSlider(); + final int startY = (int) (pixelSize * lowerValue); + final int endY = (int) (pixelSize * upperValue); + if (isEnabled()) { + gc.setBackground(getForeground()); + } else { + gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + gc.fillRectangle(9, 12 + startY, clientArea.width - 20, endY - startY - 6); + + } + + /** + * @return how many pixels corresponds to 1 point of value + */ + private float computePixelSizeForVerticalSlider() { + return (getClientArea().height - 20f) / (maximum - minimum); + } + + /** + * Draws the bars + * + * @param gc graphic context + */ + private void drawBarsVertical(final GC gc) { + final Rectangle clientArea = getClientArea(); + if (isEnabled()) { + gc.setForeground(getForeground()); + } else { + gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); + } + } + + /** + * Draws a vertical knob + * + * @param gc graphic context + * @param value corresponding value + * @param upper if true, draws the upper knob. If + * false, draws the lower knob + * @return the coordinate of the upper left corner of the knob + */ + private Point drawVerticalKnob(final GC gc, final int value, final boolean upper) { + final float pixelSize = computePixelSizeForVerticalSlider(); + final int y = (int) (pixelSize * value); + + Image image; + if (upper) { + if (upperHover) { + image = dragInProgress || (selectedElement & UPPER) != 0 ? vSliderDrag : vSliderHover; + } else if ((selectedElement & UPPER) != 0 && !lowerHover) { + image = hasFocus ? vSliderSelected : vSliderHover; + } else { + image = vSlider; + } + } else { + if (lowerHover) { + image = dragInProgress || (selectedElement & LOWER) != 0 ? vSliderDrag : vSliderHover; + } else if ((selectedElement & LOWER) != 0 && !upperHover) { + image = hasFocus ? vSliderSelected : vSliderHover; + } else { + image = vSlider; + } + } + + if (isEnabled()) { + gc.drawImage(image, getClientArea().width / 2 - 8, y + 4); + } else { + final Image temp = new Image(getDisplay(), image, SWT.IMAGE_DISABLE); + gc.drawImage(temp, getClientArea().width / 2 - 8, y + 4); + temp.dispose(); + } + return new Point(getClientArea().width / 2 - 8, y + 4); + } + + /** + * move the cursor location by the input delta values. + * + * @param xDelta + * @param yDelta + */ + private void moveCursorPosition(int xDelta, int yDelta) { + final Point cursorPosition = getDisplay().getCursorLocation(); + cursorPosition.x += xDelta; + cursorPosition.y += yDelta; + getDisplay().setCursorLocation(cursorPosition); + } + + /** + * Code executed when a key is typed + * + * @param event event + */ + private void handleKeyDown(final Event event) { + // TODO consider API for setting accelerator values + int accelerator = (event.stateMask & SWT.SHIFT) != 0 ? 10 : (event.stateMask & SWT.CTRL) != 0 ? 2 : 1; + if (dragInProgress) { + switch (event.keyCode) { + case SWT.ESC: + startDragPoint = null; + upperValue = startDragUpperValue; + lowerValue = startDragLowerValue; + validateNewValues(event); + dragInProgress = false; + if (!isOn) { + redraw(); + } + event.doit = false; + break; + case SWT.ARROW_UP: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + case SWT.ARROW_LEFT: + if (orientation == SWT.VERTICAL) { + moveCursorPosition(0, -accelerator); + } else { + moveCursorPosition(-accelerator, 0); + } + event.doit = false; + break; + case SWT.ARROW_DOWN: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + case SWT.ARROW_RIGHT: + if (orientation == SWT.VERTICAL) { + moveCursorPosition(0, accelerator); + } else { + moveCursorPosition(accelerator, 0); + } + event.doit = false; + break; + } + return; + } + previousLowerValue = lowerValue; + previousUpperValue = upperValue; + + if (selectedElement == NONE) { + selectedElement = LOWER; + } + switch (event.keyCode) { + case SWT.HOME: + if (selectedElement == BOTH) { + if ((event.stateMask & SWT.SHIFT) != 0) { + lowerValue = maximum - (upperValue - lowerValue); + upperValue = maximum; + } else { + upperValue = minimum + upperValue - lowerValue; + lowerValue = minimum; + } + } else if ((selectedElement & UPPER) != 0) { + upperValue = maximum; + } else { + lowerValue = minimum; + } + break; + case SWT.END: + if (selectedElement == BOTH) { + if ((event.stateMask & SWT.SHIFT) != 0) { + upperValue = minimum + upperValue - lowerValue; + lowerValue = minimum; + } else { + lowerValue = maximum - (upperValue - lowerValue); + upperValue = maximum; + } + } else if ((selectedElement & UPPER) != 0) { + upperValue = lowerValue; + } else { + lowerValue = upperValue; + } + break; + case SWT.PAGE_UP: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + if (selectedElement == BOTH) { + translateValues(pageIncrement * -accelerator); + } else if ((selectedElement & UPPER) != 0) { + upperValue -= pageIncrement * accelerator; + } else { + lowerValue -= pageIncrement * accelerator; + } + break; + case SWT.PAGE_DOWN: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + if (selectedElement == BOTH) { + translateValues(pageIncrement * accelerator); + } else if ((selectedElement & UPPER) != 0) { + upperValue += pageIncrement * accelerator; + } else { + lowerValue += pageIncrement * accelerator; + } + break; + case SWT.ARROW_DOWN: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + case SWT.ARROW_RIGHT: + if (selectedElement == BOTH) { + translateValues(accelerator * increment); + } else if ((selectedElement & UPPER) != 0) { + upperValue += accelerator * increment; + } else { + lowerValue += accelerator * increment; + } + break; + case SWT.ARROW_UP: + accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; + case SWT.ARROW_LEFT: + if (selectedElement == BOTH) { + translateValues(-accelerator * increment); + } else if ((selectedElement & UPPER) != 0) { + upperValue -= accelerator * increment; + } else { + lowerValue -= accelerator * increment; + } + break; + case SWT.TAB: + final boolean next = (event.stateMask & SWT.SHIFT) == 0; + if (next && (selectedElement & LOWER) != 0) { + selectedElement = isFullSelection && selectedElement == LOWER ? BOTH : UPPER; + redraw(); + } else if (!next && (selectedElement & UPPER) != 0) { + selectedElement = isFullSelection && selectedElement == UPPER ? BOTH : LOWER; + redraw(); + } else { + traverse(next ? SWT.TRAVERSE_TAB_NEXT : SWT.TRAVERSE_TAB_PREVIOUS); + } + return; + } + if (previousLowerValue != lowerValue || previousUpperValue != upperValue) { + if (selectedElement == BOTH) { + checkLowerValue(); + checkUpperValue(); + } else if ((selectedElement & UPPER) != 0) { + checkUpperValue(); + } else { + checkLowerValue(); + } + validateNewValues(event); + } + } + + /** + * translate both the upper and lower values by the input amount. The updated + * values are constrained to be within the minimum and maximum. The difference + * between upper and lower values is retained. + * + * @param amount + */ + private void translateValues(int amount) { + int newLower = lowerValue + amount; + int newUpper = upperValue + amount; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - (upperValue - lowerValue); + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + upperValue - lowerValue; + } + upperValue = newUpper; + lowerValue = newLower; + } + + /** + * Adds the listener to the collection of listeners who will be notified when + * the user changes the receiver's value, by sending it one of the messages + * defined in the SelectionListener interface. + *

+ * widgetSelected is called when the user changes the receiver's + * value. widgetDefaultSelected is not called. + *

+ * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #removeSelectionListener + */ + public void addSelectionListener(final SelectionListener listener) { + checkWidget(); + SelectionListenerUtil.addSelectionListener(this, listener); + } + + /** + * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean) + */ + @Override + public Point computeSize(final int wHint, final int hHint, final boolean changed) { + final int width, height; + checkWidget(); + if (orientation == SWT.HORIZONTAL) { + if (wHint < 100) { + width = 100; + } else { + width = wHint; + } + + if (hHint < minHeight) { + height = minHeight; + } else { + height = hHint; + } + } else { + if (wHint < minWidth) { + width = minWidth; + } else { + width = wHint; + } + + if (hHint < 100) { + height = 100; + } else { + height = hHint; + } + } + + return new Point(width, height); + } + + /** + * Returns the amount that the selected receiver's value will be modified by + * when the up/down (or right/left) arrows are pressed. + * + * @return the increment + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getIncrement() { + checkWidget(); + return increment; + } + + /** + * Returns the 'lower selection', which is the lower receiver's position. + * + * @return the selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getLowerValue() { + checkWidget(); + return lowerValue; + } + + /** + * Returns the maximum value which the receiver will allow. + * + * @return the maximum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getMaximum() { + checkWidget(); + return maximum; + } + + /** + * Returns the minimum value which the receiver will allow. + * + * @return the minimum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getMinimum() { + checkWidget(); + return minimum; + } + + /** + * Returns the amount that the selected receiver's value will be modified by + * when the page increment/decrement areas are selected. + * + * @return the page increment + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getPageIncrement() { + checkWidget(); + return pageIncrement; + } + + /** + * Returns the 'selection', which is an array where the first element is the + * lower selection, and the second element is the upper selection + * + * @return the selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int[] getSelection() { + checkWidget(); + final int[] selection = new int[2]; + selection[0] = lowerValue; + selection[1] = upperValue; + return selection; + } + + /** + * Returns the 'upper selection', which is the upper receiver's position. + * + * @return the selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public int getUpperValue() { + checkWidget(); + return upperValue; + } + + /** + * Removes the listener from the collection of listeners who will be notified + * when the user changes the receiver's value. + * + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #addSelectionListener + */ + public void removeSelectionListener(final SelectionListener listener) { + checkWidget(); + SelectionListenerUtil.removeSelectionListener(this, listener); + } + + /** + * Sets the amount that the selected receiver's value will be modified by when + * the up/down (or right/left) arrows are pressed to the argument, which must be + * at least one. + * + * @param increment the new increment (must be greater than zero) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setIncrement(final int increment) { + checkWidget(); + this.increment = increment; + redraw(); + } + + /** + * Sets the 'lower selection', which is the receiver's lower value, to the input + * argument which must be less than or equal to the current 'upper selection' + * and greater or equal to the minimum. If either condition fails, no action is + * taken. + * + * @param value the new lower selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * @see #getUpperValue() + * @see #getMinimum() + * @see #setSelection(int, int) + */ + public void setLowerValue(final int value) { + setSelection(value, upperValue); + } + + /** + * Sets the maximum value that the receiver will allow. This new value will be + * ignored if it is not greater than the receiver's current minimum value. If + * the new maximum is applied then the receiver's selection value will be + * adjusted if necessary to fall within its new range. + * + * @param value the new maximum, which must be greater than the current minimum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * @see #setExtrema(int, int) + */ + public void setMaximum(final int value) { + setExtrema(minimum, value); + } + + /** + * Sets the minimum value that the receiver will allow. This new value will be + * ignored if it is negative or is not less than the receiver's current maximum + * value. If the new minimum is applied then the receiver's selection value will + * be adjusted if necessary to fall within its new range. + * + * @param value the new minimum, which must be nonnegative and less than the + * current maximum + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * @see #setExtrema(int, int) + */ + public void setMinimum(final int value) { + setExtrema(value, maximum); + } + + /** + * Sets the minimum and maximum values that the receiver will allow. The new + * values will be ignored if either are negative or the min value is not less + * than the max. The receiver's selection values will be adjusted if necessary + * to fall within the new range. + * + * @param min the new minimum, which must be nonnegative and less than the max + * @param max the new maximum, which must be greater than the min + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setExtrema(final int min, final int max) { + checkWidget(); + if (min >= 0 && min < max && (min != minimum || max != maximum)) { + minimum = min; + maximum = max; + if (lowerValue < minimum) { + lowerValue = minimum; + } else if (lowerValue > maximum) { + lowerValue = maximum; + } + if (upperValue < minimum) { + upperValue = minimum; + } else if (upperValue > maximum) { + upperValue = maximum; + } + redraw(); + } + } + + /** + * Sets the amount that the receiver's value will be modified by when the page + * increment/decrement areas are selected to the argument, which must be at + * least one. + * + * @param pageIncrement the page increment (must be greater than zero) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setPageIncrement(final int pageIncrement) { + checkWidget(); + this.pageIncrement = pageIncrement; + redraw(); + } + + /** + * Sets the 'selection', which is the receiver's value. The lower value must be + * less than or equal to the upper value. Additionally, both values must be + * inclusively between the slider minimum and maximum. If either condition + * fails, no action is taken. + * + * @param value the new selection (first value is lower value, second value is + * upper value) + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ */ + public void setSelection(final int[] values) { + if (values.length == 2) { + setSelection(values[0], values[1]); + } + } + + /** + * Sets the 'selection', which is the receiver's value. The lower value must be + * less than or equal to the upper value. Additionally, both values must be + * inclusively between the slider minimum and maximum. If either condition + * fails, no action is taken. + * + * @param lowerValue the new lower selection + * @param upperValue the new upper selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * @see #getMinimum() + * @see #getMaximum() + */ + public void setSelection(final int lowerValue, final int upperValue) { + checkWidget(); + if (lowerValue <= upperValue && lowerValue >= minimum && upperValue <= maximum && (this.lowerValue != lowerValue || this.upperValue != upperValue)) { + this.lowerValue = lowerValue; + this.upperValue = upperValue; + redraw(); + } + } + + /** + * Sets the 'upper selection', which is the upper receiver's value, to the input + * argument which must be greater than or equal to the current 'lower selection' + * and less or equal to the maximum. If either condition fails, no action is + * taken. + * + * @param value the new upper selection + * + * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * @see #getLowerValue() + * @see #getMaximum() + * @see #setSelection(int, int) + */ + public void setUpperValue(final int value) { + setSelection(lowerValue, value); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ReflectionUtils.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ReflectionUtils.java new file mode 100644 index 0000000..93e97c6 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ReflectionUtils.java @@ -0,0 +1,48 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflectionUtils { + /** + * Call a method using introspection (so ones can call a private or protected method) + * @param object object on which the method will be called + * @param methodName method name + * @param args arguments of this method (can be null) + * @return the value returned by this method (if this method returns a value) + */ + public static Object callMethod(final Object object, final String methodName, final Object... args) { + if (object == null) { + return null; + } + final Class[] array = new Class[args == null ? 0 : args.length]; + int index = 0; + if (args != null) { + for (final Object o : args) { + array[index++] = o == null ? Object.class : o.getClass(); + } + } + + return callMethodWithClassType(object, methodName, array, args); + } + + private static Object callMethodWithClassType(final Object object, final String methodName, final Class[] array, final Object... args) { + Class currentClass = object.getClass(); + Method method = null; + while (currentClass != null) { + try { + method = currentClass.getDeclaredMethod(methodName, array); + break; + } catch (final NoSuchMethodException nsme) { + currentClass = currentClass.getSuperclass(); + } + } + + try { + method.setAccessible(true); + return method.invoke(object, args); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/SelectionListenerUtil.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/SelectionListenerUtil.java new file mode 100644 index 0000000..273eca2 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/SelectionListenerUtil.java @@ -0,0 +1,74 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.TypedListener; + +public class SelectionListenerUtil { + /** + * Add a SelectionListener to a given Control + * + * @param control control on which the selection listener is added + * @param listener listener to add + */ + public static void addSelectionListener(final Control control, final SelectionListener listener) { + if (listener == null) { + SWT.error(SWT.ERROR_NULL_ARGUMENT); + } + TypedListener typedListener = new TypedListener(listener); + control.addListener(SWT.Selection, typedListener); + } + + /** + * Remove a SelectionListener of a given Control + * + * @param control control on which the selection listener is removed + * @param listener listener to remove + */ + public static void removeSelectionListener(final Control control, final SelectionListener listener) { + if (listener == null) { + SWT.error(SWT.ERROR_NULL_ARGUMENT); + } + final Listener[] listeners = control.getListeners(SWT.Selection); + for (Listener l : listeners) { + if (l instanceof TypedListener) { + TypedListener typedListener = (TypedListener) l; + if (typedListener.getEventListener() == listener) { + ReflectionUtils.callMethod(control, "removeListener", SWT.Selection, ((TypedListener) l).getEventListener()); + return; + } + } + } + } + + /** + * Fire the selection listeners of a given control + * + * @param control the control that fires the event + * @param sourceEvent mouse event + * @return true if the selection could be changed, false otherwise + */ + public static boolean fireSelectionListeners(final Control control, final Event sourceEvent) { + for (final Listener listener : control.getListeners(SWT.Selection)) { + final Event event = new Event(); + + event.button = sourceEvent==null?1:sourceEvent.button; + event.display = control.getDisplay(); + event.item = null; + event.widget = control; + event.data = sourceEvent == null ? null : sourceEvent.data; + event.time = sourceEvent == null ? 0 : sourceEvent.time; + event.x = sourceEvent == null ? 0 : sourceEvent.x; + event.y = sourceEvent == null ? 0 : sourceEvent.y; + event.type = SWT.Selection; + + listener.handleEvent(event); + if (!event.doit) { + return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png new file mode 100644 index 0000000000000000000000000000000000000000..96b446605ebf85c7142eb9ec096460ba2a9b330a GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~Unv^o$cHPZFwf!uL_esT;#rYmU(lg^$`c4sSKX3elF{r5}E*Evu=$5 literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e809d370116b96a15258bb1e0551101f8bc2d74d GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~f)_POe%sw|Iw383oe`7fwavx4 q6W*+l74C_@$!4K{RdLdXyWCG1nK!En^U45CW$<+Mb6Mw<&;$VPI%^*Q literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png new file mode 100644 index 0000000000000000000000000000000000000000..2011d9b40b5cafb987a58f3af01a9333f3905fce GIT binary patch literal 1057 zcmeAS@N?(olHy`uVBq!ia0vp^f5hcz=sfi_-`FRQA=g;4G z^F4Xp-d-vn-?nmE0{``CV`Oh!E{#|)Y>t zcRv2Ubm`KMKmVS7`SakxgXq?!XKp?D_4i*$-Mnw#zHK^o73iH&Fd71shd_Aha}%H` zj3q&S!3+-1ZlnP@v7RoDAr-fh6Amz#g>5QO&^>hM)PaP&#H1DLSFc^UZjp+*-WgVr zNn1@!jV@ficqt%s+H`>jPm>(Q0w;((d6wcPI8o@)!vv@B!{<8E_^hR8#s0}r_&!7V ej`A^f5eA09t-?MpMSGru-0tb>=d#Wzp$Pyk5hcz=sfi_-`FRQRdO?fI8VrJbhi+Z*%hqsp)k# z8VUe~I14-?iy0XB4uLSEsD@VqP>?0v(btiIVPik{pF~y$24;o;pAgso|Np;u_qluR z(Z#Da+`4t^=g*%{-+ZcDdT8?Q>waaEC(l|iZSRej-~RZNOnmX-ThprJufF}=`rx~F z@x&PmmOXp+tY^!`nfq_P{{DBzqo3>U{Rpd@ef8>9oBEA!zW?3z_}8WfKhK{(|Mthf zZI6Dx`|)qrlRszAp8fj!-;MWwzWx4p`{SSQfBxP3^ykN)e~&)@dHUt=&p-d3fBk#u z(xsn&|GoV7_rZe)8FLO@c=-0$-+zfycYpi#ZO4VjK#z=q(GZ|k2pl}0t_(Dbu_VYZ zn8D%MjWi%9*3-o?q~ca`!U2XbF{1(n)iZ}q9Z1MZTe5!f;-w3ht5hcz=sfi_-`FRQXI+2kK-m@$_|Nzs=1fq^AF` zjj;_V#981GS*8o|0J?9FfcO&_=LFr|NsB(+qX-W zELpj7<*i${e*XOV`t|EMbLMQ?v?(_?cjnBQTefWZ{P}ZscJ{k>?-njx_~px&>({Sm zWo6BqH}BcAXRBAQ-nMPq&6_u`T)9$OT6*>B)q;Y8uV24jyLRpT`SWMbp8fUf*PAzQ ze*gac{{8z8A3l8i`0>)EOMm|S`Sj`2g9i^LOqg)@?%mGL&Trqooj!dU=*Uqp8UpkT zfpaT@Y=QPMmIV0)GdMiEkp|>Md%8G=RNP8VIKWV4b*Vr>^UR@B2No<{yN-p0i_6H! zD9I_tK{2zGH&is$&eg2YQH(J!PERaFFtU&_&o50xkke6)Pp!oCO;5(N4VxF5hcz=sfi_-`FRQKieMtHhuDU*ONas@BiL-|Ht;@-`gMm*nRqY@6#Xq&wn3%{$u~;@6#`T z9lrj3{`IfJx4$pH{mqzj$l=Z#$M1i4TzCw0)hHMZfdLEw{km1EKu&+{$d z*J+F)j$@L|k%jjdW3~osEsaKll_ASm?o=3KXti1^Kr4lE?vJ4?%XLMTk^KNRS(fGM zlPb&jTyJgk&N-^8A|Z-M+iea-@ZRISCxn1=j%KsTH%r9(>}T^$4FCWD07*qoM6N<$ Ef-c3JVgLXD literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png new file mode 100644 index 0000000000000000000000000000000000000000..558f9bd8c979be89c1625127ce3c88847c45428f GIT binary patch literal 386 zcmV-|0e$|7P)4f26vgrXz4OLqBLrMTNU@MMm93-=1QJ3NY^*IqAR(}wsQ5XoB?JU3KZC7>ogW|s z=IuD^%;ep7pG7tSC7$LqzjMekvu`|J<3CZEtyf>?uRj9yy}~!2mLK1Lmihe6`F%)B zE{vnHzyIpx+1cAq|02bqX$HCuwzr?ZI6Zy$*OTIf*d$^!77Jl(Ywz&ns8srfDiRHg*q=k3W0{>Oh7?bbcG8R4{|<>x#99J9|e*`X%6nc2QVbAtfOtNJ%hz zz;ya-H{j4lq0352U?wXlOeRVwE_AKZW?e0XWP&AS7?gm+uePG~KuSW+f|+7T==&Au zmx0a#W`boUo09$Zp+Mi&EInYRxZeOT$}m<0Tp0VBKG$Tw0bZ0+lyRsCRGBBUOD3fv gyWm;w`qA`?KQM~Ctzq%VNdN!<07*qoM6N<$f*$CpmjD0& literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png new file mode 100644 index 0000000000000000000000000000000000000000..e37e735e502b7acb6e1d625a46287de40c4b4d20 GIT binary patch literal 366 zcmV-!0g?WRP)j!H;O&wemz9dZ^@hMa_yU~KfAPw6 M07*qoM6N<$f{SaUu>b%7 literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_lt.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_lt.png new file mode 100644 index 0000000000000000000000000000000000000000..237be7f3752ab84b25db8374f5847fe4adf72be8 GIT binary patch literal 345 zcmV-f0jBiG~f_AQAk{u*_uvWL=5?n#b6ay&&HjeY-yYF3# ziNk>L!r>O@I~UHyo1wgOcFaE$nc->tmOefKM+b>;d8OMd)5T)(d=Ls3BmLOzbhFv$ zd_I5q1BLUEZnI3YEYtORt!bLRb|H%@bzS3uIF6akW_PM;mdoV>;4BJtRUtqK0b>l) z>GW1r&1$u}x4OR|fcL)DWHPw{B8w_jRpC_e-V;J-q49WpZBZ!85&=Y{HAMsw!Gcni zCEu!u2qA>lG{!V7ilS(NZaPU4ECGt5pzb7p6-7~V;VaLnLclqPh_t)c>oq|BnN#@2 r=xQ(+UopbyE9pCRGGRBm-00000NkvXXu0mjf^cIxB literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png new file mode 100644 index 0000000000000000000000000000000000000000..2d88c1afbd14dea934b22941e9beda11fe12abb4 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0vp^AhsX}GmyOe_w02brB~t_QQ};bnpl#VpQjL#nVZT` zoS3VpU}&U}mtUr*U}Ruus9#HaCxutg6yO z_60y8&H|6fVg?4jLmgEw{G3~`Sa(Km+wlZtf^hJ$2Fy9;`BKUOZT0B{MI?S`q|r$l`}UsF57?c>4%ub zC!G?jrp;aW?Af#C#k*Tp9J>7cQ|g*a0SnLg=C)qFdQ~T>``W87S(|P~t-5;t{P`Pi zz9(z`#ezr6nbcf-AJ?|%H<{pkD0pMQ@(|M}(Dze{g^ef$0I z&d1-EE?xTZ=ik#We;zz|5Z$`;%&jNC{{9Q8oA>S8w@t^c0=+W|Mniz|5C~6wZUQug zu_VYZn8D%MjWi&q($mE;q~ezBvD-pU0TK-t_h0Jd3lYvTtG?hd$z;~rW54ag_g%X> z>7K@nxFaR{w)Tp;6L8^A*PJx*6cf*h7c{O#9lv;C zv3$#NgAeDGX0Lty)~38(VB*a?k(SxFC;b=qzC9~QvRC~L`~4fjKHbZ!3_#HaCxutoSRl zFa@9xXMsm#F#`kNArNL1)$nQn3bLd-`Z_W&Z0zU$lgP@zz|0Wf6XN>+|Nj^7K6kG@ zx_H%wTeoig{Q2|gn@@F14^7^E-LGu&u)wjP}AAI*N zo;YK{vS-hp^=!E~bN|iP-~aA-^mE<4A7OQ~uU@@sQ@`=e_rJRy|JwB6=lS#J-~RZw z?a}XdKmP4{^5^W?vtNJzyYc?dx8MJ6fBf_P&%b-0{`~m!@6qQ!Prv;A`RCvBuYWIH zy7cq!zn9oVw+6e2tfeOw;3CY_U_V zu!Pw!{o&7f9C{4ftP2I)uebfYSNN8fJA3Q1f0MF=mMru=Zv*n1r>mdKI;Vst00{B; A;s5{u literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4c5098ca95cb10882ccfe36902fac9a8de247103 GIT binary patch literal 1072 zcmeAS@N?(olHy`uVBq!ia0vp^AhsX}GmyOe_w02brB~t_QQ};bnpl#VpQjL#nVZT` zoS3VpU}&U}mtUr*U}Ruus9PU}#{lVd@EapicG@PhVH|+uS@tvK;Al z(N}>&oCO|{#S9F5hd`K7RKu$QD9DoT=wtDsIZQHipym|A=l`EyCrB|C>lyjvNJ}AwbU% zIJY9m7HA)1NswPKgTu2MX+Tbnr;B4q#Vyri(R@t?BCH3L!veY@RDwJ+4><<~^ZbsV zH|O?GsW%q`?=ysN;i+?XWdL(wZ7v`&G9Yemb}k??FflP8F*!OgHaamgAS*C2FfbqQ{ks4F00(qQ zO+^RW3k(tqC(w7(TL1t632;bRa{vGi!vFvd!vV){sAK>D00d`2O+f$vv5yP`8-0VU3{kYKMw+mZv00001bW%=J06^y0W&i*HY)M2x zRCwAg#?cl+KmbM2TP7hij3h~tM*jZ?bFB8$*5WPvBKi4?*-Li%V6tn+H%2dispose() method to - * release the operating system resources managed by cached objects when those - * objects and OS resources are no longer needed. - * - * This class may be freely distributed as part of any application or plugin. - *

- * - * @author scheglov_ke - * @author Dan Rubel - * @author Wim Jongman - */ -public class ResourceManager extends SWTResourceManager { - - /** - * The map where we store our images. - */ - private static Map m_descriptorImageMap = new HashMap(); - - /** - * Returns an {@link ImageDescriptor} stored in the file at the specified path - * relative to the specified class. - * - * @param clazz the {@link Class} relative to which to find the image - * descriptor. - * @param path the path to the image file. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - */ - public static ImageDescriptor getImageDescriptor(Class clazz, String path) { - return ImageDescriptor.createFromFile(clazz, path); - } - - /** - * Returns an {@link ImageDescriptor} stored in the file at the specified path. - * - * @param path the path to the image file. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - */ - public static ImageDescriptor getImageDescriptor(String path) { - try { - return ImageDescriptor.createFromURL(new File(path).toURI().toURL()); - } catch (MalformedURLException e) { - return null; - } - } - - /** - * Returns an {@link Image} based on the specified {@link ImageDescriptor}. - * - * @param descriptor the {@link ImageDescriptor} for the {@link Image}. - * @return the {@link Image} based on the specified {@link ImageDescriptor}. - */ - public static Image getImage(ImageDescriptor descriptor) { - if (descriptor == null) { - return null; - } - Image image = m_descriptorImageMap.get(descriptor); - if (image == null) { - image = descriptor.createImage(); - m_descriptorImageMap.put(descriptor, image); - } - return image; - } - - /** - * Maps images to decorated images. - */ - @SuppressWarnings("unchecked") - private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; - - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage the base {@link Image} that should be decorated. - * @param decorator the {@link Image} to decorate the base image. - * @return {@link Image} The resulting decorated image. - */ - public static Image decorateImage(Image baseImage, Image decorator) { - return decorateImage(baseImage, decorator, BOTTOM_RIGHT); - } - - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage - * the base {@link Image} that should be decorated. - * @param decorator - * the {@link Image} to decorate the base image. - * @param corner - * the corner to place decorator image. - * @return the resulting decorated {@link Image}. - */ - public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { - if (corner <= 0 || corner >= LAST_CORNER_KEY) { - throw new IllegalArgumentException("Wrong decorate corner"); - } - Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; - if (cornerDecoratedImageMap == null) { - cornerDecoratedImageMap = new HashMap>(); - m_decoratedImageMap[corner] = cornerDecoratedImageMap; - } - Map decoratedMap = cornerDecoratedImageMap.get(baseImage); - if (decoratedMap == null) { - decoratedMap = new HashMap(); - cornerDecoratedImageMap.put(baseImage, decoratedMap); - } - // - Image result = decoratedMap.get(decorator); - if (result == null) { - final Rectangle bib = baseImage.getBounds(); - final Rectangle dib = decorator.getBounds(); - final Point baseImageSize = new Point(bib.width, bib.height); - CompositeImageDescriptor compositImageDesc = new CompositeImageDescriptor() { - @Override - protected void drawCompositeImage(int width, int height) { - drawImage(createCachedImageDataProvider(baseImage), 0, 0); - if (corner == TOP_LEFT) { - drawImage(getUnzoomedImageDataProvider(decorator.getImageData()) , 0, 0); - } else if (corner == TOP_RIGHT) { - drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), bib.width - dib.width, 0); - } else if (corner == BOTTOM_LEFT) { - drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), 0, bib.height - dib.height); - } else if (corner == BOTTOM_RIGHT) { - drawImage(getUnzoomedImageDataProvider(decorator.getImageData()), bib.width - dib.width, bib.height - dib.height); - } - } - @Override - protected Point getSize() { - return baseImageSize; - } - }; - // - result = compositImageDesc.createImage(); - decoratedMap.put(decorator, result); - } - return result; - } - - private static ImageDataProvider getUnzoomedImageDataProvider(ImageData imageData) { - return zoom -> zoom == 100 ? imageData : null; - } - - - /** - * Dispose all of the cached images. - */ - public static void disposeImages() { - SWTResourceManager.disposeImages(); - // dispose ImageDescriptor images - { - for (Iterator I = m_descriptorImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_descriptorImageMap.clear(); - } - // dispose decorated images - for (int i = 0; i < m_decoratedImageMap.length; i++) { - Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; - if (cornerDecoratedImageMap != null) { - for (Map decoratedMap : cornerDecoratedImageMap.values()) { - for (Image image : decoratedMap.values()) { - image.dispose(); - } - decoratedMap.clear(); - } - cornerDecoratedImageMap.clear(); - } - } - // dispose plugin images - { - for (Iterator I = m_URLImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_URLImageMap.clear(); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // Plugin images support - // - //////////////////////////////////////////////////////////////////////////// - /** - * Maps URL to images. - */ - private static Map m_URLImageMap = new HashMap(); - - /** - * Provider for plugin resources, used by WindowBuilder at design time. - */ - public interface PluginResourceProvider { - URL getEntry(String symbolicName, String path); - } - - /** - * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design - * time. - */ - private static PluginResourceProvider m_designTimePluginResourceProvider = null; - - /** - * Returns an {@link Image} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the image - * @param name the path to the image within the plugin - * @return the {@link Image} stored in the file at the specified path - * - * @deprecated Use {@link #getPluginImage(String, String)} instead. - */ - @Deprecated - public static Image getPluginImage(Object plugin, String name) { - try { - URL url = getPluginImageURL(plugin, name); - if (url != null) { - return getPluginImageFromUrl(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link Image} based on a {@link Bundle} and resource entry path. - * - * @param symbolicName the symbolic name of the {@link Bundle}. - * @param path the path of the resource entry. - * @return the {@link Image} stored in the file at the specified path. - */ - public static Image getPluginImage(String symbolicName, String path) { - try { - URL url = getPluginImageURL(symbolicName, path); - if (url != null) { - return getPluginImageFromUrl(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link Image} based on given {@link URL}. - */ - private static Image getPluginImageFromUrl(URL url) { - try { - try { - String key = url.toExternalForm(); - Image image = m_URLImageMap.get(key); - if (image == null) { - InputStream stream = url.openStream(); - try { - image = getImage(stream); - m_URLImageMap.put(key, image); - } finally { - stream.close(); - } - } - return image; - } catch (Throwable e) { - // Ignore any exceptions - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link ImageDescriptor} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the image. - * @param name the path to th eimage within the plugin. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - * - * @deprecated Use {@link #getPluginImageDescriptor(String, String)} instead. - */ - @Deprecated - public static ImageDescriptor getPluginImageDescriptor(Object plugin, String name) { - try { - try { - URL url = getPluginImageURL(plugin, name); - return ImageDescriptor.createFromURL(url); - } catch (Throwable e) { - // Ignore any exceptions - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link ImageDescriptor} based on a {@link Bundle} and resource - * entry path. - * - * @param symbolicName the symbolic name of the {@link Bundle}. - * @param path the path of the resource entry. - * @return the {@link ImageDescriptor} based on a {@link Bundle} and resource - * entry path. - */ - public static ImageDescriptor getPluginImageDescriptor(String symbolicName, String path) { - try { - URL url = getPluginImageURL(symbolicName, path); - if (url != null) { - return ImageDescriptor.createFromURL(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - - /** - * Returns an {@link URL} based on a {@link Bundle} and resource entry path. - */ - private static URL getPluginImageURL(String symbolicName, String path) { - // try runtime plugins - { - Bundle bundle = Platform.getBundle(symbolicName); - if (bundle != null) { - return bundle.getEntry(path); - } - } - // try design time provider - if (m_designTimePluginResourceProvider != null) { - return m_designTimePluginResourceProvider.getEntry(symbolicName, path); - } - // no such resource - return null; - } - - /** - * Returns an {@link URL} based on a plugin and file path. - * - * @param plugin the plugin {@link Object} containing the file path. - * @param name the file path. - * @return the {@link URL} representing the file at the specified path. - * @throws Exception - */ - private static URL getPluginImageURL(Object plugin, String name) throws Exception { - // try to work with 'plugin' as with OSGI BundleContext - try { - Class BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$ - Class BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$ - if (BundleContextClass.isAssignableFrom(plugin.getClass())) { - Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$ - Object bundle = getBundleMethod.invoke(plugin, new Object[0]); - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); - Object path = pathConstructor.newInstance(new Object[] { name }); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Class PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$ - Method findMethod = PlatformClass.getMethod("find", new Class[] { BundleClass, IPathClass }); //$NON-NLS-1$ - return (URL) findMethod.invoke(null, new Object[] { bundle, path }); - } - } catch (Throwable e) { - // Ignore any exceptions - } - // else work with 'plugin' as with usual Eclipse plugin - { - Class PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$ - if (PluginClass.isAssignableFrom(plugin.getClass())) { - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[] { String.class }); - Object path = pathConstructor.newInstance(new Object[] { name }); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Method findMethod = PluginClass.getMethod("find", new Class[] { IPathClass }); //$NON-NLS-1$ - return (URL) findMethod.invoke(plugin, new Object[] { path }); - } - } - return null; - } - - //////////////////////////////////////////////////////////////////////////// - // - // General - // - //////////////////////////////////////////////////////////////////////////// - /** - * Dispose of cached objects and their underlying OS resources. This should only - * be called when the cached objects are no longer needed (e.g. on application - * shutdown). - */ - public static void dispose() { - disposeColors(); - disposeFonts(); - disposeImages(); - } -} \ No newline at end of file From f9be6758e27a244781880e22b0547215760877be Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 3 Jan 2022 21:46:40 +0100 Subject: [PATCH 04/28] implement scrollbar adapter and first version of zooming scrollbar --- .../icons/bullet_left.png | Bin 307 -> 0 bytes .../icons/bullet_right.png | Bin 307 -> 0 bytes .../database/ui/swt/internal/IScrollBar.java | 37 ++++ .../internal/IWaveformScrollBarProvider.java | 7 + .../ui/swt/internal/ScrollBarAdapter.java | 83 ++++++++ .../ui/swt/internal/WaveformCanvas.java | 49 +++-- .../ui/swt/internal/WaveformView.java | 48 ++--- .../ui/swt/internal/ZoomingScrollbar.java | 108 ---------- .../ui/swt/internal/slider/ActionTimer.java | 35 ++++ .../ui/swt/internal/slider/ImageButton.java | 191 ++++++++++++------ .../ui/swt/internal/slider/RangeSlider.java | 60 +++--- .../swt/internal/slider/ZoomingScrollbar.java | 110 ++++++++++ .../ui/swt/internal/slider/arrow_left.png | Bin 0 -> 352 bytes .../swt/internal/slider/arrow_left_hover.png | Bin 0 -> 326 bytes .../internal/slider/arrow_left_pressed.png | Bin 0 -> 352 bytes .../ui/swt/internal/slider/arrow_right.png | Bin 0 -> 305 bytes .../swt/internal/slider/arrow_right_hover.png | Bin 0 -> 302 bytes .../internal/slider/arrow_right_pressed.png | Bin 0 -> 339 bytes .../ui/swt/internal/slider/bullet_left.png | Bin 307 -> 0 bytes .../ui/swt/internal/slider/bullet_right.png | Bin 307 -> 0 bytes .../ui/swt/internal/slider/marker_l.png | Bin 0 -> 374 bytes .../ui/swt/internal/slider/marker_l_bl.png | Bin 0 -> 353 bytes .../ui/swt/internal/slider/marker_l_bl_lt.png | Bin 0 -> 343 bytes .../ui/swt/internal/slider/marker_l_lt.png | Bin 0 -> 385 bytes 24 files changed, 468 insertions(+), 260 deletions(-) delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ActionTimer.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left_hover.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left_pressed.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_hover.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_pressed.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_lt.png diff --git a/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png b/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_left.png deleted file mode 100644 index 96b446605ebf85c7142eb9ec096460ba2a9b330a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~Unv^o$cHPZFwf!uL_esT;#rYmU(lg^$`c4sSKX3elF{r5}E*Evu=$5 diff --git a/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png b/plugins/com.minres.scviewer.database.ui.swt/icons/bullet_right.png deleted file mode 100644 index e809d370116b96a15258bb1e0551101f8bc2d74d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~f)_POe%sw|Iw383oe`7fwavx4 q6W*+l74C_@$!4K{RdLdXyWCG1nK!En^U45CW$<+Mb6Mw<&;$VPI%^*Q diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java new file mode 100644 index 0000000..9db93b6 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java @@ -0,0 +1,37 @@ +package com.minres.scviewer.database.ui.swt.internal; + +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; + +public interface IScrollBar { + + void setSelection(int i); + + int getSelection(); + + void setEnabled(boolean b); + + void setVisible(boolean b); + + void addSelectionListener(SelectionListener selectionListener); + + void setIncrement(int i); + + void setPageIncrement(int width); + + void setMinimum(int i); + + void setMaximum(int width); + + int getMaximum(); + + void setThumb(int clientWidthw); + + Point getSize(); + + int getStyle(); + + boolean isVisible(); + +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java new file mode 100644 index 0000000..11c8b97 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java @@ -0,0 +1,7 @@ +package com.minres.scviewer.database.ui.swt.internal; + +public interface IWaveformScrollBarProvider { + + IScrollBar getHorizontalSb(); + IScrollBar getVerticalSb(); +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java new file mode 100644 index 0000000..69e98e9 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java @@ -0,0 +1,83 @@ +package com.minres.scviewer.database.ui.swt.internal; + +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.ScrollBar; + +public class ScrollBarAdapter implements IScrollBar { + + ScrollBar delegate; + public ScrollBarAdapter(ScrollBar delegate) { + this.delegate=delegate; + } + + @Override + public void setSelection(int i) { + delegate.setSelection(i); + } + + @Override + public int getSelection() { + return delegate.getSelection(); + } + + @Override + public void setEnabled(boolean b) { + delegate.setEnabled(b); + } + + @Override + public void setVisible(boolean b) { + delegate.setVisible(b); + } + + @Override + public void addSelectionListener(SelectionListener selectionListener) { + delegate.addSelectionListener(selectionListener); } + + @Override + public void setIncrement(int i) { + delegate.setIncrement(i); + } + + @Override + public void setPageIncrement(int width) { + delegate.setPageIncrement(width); + } + + @Override + public void setMinimum(int i) { + delegate.setMinimum(i); + } + + @Override + public void setMaximum(int width) { + delegate.setMaximum(width); + } + + @Override + public int getMaximum() { + return delegate.getMaximum(); + } + + @Override + public void setThumb(int clientWidthw) { + delegate.setThumb(clientWidthw); + } + + @Override + public Point getSize() { + return delegate.getSize(); + } + + @Override + public int getStyle() { + return delegate.getStyle(); + } + + @Override + public boolean isVisible() { + return delegate.isVisible(); + } + +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index cc8eb37..4add590 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -31,7 +31,6 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.ScrollBar; import com.google.common.collect.Lists; import com.minres.scviewer.database.EventEntry; @@ -81,6 +80,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ private List cursorPainters; + IScrollBar horizontal; + IScrollBar vertical; + HashMap wave2painterMap; /** * Constructor for ScrollableCanvas. @@ -90,8 +92,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ * @param style * the style of this control. */ - public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider) { - super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL); + public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider, IWaveformScrollBarProvider scrollbarProvider) { + super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND); this.styleProvider=styleProvider; addControlListener(new ControlAdapter() { /* resize listener. */ @Override @@ -106,6 +108,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ cursorPainters= new ArrayList<>(); wave2painterMap=new HashMap<>(); + horizontal = (style& SWT.H_SCROLL)==0?scrollbarProvider.getHorizontalSb() : new ScrollBarAdapter(getHorizontalBar()); + vertical = (style& SWT.V_SCROLL)==0?scrollbarProvider.getVerticalSb() : new ScrollBarAdapter(getVerticalBar()); initScrollBars(); // order is important: it is bottom to top trackAreaPainter=new TrackAreaPainter(this); @@ -149,12 +153,10 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setOrigin(int x, int y) { checkWidget(); - ScrollBar hBar = getHorizontalBar(); - if(x<=0) hBar.setSelection(-x); - x = -hBar.getSelection(); - ScrollBar vBar = getVerticalBar(); - if(y<=0) vBar.setSelection(-y); - y = -vBar.getSelection(); + if(x<=0) horizontal.setSelection(-x); + x = -horizontal.getSelection(); + if(y<=0) vertical.setSelection(-y); + y = -vertical.getSelection(); origin.x = x; origin.y = y; syncScrollBars(); @@ -284,7 +286,6 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ /* Initialize the scrollbar and register listeners. */ private void initScrollBars() { - ScrollBar horizontal = getHorizontalBar(); horizontal.setEnabled(false); horizontal.setVisible(true); horizontal.addSelectionListener(new SelectionAdapter() { @@ -292,10 +293,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void widgetSelected(SelectionEvent event) { if (painterList.isEmpty()) return; - setOrigin(-((ScrollBar) event.widget).getSelection(), origin.y); + setOrigin(-horizontal.getSelection(), origin.y); } }); - ScrollBar vertical = getVerticalBar(); vertical.setEnabled(false); vertical.setVisible(true); vertical.addSelectionListener(new SelectionAdapter() { @@ -303,7 +303,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void widgetSelected(SelectionEvent event) { if (painterList.isEmpty()) return; - setOrigin(origin.x, -((ScrollBar) event.widget).getSelection()); + setOrigin(origin.x, -vertical.getSelection()); } }); } @@ -321,10 +321,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ int height = trackAreaPainter.getHeight(); // incl. Ruler long width = maxTime / scaleFactor; Rectangle clientArea=getClientArea(); - ScrollBar horizontal = getHorizontalBar(); - horizontal.setIncrement(getClientArea().width / 100); - horizontal.setPageIncrement(getClientArea().width); int clientWidthw = clientArea.width; + horizontal.setIncrement(clientWidthw / 100); + horizontal.setPageIncrement(clientWidthw/2); if (width > clientWidthw) { /* image is wider than client area */ horizontal.setMinimum(0); horizontal.setMaximum((int)width); @@ -338,10 +337,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ horizontal.setThumb(clientWidthw); horizontal.setSelection(-origin.x); - ScrollBar vertical = getVerticalBar(); - vertical.setIncrement(getClientArea().height / 100); - vertical.setPageIncrement(getClientArea().height); int clientHeighth = clientArea.height; + vertical.setIncrement(clientHeighth / 100); + vertical.setPageIncrement(clientHeighth/2); if (height > clientHeighth) { /* image is higher than client area */ vertical.setMinimum(0); vertical.setMaximum(height); @@ -437,8 +435,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ int lower = (int) (tx.getBeginTime() / scaleFactor); int higher = (int) (tx.getEndTime() / scaleFactor); Point size = getSize(); - size.x -= getVerticalBar().getSize().x + 2; - size.y -= getHorizontalBar().getSize().y; + size.x -= vertical.getSize().x + 2; + size.y -= horizontal.getSize().y; if (lower < -origin.x) { setOrigin(-lower, origin.y); } else if (higher > (size.x - origin.x)) { @@ -467,9 +465,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ if(te.waveform == waveform) { Point size = getSize(); size.y -=+rulerHeight; - ScrollBar sb = getHorizontalBar(); - if((sb.getStyle()&SWT.SCROLLBAR_OVERLAY)!=0 && sb.isVisible()) - size.y-= getHorizontalBar().getSize().y; + if((horizontal.getStyle()&SWT.SCROLLBAR_OVERLAY)!=0 && horizontal.isVisible()) + size.y-= horizontal.getSize().y; int top = te.vOffset; int bottom = top + styleProvider.getTrackHeight(); if (top < -origin.y) { @@ -484,8 +481,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void reveal(long time) { int scaledTime = (int) (time / scaleFactor); Point size = getSize(); - size.x -= getVerticalBar().getSize().x + 2; - size.y -= getHorizontalBar().getSize().y; + size.x -= vertical.getSize().x + 2; + size.y -= horizontal.getSize().y; if (scaledTime < -origin.x) { setOrigin(-scaledTime+10, origin.y); } else if (scaledTime > (size.x - origin.x)) { diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 0deaa44..0eb64c3 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -95,6 +95,7 @@ import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.swt.internal.slider.ImageButton; import com.minres.scviewer.database.ui.swt.internal.slider.RangeSlider; +import com.minres.scviewer.database.ui.swt.internal.slider.ZoomingScrollbar; import com.minres.scviewer.database.ui.swt.sb.FlatScrollBar; public class WaveformView implements IWaveformView { @@ -343,40 +344,23 @@ public class WaveformView implements IWaveformView { gl_waveformPane.marginHeight = 0; waveformPane.setLayout(gl_waveformPane); - waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider); + IWaveformScrollBarProvider sbProvider = new IWaveformScrollBarProvider() { + @Override + public IScrollBar getVerticalSb() { + return null; + } + + @Override + public IScrollBar getHorizontalSb() { + ZoomingScrollbar timeSliderPane = new ZoomingScrollbar(waveformPane, SWT.NONE); + GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); + timeSliderPane.setLayoutData(gd_timeSliderPane); + return timeSliderPane; + } + }; + waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider, sbProvider); waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - - //Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE); - Composite timeSliderPane = new Composite(waveformPane, SWT.NONE); -// timeSliderPane.setBackground(SWTResourceManager.getColor(SWT.COLOR_RED)); - GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); -// gd_timeSliderPane.heightHint = 22; - timeSliderPane.setLayoutData(gd_timeSliderPane); - GridLayout gl_timeSliderPane = new GridLayout(3, false); - gl_timeSliderPane.marginHeight=0; - gl_timeSliderPane.marginWidth=0; - gl_timeSliderPane.horizontalSpacing=0; - gl_timeSliderPane.verticalSpacing=0; - timeSliderPane.setLayout(gl_timeSliderPane); - ImageButton b1 = new ImageButton(timeSliderPane, SWT.NONE); - GridData gd_b1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_b1.widthHint=18; - gd_b1.heightHint=18; - b1.setLayoutData(gd_b1); - b1.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_left.png")); - - Composite timeSlider = new RangeSlider(timeSliderPane, SWT.ON|SWT.HIGH|SWT.SMOOTH|SWT.CONTROL); - GridData gd_timeSlide = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); - timeSlider.setLayoutData(gd_timeSlide); - - ImageButton b2 = new ImageButton(timeSliderPane, SWT.NONE); - GridData gd_b2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_b2.widthHint=18; - gd_b2.heightHint=18; - b2.setLayoutData(gd_b2); - b2.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_right.png")); - // create the name pane createTextPane(namePane, "Name"); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java deleted file mode 100644 index 96445f1..0000000 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ZoomingScrollbar.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.minres.scviewer.database.ui.swt.internal; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.layout.GridData; -import org.eclipse.wb.swt.ResourceManager; -import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.widgets.Slider; -import org.eclipse.wb.swt.SWTResourceManager; -import org.eclipse.swt.widgets.Scale; -import org.eclipse.jface.fieldassist.ControlDecoration; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.FillLayout; - -public class ZoomingScrollbar extends Composite { - - /** - * Create the composite. - * @param parent - * @param style - */ - public ZoomingScrollbar(Composite parent, int style) { - super(parent, SWT.BORDER | SWT.NO_FOCUS); - GridLayout gridLayout = new GridLayout(3, false); - gridLayout.horizontalSpacing = 0; - gridLayout.verticalSpacing = 0; - gridLayout.marginWidth = 0; - gridLayout.marginHeight = 0; - setLayout(gridLayout); - - Button scrlLeft = new Button(this, SWT.BORDER | SWT.FLAT | SWT.CENTER); - scrlLeft.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); - GridData gd_scrlLeft = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); - gd_scrlLeft.heightHint = 16; - gd_scrlLeft.widthHint = 16; - scrlLeft.setLayoutData(gd_scrlLeft); - - Slider slider = new Slider(this, SWT.NONE); - slider.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); - GridData gd_canvas = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); - gd_canvas.heightHint = 16; - slider.setLayoutData(gd_canvas); - - Button scrlRight = new Button(this, SWT.BORDER | SWT.FLAT | SWT.CENTER); - scrlRight.setAlignment(SWT.CENTER); - GridData gd_scrlRight = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_scrlRight.heightHint = 16; - gd_scrlRight.widthHint = 16; - scrlRight.setLayoutData(gd_scrlRight); - - SashForm sashForm = new SashForm(this, SWT.NONE); - sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); - - Composite composite = new Composite(sashForm, SWT.NONE); - composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_MAGENTA)); - composite.setLayout(null); - - Composite wavformPane = new Composite(sashForm, SWT.BORDER | SWT.NO_FOCUS); - wavformPane.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE)); - GridLayout gl_wavformPane = new GridLayout(1, false); - gl_wavformPane.verticalSpacing = 0; - gl_wavformPane.marginWidth = 0; - gl_wavformPane.marginHeight = 0; - wavformPane.setLayout(gl_wavformPane); - - Composite waveformCanvas = new Composite(wavformPane, SWT.NONE); - waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - - Composite timeSlider = new Composite(wavformPane, SWT.BORDER | SWT.NO_FOCUS); - GridLayout gl_timeSlider = new GridLayout(3, false); - gl_timeSlider.marginWidth = 0; - gl_timeSlider.verticalSpacing = 0; - gl_timeSlider.marginHeight = 0; - gl_timeSlider.horizontalSpacing = 0; - timeSlider.setLayout(gl_timeSlider); - GridData gd_timeSlider = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); - gd_timeSlider.heightHint = 16; - timeSlider.setLayoutData(gd_timeSlider); - - Button buttonLeft = new Button(timeSlider, SWT.BORDER | SWT.FLAT | SWT.CENTER); - buttonLeft.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); - GridData gd_buttonLeft = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); - gd_buttonLeft.widthHint = 10; - gd_buttonLeft.heightHint = 16; - buttonLeft.setLayoutData(gd_buttonLeft); - - Slider slider2 = new Slider(timeSlider, SWT.NONE); - slider2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1)); - - Button buttonRight = new Button(timeSlider, SWT.FLAT | SWT.CENTER); - buttonRight.setFont(SWTResourceManager.getFont("Sans", 5, SWT.NORMAL)); - GridData gd_buttonRight = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); - gd_buttonRight.widthHint = 10; - gd_buttonRight.heightHint = 16; - buttonRight.setLayoutData(gd_buttonRight); - sashForm.setWeights(new int[] {1, 1}); - - } - - @Override - protected void checkSubclass() { - // Disable the check that prevents subclassing of SWT components - } -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ActionTimer.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ActionTimer.java new file mode 100644 index 0000000..bacbe78 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ActionTimer.java @@ -0,0 +1,35 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; + +import org.eclipse.swt.widgets.Display; + +public class ActionTimer implements Runnable { + + public static final int INITIAL_DELAY = 300; + public static final int FAST_DELAY = 50; + + private final Display display; + private final TimerAction timerAction; + + public interface TimerAction extends Runnable { + boolean isEnabled(); + } + + public ActionTimer( TimerAction timerAction, Display display ) { + this.display = display; + this.timerAction = timerAction; + } + + public void activate() { + if( timerAction.isEnabled() ) { + display.timerExec( INITIAL_DELAY, this ); + } + } + + @Override + public void run() { + if( timerAction.isEnabled() ) { + timerAction.run(); + display.timerExec( FAST_DELAY, this ); + } + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java index 21483d6..3c3ca72 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java @@ -1,111 +1,100 @@ package com.minres.scviewer.database.ui.swt.internal.slider; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Transform; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; public class ImageButton extends Composite { - private Color textColor; - private Image image; - private Image grayImage; - private ImageData imageData; - private String text = ""; + private Image hoverImage; + private Image normalImage; + private Image pressedImage; private int width; private int height; private boolean hover; + private boolean pressed; + private boolean autoFire; + private ActionTimer actionTimer; + private ActionTimer.TimerAction timerAction; - public ImageButton(Composite parent, int style) - { + public ImageButton(Composite parent, int style) { super(parent, style); - - textColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE); - - /* Add dispose listener for the image */ + + timerAction = new ActionTimer.TimerAction() { + @Override + public void run() { + notifyListeners(); + } + @Override + public boolean isEnabled() { + return pressed; + } + }; + actionTimer = new ActionTimer(timerAction, this.getDisplay() ); + addListener(SWT.Dispose, event -> { - if (image != null) - image.dispose(); + if (hoverImage != null) hoverImage.dispose(); + if (normalImage != null) normalImage.dispose(); + if (pressedImage != null) pressedImage.dispose(); }); - /* Add custom paint listener that paints the stars */ addListener(SWT.Paint, event -> { - paintControl(event); + paintControl(event); }); - /* Listen for click events */ - addListener(SWT.MouseDown, event -> { - System.out.println("Click"); - }); addListener(SWT.MouseDown, event -> { + pressed=true; + notifyListeners(); + if(autoFire) actionTimer.activate(); + redraw(); }); addListener(SWT.MouseUp, event -> { + pressed=false; + redraw(); }); addListener(SWT.MouseMove, event -> { - hover=false; + Point sz = ((ImageButton)event.widget).getSize(); + final boolean within_x = event.x>0 && event.x0 && event.y { - }); - - addListener(SWT.MouseHover, event -> { - hover=true; - redraw(); - }); - - addListener(SWT.MouseDoubleClick, event -> { - }); } private void paintControl(Event event) { GC gc = event.gc; - if (image != null) - { -// gc.drawImage(image, 1, 1); -// if(hover) { -// Rectangle rect = image.getBounds (); -// Transform tr = new Transform (event.display); -// tr.setElements (1, 0, 0, -1, 1, 2*(1+rect.height)); -// gc.setTransform (tr); -// gc.drawImage (image, 1, 1); -// gc.setTransform (null); -// } - if(hover) { - gc.drawImage(image, 1, 1); + if (hoverImage != null) { + if(pressed) + gc.drawImage(pressedImage, 1, 1); + else if(hover) { + gc.drawImage(hoverImage, 1, 1); } else { - gc.drawImage(grayImage, 1, 1); + gc.drawImage(normalImage, 1, 1); } - Point textSize = gc.textExtent(text); - gc.setForeground(textColor); - gc.drawText(text, (width - textSize.x) / 2 + 1, (height - textSize.y) / 2 + 1, true); } } - public void setImage(Image img) + public void setImage(Image[] imgs) { - image = new Image(Display.getDefault(), img, SWT.IMAGE_COPY); - grayImage = new Image(Display.getDefault(),img,SWT.IMAGE_GRAY); - width = img.getBounds().width; - height = img.getBounds().height; - imageData = img.getImageData(); - redraw(); - } - - public void setText(String text) - { - this.text = text; + Display d = Display.getDefault(); + hoverImage = new Image(d, imgs[0], SWT.IMAGE_COPY); + normalImage = imgs.length>1? + new Image(d, imgs[1], SWT.IMAGE_COPY): + new Image(d,imgs[0],SWT.IMAGE_GRAY); + pressedImage = imgs.length>2? + new Image(d, imgs[2], SWT.IMAGE_COPY): + new Image(d,imgs[0],SWT.IMAGE_DISABLE); + width = imgs[0].getBounds().width; + height = imgs[0].getBounds().height; redraw(); } @@ -125,5 +114,77 @@ public class ImageButton extends Composite /* Return computed dimensions plus border */ return new Point(overallWidth + 2, overallHeight + 2); } + /** + * Adds the listener to the collection of listeners who will be notified when + * the user changes the receiver's value, by sending it one of the messages + * defined in the SelectionListener interface. + *

+ * widgetSelected is called when the user changes the receiver's + * value. widgetDefaultSelected is not called. + *

+ * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #removeSelectionListener + */ + public void addSelectionListener(final SelectionListener listener) { + checkWidget(); + SelectionListenerUtil.addSelectionListener(this, listener); + } + + /** + * Removes the listener from the collection of listeners who will be notified + * when the user changes the receiver's value. + * + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException + *
    + *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • + *
+ * @exception SWTException + *
    + *
  • ERROR_WIDGET_DISPOSED - if the receiver has been + * disposed
  • + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the + * thread that created the receiver
  • + *
+ * + * @see SelectionListener + * @see #addSelectionListener + */ + public void removeSelectionListener(final SelectionListener listener) { + checkWidget(); + SelectionListenerUtil.removeSelectionListener(this, listener); + } + + private void notifyListeners() { + Event e = new Event(); + e.widget=this; + e.type=SWT.Selection; + SelectionListenerUtil.fireSelectionListeners(this,e); + } + + public boolean isAutoFire() { + return autoFire; + } + + public void setAutoFire(boolean autoFire) { + this.autoFire = autoFire; + } + } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java index d146b53..0b78cd4 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java @@ -59,7 +59,7 @@ public class RangeSlider extends Canvas { private int maximum; private int lowerValue; private int upperValue; - private final Image slider, sliderHover, sliderDrag, sliderSelected; + private final Image[] slider, sliderHover, sliderDrag, sliderSelected; private final Image vSlider, vSliderHover, vSliderDrag, vSliderSelected; private int orientation; private int increment; @@ -114,10 +114,18 @@ public class RangeSlider extends Canvas { maximum = upperValue = 100; increment = 1; pageIncrement = 10; - slider = SWTResourceManager.getImage(this.getClass(), "marker_r.png"); - sliderHover = SWTResourceManager.getImage(this.getClass(), "marker_r_lt.png"); - sliderDrag = SWTResourceManager.getImage(this.getClass(), "marker_r_bl.png"); - sliderSelected = SWTResourceManager.getImage(this.getClass(), "marker_r_bl_lt.png"); + slider = new Image[] { + SWTResourceManager.getImage(this.getClass(), "marker_l.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r.png")}; + sliderHover = new Image[] { + SWTResourceManager.getImage(this.getClass(), "marker_l_lt.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r_lt.png")}; + sliderDrag = new Image[] { + SWTResourceManager.getImage(this.getClass(), "marker_l_bl.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r_bl.png")}; + sliderSelected = new Image[] { + SWTResourceManager.getImage(this.getClass(), "marker_l_bl_lt.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r_bl_lt.png")}; vSlider = SWTResourceManager.getImage(this.getClass(), "h-slider-normal.png"); vSliderHover = SWTResourceManager.getImage(this.getClass(), "h-slider-hover.png"); @@ -371,7 +379,7 @@ public class RangeSlider extends Canvas { if (coordLower == null) { return; } - final Image img = orientation == SWT.HORIZONTAL ? slider : vSlider; + final Image img = orientation == SWT.HORIZONTAL ? slider[0] : vSlider; final int x = e.x, y = e.y; lowerHover = x >= coordLower.x && x <= coordLower.x + img.getBounds().width && y >= coordLower.y && y <= coordLower.y + img.getBounds().height; upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // @@ -621,7 +629,6 @@ public class RangeSlider extends Canvas { */ private void drawHorizontalRangeSlider(final GC gc) { drawBackgroundHorizontal(gc); - drawBarsHorizontal(gc); if (lowerHover || (selectedElement & LOWER) != 0) { coordUpper = drawHorizontalKnob(gc, upperValue, true); coordLower = drawHorizontalKnob(gc, lowerValue, false); @@ -640,6 +647,7 @@ public class RangeSlider extends Canvas { final Rectangle clientArea = getClientArea(); gc.setBackground(getBackground()); + //gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));//getBackground()); gc.fillRectangle(clientArea); if (isEnabled()) { @@ -647,7 +655,7 @@ public class RangeSlider extends Canvas { } else { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); } - gc.drawRoundRectangle(minHeight/3+imgWidth, minHeight/3, clientArea.width - 2*(minHeight/3+imgWidth), clientArea.height - 2*minHeight/3+3, 3, 3); + gc.drawRoundRectangle(imgWidth, minHeight/3, clientArea.width - 2*imgWidth, clientArea.height - 2*minHeight/3, 3, 3); final float pixelSize = computePixelSizeForHorizontalSlider(); final int startX = (int) (pixelSize * lowerValue); @@ -657,7 +665,7 @@ public class RangeSlider extends Canvas { } else { gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); } - gc.fillRectangle(minHeight/3+3 + startX, minHeight/3, endX - startX - 3, clientArea.height - 2*minHeight/3+3); + gc.fillRectangle(imgWidth+startX, minHeight/3, endX - startX, clientArea.height - 2*minHeight/3); } @@ -665,15 +673,7 @@ public class RangeSlider extends Canvas { * @return how many pixels corresponds to 1 point of value */ private float computePixelSizeForHorizontalSlider() { - return (getClientArea().width - 20f) / (maximum - minimum); - } - - /** - * Draw the bars - * - * @param gc graphic context - */ - private void drawBarsHorizontal(final GC gc) { + return (getClientArea().width - 2.0f*imgWidth) / (maximum - minimum); } /** @@ -687,33 +687,36 @@ public class RangeSlider extends Canvas { */ private Point drawHorizontalKnob(final GC gc, final int value, final boolean upper) { final float pixelSize = computePixelSizeForHorizontalSlider(); - final int x = (int) (pixelSize * value); + int x = (int) (pixelSize * value); + final int idx = upper?1:0; Image image; if (upper) { if (upperHover) { - image = dragInProgress || (selectedElement & UPPER) != 0 ? sliderDrag : sliderHover; + image = dragInProgress || (selectedElement & UPPER) != 0 ? sliderDrag[idx] : sliderHover[idx]; } else if ((selectedElement & UPPER) != 0 && !lowerHover) { - image = hasFocus ? sliderSelected : sliderHover; + image = hasFocus ? sliderSelected[idx] : sliderHover[idx]; } else { - image = slider; + image = slider[idx]; } } else { if (lowerHover) { - image = dragInProgress || (selectedElement & LOWER) != 0 ? sliderDrag : sliderHover; + image = dragInProgress || (selectedElement & LOWER) != 0 ? sliderDrag[idx] : sliderHover[idx]; } else if ((selectedElement & LOWER) != 0 && !upperHover) { - image = hasFocus ? sliderSelected : sliderHover; + image = hasFocus ? sliderSelected[idx] : sliderHover[idx]; } else { - image = slider; + image = slider[idx]; } } + if(upper) + x+=slider[idx].getBounds().width; if (isEnabled()) { - gc.drawImage(image, x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + gc.drawImage(image, x, getClientArea().height / 2 - slider[idx].getBounds().height / 2); } else { final Image temp = new Image(getDisplay(), image, SWT.IMAGE_DISABLE); - gc.drawImage(temp, x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + gc.drawImage(temp, x, getClientArea().height / 2 - slider[idx].getBounds().height / 2); temp.dispose(); } - return new Point(x + 5, getClientArea().height / 2 - slider.getBounds().height / 2); + return new Point(x, getClientArea().height / 2 - slider[idx].getBounds().height / 2); } /** @@ -775,7 +778,6 @@ public class RangeSlider extends Canvas { * @param gc graphic context */ private void drawBarsVertical(final GC gc) { - final Rectangle clientArea = getClientArea(); if (isEnabled()) { gc.setForeground(getForeground()); } else { diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java new file mode 100644 index 0000000..077da38 --- /dev/null +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java @@ -0,0 +1,110 @@ +package com.minres.scviewer.database.ui.swt.internal.slider; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.wb.swt.SWTResourceManager; + +import com.minres.scviewer.database.ui.swt.internal.IScrollBar; + +public class ZoomingScrollbar extends Composite implements IScrollBar { + RangeSlider timeSlider; + /** + * Create the composite. + * @param parent + * @param style + */ + public ZoomingScrollbar(Composite parent, int style) { + super(parent, SWT.NO_FOCUS); + GridLayout gridLayout = new GridLayout(3, false); + gridLayout.horizontalSpacing = 0; + gridLayout.verticalSpacing = 0; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + setLayout(gridLayout); + //setBackground(SWTResourceManager.getColor(SWT.COLOR_RED)); + + ImageButton b1 = new ImageButton(this, SWT.NONE); + GridData gd_b1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_b1.widthHint=14; + gd_b1.heightHint=18; + b1.setLayoutData(gd_b1); + b1.setImage(new Image[] { + SWTResourceManager.getImage(this.getClass(), "arrow_left_hover.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_left.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_left_pressed.png")}); + b1.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + int[] value = timeSlider.getSelection(); + int diff = value[1]-value[0]; + int newLow = Math.max(0, value[0]-Math.max(1, diff/10)); + timeSlider.setSelection(newLow, newLow+diff); + } + }); + timeSlider = new RangeSlider(this, /*SWT.ON|*/SWT.HIGH|SWT.SMOOTH|SWT.CONTROL); + GridData gd_timeSlide = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); + timeSlider.setLayoutData(gd_timeSlide); + + ImageButton b2 = new ImageButton(this, SWT.NONE); + GridData gd_b2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_b2.widthHint=18; + gd_b2.heightHint=18; + b2.setLayoutData(gd_b2); + b2.setImage(new Image[] { + SWTResourceManager.getImage(this.getClass(), "arrow_right_hover.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_right.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_right_pressed.png")}); + b2.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + int[] value = timeSlider.getSelection(); + int diff = value[1]-value[0]; + int newHigh = Math.min(timeSlider.getMaximum(), value[1] + diff/10); + timeSlider.setSelection(newHigh-diff, newHigh); + } + }); + + } + @Override + public void setSelection(int i) { + timeSlider.setLowerValue(i); + } + @Override + public int getSelection() { + return timeSlider.getLowerValue(); + } + @Override + public void addSelectionListener(SelectionListener selectionListener) { + timeSlider.addSelectionListener(selectionListener); + } + @Override + public void setIncrement(int value) { + timeSlider.setIncrement(value); + } + @Override + public void setPageIncrement(int value) { + timeSlider.setPageIncrement(value); + } + @Override + public void setMinimum(int value) { + timeSlider.setMinimum(value); + } + @Override + public void setMaximum(int value) { + timeSlider.setMaximum(value); + } + @Override + public int getMaximum() { + return timeSlider.getMaximum(); + } + @Override + public void setThumb(int w) { + timeSlider.setUpperValue(timeSlider.getLowerValue()+w); + } +} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..61e7214d2faff98722828e1f5f2c035e3203d065 GIT binary patch literal 352 zcmV-m0iXVfP)U?`jf5Ktuuyrcx|oW1lilV6m^1Huw@LeS?5cA+a;1s34jY?%us)v57y? z;5slc#dppbh7mQZIqIgsg=&Bf$Pi}CeNYKj7#N>|P1o|og98PF04gdj`R3Xpi)Y@I2f~#G1z0c?1ZzQa)Xjj)*i%}b zdd!0Yuxb~8V32=FSeJsK2)2S%RI}DA8Tc?=-Xz2JL@yk15QV=P2^S`=Tq!XjcgRUnsL`cNE+GiHgsQQ8h=yg@4~)>^%^IP(J*Q`Zo%r`UE0$SjRoCV!q|F$ Y12q$jIyPEPMgRZ+07*qoM6N<$f>Y{;c>n+a literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left_pressed.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_left_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..61e7214d2faff98722828e1f5f2c035e3203d065 GIT binary patch literal 352 zcmV-m0iXVfP)U?`jf5Ktuuyrcx|oW1lilV6m^1Huw@LeS?5cA+a;1s34jY?%us)v57y? z;5slc#dppbh7mQZIqIgsg=&Bf$Pi}CeNYKj7#N>|P1o|og98PF04gdj`R3Xpi)Y@I2f~#G1z0c?1ZzQa)Xjj)*i%}b zdd!0Yuxb~8V32=FSeJsK2)2S%RI}DA8Tc?=-Xz2JL@ykD+n%jp9Z{CdnKIJb^?>ycDDyDYj)3Ai(0? z`%c1@{>zoV;K8H72I0q*e(OrF_Xie8|DlCB4#44_rU3RT^q&hgFI$+`6a!iVjQFm^ zwH7?x))YWmL4rUq%t3rpwU_H!S}9mkS|9)sYz4NWK&M(3K*Deh8bcZYfoBw9&^Ajf z1?hk;DUu}#S+&1!SVCT-vlJY{?KvEQ3fR^A(=iW>!};9-a0GThRqs!65KNjBKCcj` zt>fRCgk~hzW$SdnKx&}B-FhkX^R52}D&Tvrb$osSCO3)ASR|!700000NkvXXu0mjf DTA6)L literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_hover.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..890472f01105135d9629f870fc66ed405f43a850 GIT binary patch literal 302 zcmV+}0nz@6P)NklV4e5Jle%ASIh34T`kV7E$hmR^kZhxRjeMauRNV#0_Y$=cn*SVS%ujYHaKMH)ERA zeKx6U`DZz>!Pqyc>zma1Jm6S<_f{(skmhU-pcf~9EIeMVpR?7=5=bJ}PI>cIi@$9Z z$cATwBD8{7yX%R&Hb+1Pir_r8J zil9`Bl@Tm}es@^b9aJCkH3WzN24HvE9*)&;t_H?b3RnQ*2<(92v^~U+L1bNw1;jM< z@>?f{afF-HDWDM$f$pc?7>LKI*T4XLJxaZ-Z@eFjf<*4(i~s-t07*qoM6N<$g7{{E AkpKVy literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_pressed.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/arrow_right_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b37d47d064292a3c62834231f6a71daa6148c913 GIT binary patch literal 339 zcmV-Z0j&OsP)Z5JX?~%zD=(Ac0n_Laya%GN1?C7j@Y$>e3D|K%_#9fYE<6L*QNE$1=L~|D&~H4&H@y zCj49#*>0Kv@*Kzox$qN6S7v^yKWXiu)3$fOJHn43T^h}`RTSGagXQ4TC_GcEmE!9r zSh`rzdJ!##BCu+Q&}vG6);mN1GC}4Lg$Gb3+=RV5_ShtSG6n|o;dBxKJa-5Sdl0x2 zUK;GxCpZIOJReTenh;yO2N7lodrC(tF>ZFk6omZ@*QQ@0I(W(j*vTX)^{H6jfj l9@5^_pM){a-M-Y#`UZ^Odncvs-K78k002ovPDHLkV1muKk8uD1 literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_left.png deleted file mode 100644 index 96b446605ebf85c7142eb9ec096460ba2a9b330a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~Unv^o$cHPZFwf!uL_esT;#rYmU(lg^$`c4sSKX3elF{r5}E*Evu=$5 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/bullet_right.png deleted file mode 100644 index e809d370116b96a15258bb1e0551101f8bc2d74d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E07j0XYijYA3s;uwp&oQ znNhToK@yClD;eag8RTmj6v0TlnK603VfJEk)p`cgc6Qf(ak*;d!0C$NGc=-SYsM_F ziC^fPwAc-(CUw4H+ER~f)_POe%sw|Iw383oe`7fwavx4 q6W*+l74C_@$!4K{RdLdXyWCG1nK!En^U45CW$<+Mb6Mw<&;$VPI%^*Q diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a942d679bc08c038208231f410de3c9f1f3a3e GIT binary patch literal 374 zcmV-+0g3*JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Sie)K~yMHb&*R- z#6S>+E05ktz@6JhglrADKrRpv(F=Hlge2xPZez=uAFa!f0=XsH`v?r(~H3`tvNplmgo8AcsR)E#*=ex36^EqwkQhu zvER$-`c|%2ury6y!!Udt#}R}OASVeLU`di}f*^PphJl)*Z2{yjz~VUG`o4ePbse;- z(KHR6fDTa$+a1*AM}H-&2AR3h%T=uh0(b zNy?S}bXWX<30yEe*Ho#Fw-k#{tjtz_x8LO%p83B3&4U`tu|F0OYsu Ub#Xn<4gdfE07*qoM6N<$f(vSwr~m)} literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae0c09ee63b257b7810abfa1720572b335c2f9d GIT binary patch literal 353 zcmV-n0iOPeP)j6k-xI4^0QUsaVJK80n@3UHw_PMB<{5CKY;PrFXnUZ zLx5dnwQqbcyuSM7WWpT~RN1Tr$GihZBflCBxm~YGrO>Kkn}T5={k~s6J#+KEB9(%v zLe7Lu!DvAS1Fql3WK}2y&$;uqY+uwhaW*4u!>Z)PHbXelDN3tfesAR-8Ezy(;?*w~5NaTTf3r3oPbT{DP)8gv2_khUdM z710b=0~Op1iV}7&>Y5~i_ZC+Jv>(~FgldVXQu@$U@Hik+K$@0V*IPiOHz+QKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TxL_K~yMHb&g9) z#6S>+D-*JlQ34SHAp`0G#$}F>Wke-w50TehT&m+0Jc1|4GK+wV0m=KFwB2PoWCRO7 z(w+LM{)YeR6E4q2VK;2%``?m2yr*YjcOlOAlahiUc>9WDGTq#g`QK8K@B4=+ipclz zNT%!ki6D8N_a25JiRm@m>@Zh^J-bvgCGddG!4>H zfCg-6^I)3h{Wy+L*Y$66-ayy}!!YjpzF#Jp#6^r4h5^d5gsQ3#-eg~lVAJa+KQ~OE z# Date: Wed, 5 Jan 2022 21:51:57 +0100 Subject: [PATCH 05/28] checkpoint development --- .../database/ui/swt/DatabaseUiPlugin.java | 2 + .../database/ui/swt/internal/IScrollBar.java | 37 ---- .../internal/IWaveformScrollBarProvider.java | 7 - .../ui/swt/internal/ScrollBarAdapter.java | 83 --------- .../ui/swt/internal/TrackAreaPainter.java | 15 +- .../ui/swt/internal/WaveformCanvas.java | 175 ++++++++++-------- .../ui/swt/internal/WaveformSlider.java | 95 ---------- .../ui/swt/internal/WaveformView.java | 22 +-- .../ui/swt/internal/slider/ImageButton.java | 43 ++--- .../ui/swt/internal/slider/RangeSlider.java | 50 ++--- ...gScrollbar.java => TimeZoomScrollbar.java} | 109 ++++++----- 11 files changed, 219 insertions(+), 419 deletions(-) delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformSlider.java rename plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/{ZoomingScrollbar.java => TimeZoomScrollbar.java} (50%) diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java index 98aa447..0d8b315 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/DatabaseUiPlugin.java @@ -13,6 +13,7 @@ package com.minres.scviewer.database.ui.swt; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Status; +import org.eclipse.wb.swt.SWTResourceManager; import org.osgi.framework.BundleContext; public class DatabaseUiPlugin extends Plugin { @@ -24,6 +25,7 @@ public class DatabaseUiPlugin extends Plugin { @Override public void stop(BundleContext context) throws Exception { + SWTResourceManager.dispose(); getLog().log(new Status(IStatus.OK, "org.eclipse.e4.core", "Stopping org.eclipse.e4.core bundle...")); } } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java deleted file mode 100644 index 9db93b6..0000000 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IScrollBar.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.minres.scviewer.database.ui.swt.internal; - -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; - -public interface IScrollBar { - - void setSelection(int i); - - int getSelection(); - - void setEnabled(boolean b); - - void setVisible(boolean b); - - void addSelectionListener(SelectionListener selectionListener); - - void setIncrement(int i); - - void setPageIncrement(int width); - - void setMinimum(int i); - - void setMaximum(int width); - - int getMaximum(); - - void setThumb(int clientWidthw); - - Point getSize(); - - int getStyle(); - - boolean isVisible(); - -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java deleted file mode 100644 index 11c8b97..0000000 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/IWaveformScrollBarProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.minres.scviewer.database.ui.swt.internal; - -public interface IWaveformScrollBarProvider { - - IScrollBar getHorizontalSb(); - IScrollBar getVerticalSb(); -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java deleted file mode 100644 index 69e98e9..0000000 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ScrollBarAdapter.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.minres.scviewer.database.ui.swt.internal; - -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.ScrollBar; - -public class ScrollBarAdapter implements IScrollBar { - - ScrollBar delegate; - public ScrollBarAdapter(ScrollBar delegate) { - this.delegate=delegate; - } - - @Override - public void setSelection(int i) { - delegate.setSelection(i); - } - - @Override - public int getSelection() { - return delegate.getSelection(); - } - - @Override - public void setEnabled(boolean b) { - delegate.setEnabled(b); - } - - @Override - public void setVisible(boolean b) { - delegate.setVisible(b); - } - - @Override - public void addSelectionListener(SelectionListener selectionListener) { - delegate.addSelectionListener(selectionListener); } - - @Override - public void setIncrement(int i) { - delegate.setIncrement(i); - } - - @Override - public void setPageIncrement(int width) { - delegate.setPageIncrement(width); - } - - @Override - public void setMinimum(int i) { - delegate.setMinimum(i); - } - - @Override - public void setMaximum(int width) { - delegate.setMaximum(width); - } - - @Override - public int getMaximum() { - return delegate.getMaximum(); - } - - @Override - public void setThumb(int clientWidthw) { - delegate.setThumb(clientWidthw); - } - - @Override - public Point getSize() { - return delegate.getSize(); - } - - @Override - public int getStyle() { - return delegate.getStyle(); - } - - @Override - public boolean isVisible() { - return delegate.isVisible(); - } - -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java index 90326e3..300c7be 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/TrackAreaPainter.java @@ -19,7 +19,7 @@ import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.ui.WaveformColors; public class TrackAreaPainter implements IPainter { - + /** * */ @@ -35,14 +35,15 @@ public class TrackAreaPainter implements IPainter { } public void paintArea(Projection proj, Rectangle a) { - Rectangle area = proj.unProject(new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight)); - proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_EVEN)); - proj.setFillRule(SWT.FILL_EVEN_ODD); - proj.fillRectangle(area); + Rectangle area = proj.unProject(new Rectangle(a.x, a.y+waveCanvas.rulerHeight, a.width, a.height-waveCanvas.rulerHeight)); + proj.setBackground(this.waveCanvas.styleProvider.getColor(WaveformColors.TRACK_BG_EVEN)); + proj.setFillRule(SWT.FILL_EVEN_ODD); + proj.fillRectangle(area); if(trackVerticalOffset.size()>0){ Integer firstKey=trackVerticalOffset.floorKey(area.y); if(firstKey==null) firstKey=trackVerticalOffset.firstKey(); Integer lastKey = trackVerticalOffset.floorKey(area.y+area.height); + //if(lastKey==null) lastKey= trackVerticalOffset.lastKey(); Rectangle subArea = new Rectangle(area.x, 0, area.width, 0); if(lastKey.equals(firstKey)){ subArea.y=firstKey; @@ -61,9 +62,9 @@ public class TrackAreaPainter implements IPainter { public void addTrackPainter(IWaveformPainter trackPainter){ trackVerticalOffset.put(trackPainter.getVerticalOffset()+waveCanvas.rulerHeight, trackPainter); - + } - + public int getHeight(){ if(trackVerticalOffset.size()==0) return 1; return trackVerticalOffset.lastKey() + trackVerticalOffset.lastEntry().getValue().getHeight(); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index 4add590..e2e3712 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -31,6 +31,7 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.ScrollBar; import com.google.common.collect.Lists; import com.minres.scviewer.database.EventEntry; @@ -45,21 +46,22 @@ import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.ZoomKind; import com.minres.scviewer.database.ui.swt.Constants; +import com.minres.scviewer.database.ui.swt.internal.slider.TimeZoomScrollbar; public class WaveformCanvas extends Canvas implements IWaveformZoom{ public static final long ZOOM_FIT = -2; public static final long ZOOM_FULL = -1; - + private boolean doubleBuffering = true; IWaveformStyleProvider styleProvider; private int scaleMagnitude = 6; - + private long scaleFactor = Constants.POWERS_OF_TEN[scaleMagnitude]; - + private long maxTime; protected Point origin; /* original size */ @@ -80,8 +82,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ private List cursorPainters; - IScrollBar horizontal; - IScrollBar vertical; + private TimeZoomScrollbar horizontal; + + private ScrollBar vertical; HashMap wave2painterMap; /** @@ -92,13 +95,13 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ * @param style * the style of this control. */ - public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider, IWaveformScrollBarProvider scrollbarProvider) { - super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND); + public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider, TimeZoomScrollbar.IProvider scrollbarProvider) { + super(parent, (style & ~SWT.H_SCROLL) | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.V_SCROLL ); this.styleProvider=styleProvider; addControlListener(new ControlAdapter() { /* resize listener. */ @Override public void controlResized(ControlEvent event) { - syncScrollBars(); + syncSb(); } }); addPaintListener((final PaintEvent event) -> paint(event.gc)); @@ -108,8 +111,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ cursorPainters= new ArrayList<>(); wave2painterMap=new HashMap<>(); - horizontal = (style& SWT.H_SCROLL)==0?scrollbarProvider.getHorizontalSb() : new ScrollBarAdapter(getHorizontalBar()); - vertical = (style& SWT.V_SCROLL)==0?scrollbarProvider.getVerticalSb() : new ScrollBarAdapter(getVerticalBar()); + horizontal = scrollbarProvider.getScrollBar(); + vertical = getVerticalBar(); initScrollBars(); // order is important: it is bottom to top trackAreaPainter=new TrackAreaPainter(this); @@ -118,10 +121,10 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ painterList.add(arrowPainter); rulerPainter=new RulerPainter(this); painterList.add(rulerPainter); - CursorPainter cp = new CursorPainter(this, scaleFactor * 10, cursorPainters.size()-1); + CursorPainter cp = new CursorPainter(this, getScale() * 10, cursorPainters.size()-1); painterList.add(cp); cursorPainters.add(cp); - CursorPainter marker = new CursorPainter(this, scaleFactor * 100, cursorPainters.size()-1); + CursorPainter marker = new CursorPainter(this, getScale() * 100, cursorPainters.size()-1); painterList.add(marker); cursorPainters.add(marker); wave2painterMap=new HashMap<>(); @@ -154,12 +157,12 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setOrigin(int x, int y) { checkWidget(); if(x<=0) horizontal.setSelection(-x); - x = -horizontal.getSelection(); + x = -horizontal.getSelection()[0]; if(y<=0) vertical.setSelection(-y); y = -vertical.getSelection(); origin.x = x; origin.y = y; - syncScrollBars(); + syncSb(); } @Override @@ -169,14 +172,14 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setMaxTime(long maxTime) { this.maxTime = maxTime; - syncScrollBars(); + syncSb(); } @Override public long getScale() { return scaleFactor; } - + @Override public void setScale(long factor) { setScalingFactor(factor, (getMaxVisibleTime()+getMinVisibleTime())/2); @@ -208,37 +211,41 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ factor=1; else if(factor>maxFactor) factor=maxFactor; - if(factor!=scaleFactor || (getMaxVisibleTime()+getMinVisibleTime()/2) != centerTime) { - scaleFactor = factor; - scaleMagnitude = 0; - for(int i=Constants.POWERS_OF_TEN.length-1; i>0; i--) { - if(scaleFactor>=Constants.POWERS_OF_TEN[i]) { - scaleMagnitude = i; - break; - } - } + if(factor!=getScale() || (getMaxVisibleTime()+getMinVisibleTime()/2) != centerTime) { + updateScaleFactor(factor); ITx tx = arrowPainter.getTx(); arrowPainter.setTx(null); /* * xc = tc/oldScaleFactor * xoffs = xc+origin.x * xcn = tc/newScaleFactor - * t0n = (xcn-xoffs)*scaleFactor + * t0n = (xcn-xoffs)*getScale() */ long xoffs = clientAreaWidth/2; - long xcn=centerTime/scaleFactor; // new total x-offset + long xcn=centerTime/getScale(); // new total x-offset long originX=xcn-xoffs; if(originX>0) { origin.x=(int) -originX; // new cursor time offset relative to left border }else { origin.x=0; } - syncScrollBars(); + syncSb(); arrowPainter.setTx(tx); redraw(); } } + private void updateScaleFactor(long factor) { + scaleFactor = factor; + scaleMagnitude = 0; + for(int i=Constants.POWERS_OF_TEN.length-1; i>0; i--) { + if(scaleFactor>=Constants.POWERS_OF_TEN[i]) { + scaleMagnitude = i; + break; + } + } + } + @Override public String timeToString(long time) { int idx = scaleMagnitude/3; @@ -247,7 +254,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ } public long getTimeForOffset(int xOffset){ - return (xOffset-origin.x) * scaleFactor; + return (xOffset-origin.x) * getScale(); } public void addPainter(IPainter painter) { @@ -267,7 +274,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ void clearAllWaveformPainter(boolean update) { trackAreaPainter.trackVerticalOffset.clear(); wave2painterMap.clear(); - if(update) syncScrollBars(); + if(update) syncSb(); } public void addWaveformPainter(IWaveformPainter painter) { @@ -277,7 +284,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ void addWaveformPainter(IWaveformPainter painter, boolean update) { trackAreaPainter.addTrackPainter(painter); wave2painterMap.put(painter.getTrackEntry().waveform, painter); - if(update) syncScrollBars(); + if(update) syncSb(); } public List getCursorPainters() { @@ -291,9 +298,18 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ horizontal.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - if (painterList.isEmpty()) - return; - setOrigin(-horizontal.getSelection(), origin.y); + if (!painterList.isEmpty()) { + int[] sel = horizontal.getSelection(); + //long width = maxTime / getScale(); + int currentThumbWidth = getClientArea().width; + int newThumbWidth = sel[1]-sel[0]; + if(currentThumbWidth!=newThumbWidth) { + long newScaleFactor =getScale()*newThumbWidth/currentThumbWidth; + updateScaleFactor(Math.max(1, newScaleFactor)); + } + origin.x=-sel[0]; + syncSb(); + } } }); vertical.setEnabled(false); @@ -301,9 +317,10 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ vertical.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - if (painterList.isEmpty()) - return; - setOrigin(origin.x, -vertical.getSelection()); + if (!painterList.isEmpty()) { + origin.y=-vertical.getSelection(); + syncSb(); + } } }); } @@ -313,48 +330,50 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ * range, it will correct it. This function considers only following factors * : transform, image size, client area. */ - public void syncScrollBars() { - if (painterList.isEmpty()) { - redraw(); - return; + public void syncSb() { + if (!painterList.isEmpty()) { + syncHSb(); + syncVSb(); + fireSelectionEvent(); } - int height = trackAreaPainter.getHeight(); // incl. Ruler - long width = maxTime / scaleFactor; - Rectangle clientArea=getClientArea(); - int clientWidthw = clientArea.width; - horizontal.setIncrement(clientWidthw / 100); - horizontal.setPageIncrement(clientWidthw/2); - if (width > clientWidthw) { /* image is wider than client area */ - horizontal.setMinimum(0); - horizontal.setMaximum((int)width); - horizontal.setEnabled(true); - if (-origin.x > horizontal.getMaximum() - clientWidthw) { - origin.x = -horizontal.getMaximum() + clientWidthw; - } - } else { /* image is narrower than client area */ - horizontal.setEnabled(false); - } - horizontal.setThumb(clientWidthw); - horizontal.setSelection(-origin.x); + this.getDisplay().asyncExec(() -> {redraw();}); + } - int clientHeighth = clientArea.height; - vertical.setIncrement(clientHeighth / 100); - vertical.setPageIncrement(clientHeighth/2); - if (height > clientHeighth) { /* image is higher than client area */ + private void syncVSb() { + Rectangle clientArea=getClientArea(); + int height = trackAreaPainter.getHeight(); // incl. Ruler + int clientHeight = clientArea.height; + vertical.setIncrement(clientHeight / 100); + vertical.setPageIncrement(clientHeight/2); + if (height > clientHeight) { /* image is higher than client area */ vertical.setMinimum(0); vertical.setMaximum(height); vertical.setEnabled(true); - if ( -origin.y > vertical.getMaximum() - clientHeighth) { - origin.y = -vertical.getMaximum() + clientHeighth; + if ( -origin.y > vertical.getMaximum() - clientHeight) { + origin.y = -vertical.getMaximum() + clientHeight; } } else { /* image is less higher than client area */ - vertical.setMaximum(clientHeighth); + vertical.setMaximum(clientHeight); vertical.setEnabled(false); } - vertical.setThumb(clientHeighth); + vertical.setThumb(clientHeight); vertical.setSelection(-origin.y); - redraw(); - fireSelectionEvent(); + } + + private void syncHSb() { + horizontal.setEnabled(wave2painterMap.size()>0); + Rectangle clientArea=getClientArea(); + long width = maxTime / getScale(); + int clientWidth = clientArea.width; + horizontal.setIncrement(clientWidth / 100); + horizontal.setPageIncrement(clientWidth/2); + horizontal.setMinimum(0); + horizontal.setMaximum((int)width); + if (width>0 && -origin.x > horizontal.getMaximum() - clientWidth) { + origin.x = -horizontal.getMaximum() + clientWidth; + } + horizontal.setSelection(new int[] {Math.max(-origin.x,0), Math.min(clientWidth-origin.x, horizontal.getMaximum())}); + horizontal.setButtonsEnabled(width > clientWidth); } /* Paint function */ @@ -404,7 +423,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ result.add(entry.getValue().getTrackEntry()); } } else if (p instanceof CursorPainter) { - if (Math.abs(point.x - origin.x - ((CursorPainter) p).getTime()/scaleFactor) < 2) { + if (Math.abs(point.x - origin.x - ((CursorPainter) p).getTime()/getScale()) < 2) { result.add(p); } } @@ -432,8 +451,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ } public void reveal(ITx tx) { - int lower = (int) (tx.getBeginTime() / scaleFactor); - int higher = (int) (tx.getEndTime() / scaleFactor); + int lower = (int) (tx.getBeginTime() / getScale()); + int higher = (int) (tx.getEndTime() / getScale()); Point size = getSize(); size.x -= vertical.getSize().x + 2; size.y -= horizontal.getSize().y; @@ -479,7 +498,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ } public void reveal(long time) { - int scaledTime = (int) (time / scaleFactor); + int scaledTime = (int) (time / getScale()); Point size = getSize(); size.x -= vertical.getSize().x + 2; size.y -= horizontal.getSize().y; @@ -492,7 +511,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ @Override public void centerAt(long time) { - int scaledTime = (int) (time / scaleFactor); + int scaledTime = (int) (time / getScale()); int newX = -scaledTime+getWidth()/2; setOrigin(newX>0?0:newX, origin.y); } @@ -529,15 +548,15 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ } } - + @Override public long getMaxVisibleTime() { - return (getClientArea().width-origin.x)*scaleFactor; + return (getClientArea().width-origin.x)*getScale(); } @Override public long getMinVisibleTime() { - return -origin.x * scaleFactor; + return -origin.x * getScale(); } @Override @@ -545,7 +564,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ long duration = getMaxVisibleTime()-getMinVisibleTime(); if(time>0) { if((time+duration) { - GC gc = paintEvent.gc; - gc.setBackground(buttonColor); - gc.setForeground(buttonColor); - int left = paintEvent.x+4; - int top = paintEvent.y+5; - int width=paintEvent.width-11; - int height= paintEvent.height-10; - int[] triangle = new int[] { - left, top+height/2, - left+width, top, - left+width, top+height}; - gc.fillPolygon( triangle ); - gc.drawPolygon( triangle ); - }); - scrlLeft.addSelectionListener(new SelectionAdapter() { - public void widgetSelected (SelectionEvent e){ - slider.setSelection(slider.getSelection()-10); - } - }); - scrlLeft.redraw(); - - slider = new Slider(this, SWT.NONE); - slider.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); - GridData gd_canvas = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); - gd_canvas.heightHint = 16; - slider.setLayoutData(gd_canvas); - - Button scrlRight = new Button(this, /*SWT.BORDER |*/ SWT.FLAT | SWT.CENTER); - scrlRight.setAlignment(SWT.CENTER); - GridData gd_scrlRight = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_scrlRight.heightHint = 16; - gd_scrlRight.widthHint = 16; - scrlRight.setLayoutData(gd_scrlRight); - scrlRight.addPaintListener(paintEvent -> { - GC gc = paintEvent.gc; - gc.setBackground(buttonColor); - gc.setForeground(buttonColor); - int left = paintEvent.x+6; - int top = paintEvent.y+5; - int width=paintEvent.width-11; - int height= paintEvent.height-10; - int[] triangle = new int[] { - left, top, - left+width, top+height/2, - left, top+height}; - gc.fillPolygon( triangle ); - gc.drawPolygon( triangle ); - }); - scrlRight.addSelectionListener(new SelectionAdapter() { - public void widgetSelected (SelectionEvent e){ - slider.setSelection(slider.getSelection()+10); - } - }); - redraw(); - } -} diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 0eb64c3..80f92a4 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -54,9 +54,7 @@ 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.graphics.Color; import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.TextLayout; @@ -93,10 +91,7 @@ import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.database.ui.swt.internal.slider.ImageButton; -import com.minres.scviewer.database.ui.swt.internal.slider.RangeSlider; -import com.minres.scviewer.database.ui.swt.internal.slider.ZoomingScrollbar; -import com.minres.scviewer.database.ui.swt.sb.FlatScrollBar; +import com.minres.scviewer.database.ui.swt.internal.slider.TimeZoomScrollbar; public class WaveformView implements IWaveformView { @@ -344,21 +339,16 @@ public class WaveformView implements IWaveformView { gl_waveformPane.marginHeight = 0; waveformPane.setLayout(gl_waveformPane); - IWaveformScrollBarProvider sbProvider = new IWaveformScrollBarProvider() { - @Override - public IScrollBar getVerticalSb() { - return null; - } + waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider, new TimeZoomScrollbar.IProvider() { @Override - public IScrollBar getHorizontalSb() { - ZoomingScrollbar timeSliderPane = new ZoomingScrollbar(waveformPane, SWT.NONE); + public TimeZoomScrollbar getScrollBar() { + TimeZoomScrollbar timeSliderPane = new TimeZoomScrollbar(waveformPane, SWT.NONE); GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); timeSliderPane.setLayoutData(gd_timeSliderPane); return timeSliderPane; } - }; - waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider, sbProvider); + }); waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // create the name pane @@ -551,7 +541,7 @@ public class WaveformView implements IWaveformView { tracksVerticalHeight += streamEntry.height; even = !even; } - waveformCanvas.syncScrollBars(); + waveformCanvas.syncSb(); nameList.setSize(nameMaxWidth + 15, tracksVerticalHeight); nameListScrolled.setMinSize(nameMaxWidth + 15, tracksVerticalHeight); nameList.redraw(); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java index 3c3ca72..cc4a667 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java @@ -15,6 +15,7 @@ public class ImageButton extends Composite private Image hoverImage; private Image normalImage; private Image pressedImage; + private Image disabledImage; private int width; private int height; private boolean hover; @@ -24,8 +25,7 @@ public class ImageButton extends Composite private ActionTimer.TimerAction timerAction; public ImageButton(Composite parent, int style) { - super(parent, style); - + super(parent, style); timerAction = new ActionTimer.TimerAction() { @Override public void run() { @@ -37,30 +37,28 @@ public class ImageButton extends Composite } }; actionTimer = new ActionTimer(timerAction, this.getDisplay() ); - addListener(SWT.Dispose, event -> { if (hoverImage != null) hoverImage.dispose(); if (normalImage != null) normalImage.dispose(); if (pressedImage != null) pressedImage.dispose(); + if (disabledImage != null) disabledImage.dispose(); }); - addListener(SWT.Paint, event -> { paintControl(event); }); - addListener(SWT.MouseDown, event -> { + if(!isEnabled()) return; pressed=true; notifyListeners(); if(autoFire) actionTimer.activate(); redraw(); }); - addListener(SWT.MouseUp, event -> { pressed=false; redraw(); }); - addListener(SWT.MouseMove, event -> { + if(!isEnabled()) return; Point sz = ((ImageButton)event.widget).getSize(); final boolean within_x = event.x>0 && event.x0 && event.y1? - new Image(d, imgs[1], SWT.IMAGE_COPY): - new Image(d,imgs[0],SWT.IMAGE_GRAY); - pressedImage = imgs.length>2? - new Image(d, imgs[2], SWT.IMAGE_COPY): - new Image(d,imgs[0],SWT.IMAGE_DISABLE); + normalImage = new Image(d, imgs[0], SWT.IMAGE_COPY); + hoverImage = new Image(d, imgs[1], SWT.IMAGE_COPY); + pressedImage = new Image(d, imgs[2], SWT.IMAGE_COPY); + disabledImage = new Image(d, imgs[0], SWT.IMAGE_DISABLE); width = imgs[0].getBounds().width; height = imgs[0].getBounds().height; redraw(); } @Override - public Point computeSize(int wHint, int hHint, boolean changed) - { + public Point computeSize(int wHint, int hHint, boolean changed) { int overallWidth = width; int overallHeight = height; - - /* Consider hints */ if (wHint != SWT.DEFAULT && wHint < overallWidth) overallWidth = wHint; - if (hHint != SWT.DEFAULT && hHint < overallHeight) overallHeight = hHint; - - /* Return computed dimensions plus border */ return new Point(overallWidth + 2, overallHeight + 2); } /** @@ -185,6 +174,4 @@ public class ImageButton extends Composite public void setAutoFire(boolean autoFire) { this.autoFire = autoFire; } - - } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java index 0b78cd4..3f4bd1b 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java @@ -55,6 +55,7 @@ public class RangeSlider extends Canvas { private static int minWidth = 18; private static int minHeight = 18; private static int imgWidth = 8; + private static int minThumbWidth = 5; private int minimum; private int maximum; private int lowerValue; @@ -143,17 +144,6 @@ public class RangeSlider extends Canvas { isOn = (style & SWT.ON) == SWT.ON; selectedElement = isFullSelection ? BOTH : LOWER; -// addListener(SWT.Dispose, event -> { -// SWTResourceManager.dsafeDispose(slider); -// SWTGraphicUtil.safeDispose(sliderHover); -// SWTGraphicUtil.safeDispose(sliderDrag); -// SWTGraphicUtil.safeDispose(sliderSelected); -// -// SWTGraphicUtil.safeDispose(vSlider); -// SWTGraphicUtil.safeDispose(vSliderHover); -// SWTGraphicUtil.safeDispose(vSliderDrag); -// SWTGraphicUtil.safeDispose(vSliderSelected); -// }); addMouseListeners(); addListener(SWT.Resize, event -> { }); @@ -300,14 +290,14 @@ public class RangeSlider extends Canvas { } else if ((selectedElement & UPPER) != 0) { upperValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; if (!isSmooth) { - upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; + upperValue = Math.min(lowerValue, (int) (Math.ceil(upperValue / increment) * increment) - increment); } checkUpperValue(); handleToolTip(upperValue); } else { lowerValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; if (!isSmooth) { - lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + lowerValue = Math.max(upperValue, (int) (Math.ceil(lowerValue / increment) * increment) - increment); } checkLowerValue(); handleToolTip(lowerValue); @@ -380,11 +370,12 @@ public class RangeSlider extends Canvas { return; } final Image img = orientation == SWT.HORIZONTAL ? slider[0] : vSlider; + final Rectangle imgBounds = img.getBounds(); final int x = e.x, y = e.y; - lowerHover = x >= coordLower.x && x <= coordLower.x + img.getBounds().width && y >= coordLower.y && y <= coordLower.y + img.getBounds().height; + lowerHover = x >= coordLower.x && x <= coordLower.x + imgBounds.width && y >= coordLower.y && y <= coordLower.y + imgBounds.height; upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // - x >= coordUpper.x && x <= coordUpper.x + img.getBounds().width && // - y >= coordUpper.y && y <= coordUpper.y + img.getBounds().height; + x >= coordUpper.x && x <= coordUpper.x + imgBounds.width && // + y >= coordUpper.y && y <= coordUpper.y + imgBounds.height; lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; if (!lowerHover && !upperHover && isFullSelection && isBetweenKnobs(x, y)) { lowerHover = upperHover = true; @@ -403,7 +394,7 @@ public class RangeSlider extends Canvas { int value = -1; final Rectangle clientArea = getClientArea(); if (orientation == SWT.HORIZONTAL) { - if (x < 9 + clientArea.width - 20 && x >= 9 && y >= 9 && y <= 9 + clientArea.height - 20) { + if (x < clientArea.width - 2*imgWidth && x >= imgWidth && y >= minHeight/3 && y <= clientArea.height - minHeight/3) { value = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; } } else if (y < 9 + clientArea.height - 20 && y >= 9 && x >= 9 && x <= 9 + clientArea.width - 20) { @@ -579,11 +570,11 @@ public class RangeSlider extends Canvas { if (lowerValue < minimum) { lowerValue = minimum; } - if (lowerValue > maximum) { - lowerValue = maximum; + if (lowerValue > (maximum-minThumbWidth)) { + lowerValue = (maximum-minThumbWidth); } - if (lowerValue > upperValue) { - lowerValue = upperValue; + if (lowerValue > (upperValue-minThumbWidth)) { + lowerValue = (upperValue-minThumbWidth); } } @@ -591,14 +582,14 @@ public class RangeSlider extends Canvas { * Check if the upper value is in ranges */ private void checkUpperValue() { - if (upperValue < minimum) { - upperValue = minimum; + if (upperValue < (minimum+minThumbWidth)) { + upperValue = minimum+minThumbWidth; } if (upperValue > maximum) { upperValue = maximum; } - if (upperValue < lowerValue) { - upperValue = lowerValue; + if (upperValue < (lowerValue+minThumbWidth)) { + upperValue = lowerValue+minThumbWidth; } } @@ -1422,10 +1413,19 @@ public class RangeSlider extends Canvas { * @see #getMaximum() */ public void setSelection(final int lowerValue, final int upperValue) { + setSelection(lowerValue, upperValue, false); + } + public void setSelection(final int lowerValue, final int upperValue, boolean update) { checkWidget(); if (lowerValue <= upperValue && lowerValue >= minimum && upperValue <= maximum && (this.lowerValue != lowerValue || this.upperValue != upperValue)) { this.lowerValue = lowerValue; this.upperValue = upperValue; + if(update) { + Event e = new Event(); + e.type=SWT.Selection; + e.doit=true; + validateNewValues(e); + } redraw(); } } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java similarity index 50% rename from plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java rename to plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java index 077da38..ecca946 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomingScrollbar.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java @@ -1,5 +1,7 @@ package com.minres.scviewer.database.ui.swt.internal.slider; +import java.text.Format; + import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -10,16 +12,21 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.wb.swt.SWTResourceManager; -import com.minres.scviewer.database.ui.swt.internal.IScrollBar; +public class TimeZoomScrollbar extends Composite { + + static public interface IProvider { + TimeZoomScrollbar getScrollBar(); + } -public class ZoomingScrollbar extends Composite implements IScrollBar { - RangeSlider timeSlider; + final RangeSlider timeSlider; + final ImageButton leftButton; + final ImageButton rightButton; /** * Create the composite. * @param parent * @param style */ - public ZoomingScrollbar(Composite parent, int style) { + public TimeZoomScrollbar(Composite parent, int style) { super(parent, SWT.NO_FOCUS); GridLayout gridLayout = new GridLayout(3, false); gridLayout.horizontalSpacing = 0; @@ -27,84 +34,100 @@ public class ZoomingScrollbar extends Composite implements IScrollBar { gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; setLayout(gridLayout); - //setBackground(SWTResourceManager.getColor(SWT.COLOR_RED)); - ImageButton b1 = new ImageButton(this, SWT.NONE); - GridData gd_b1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_b1.widthHint=14; - gd_b1.heightHint=18; - b1.setLayoutData(gd_b1); - b1.setImage(new Image[] { - SWTResourceManager.getImage(this.getClass(), "arrow_left_hover.png"), + leftButton = new ImageButton(this, SWT.NONE); + GridData gd_leftButton = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_leftButton.widthHint=14; + gd_leftButton.heightHint=18; + leftButton.setLayoutData(gd_leftButton); + leftButton.setImage(new Image[] { SWTResourceManager.getImage(this.getClass(), "arrow_left.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_left_hover.png"), SWTResourceManager.getImage(this.getClass(), "arrow_left_pressed.png")}); - b1.addSelectionListener(new SelectionAdapter() { + leftButton.setAutoFire(true); + + timeSlider = new RangeSlider(this, SWT.ON|SWT.HIGH|SWT.SMOOTH|SWT.CONTROL); + timeSlider.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + rightButton = new ImageButton(this, SWT.NONE); + GridData gd_rightButton = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_rightButton.widthHint=18; + gd_rightButton.heightHint=18; + rightButton.setLayoutData(gd_rightButton); + rightButton.setImage(new Image[] { + SWTResourceManager.getImage(this.getClass(), "arrow_right.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_right_hover.png"), + SWTResourceManager.getImage(this.getClass(), "arrow_right_pressed.png")}); + rightButton.setAutoFire(true); + + leftButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int[] value = timeSlider.getSelection(); int diff = value[1]-value[0]; int newLow = Math.max(0, value[0]-Math.max(1, diff/10)); - timeSlider.setSelection(newLow, newLow+diff); + timeSlider.setSelection(newLow, newLow+diff, true); } }); - timeSlider = new RangeSlider(this, /*SWT.ON|*/SWT.HIGH|SWT.SMOOTH|SWT.CONTROL); - GridData gd_timeSlide = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); - timeSlider.setLayoutData(gd_timeSlide); - - ImageButton b2 = new ImageButton(this, SWT.NONE); - GridData gd_b2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_b2.widthHint=18; - gd_b2.heightHint=18; - b2.setLayoutData(gd_b2); - b2.setImage(new Image[] { - SWTResourceManager.getImage(this.getClass(), "arrow_right_hover.png"), - SWTResourceManager.getImage(this.getClass(), "arrow_right.png"), - SWTResourceManager.getImage(this.getClass(), "arrow_right_pressed.png")}); - b2.addSelectionListener(new SelectionAdapter() { + rightButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int[] value = timeSlider.getSelection(); int diff = value[1]-value[0]; int newHigh = Math.min(timeSlider.getMaximum(), value[1] + diff/10); - timeSlider.setSelection(newHigh-diff, newHigh); + timeSlider.setSelection(newHigh-diff, newHigh, true); } }); } @Override - public void setSelection(int i) { - timeSlider.setLowerValue(i); + public void setEnabled (boolean enabled) { + timeSlider.setEnabled(enabled); + leftButton.setEnabled(enabled); + rightButton.setEnabled(enabled); + super.setEnabled(enabled); + redraw(); } - @Override - public int getSelection() { - return timeSlider.getLowerValue(); + public void setButtonsEnabled (boolean enabled) { + leftButton.setEnabled(enabled); + rightButton.setEnabled(enabled); + redraw(); + } + public void setToolTipFormatter(Format formatter){ + timeSlider.setToolTipFormatter(formatter); + } + public void setToolTipText(String string) { + timeSlider.setToolTipText(string); + } + public void setSelection(int sel) { + timeSlider.setLowerValue(sel); + } + public void setSelection(int[] sel) { + assert(sel.length==2); + timeSlider.setSelection(sel[0], sel[1]); + } + public int[] getSelection() { + return timeSlider.getSelection(); } - @Override public void addSelectionListener(SelectionListener selectionListener) { timeSlider.addSelectionListener(selectionListener); } - @Override public void setIncrement(int value) { timeSlider.setIncrement(value); } - @Override public void setPageIncrement(int value) { timeSlider.setPageIncrement(value); } - @Override public void setMinimum(int value) { timeSlider.setMinimum(value); } - @Override public void setMaximum(int value) { timeSlider.setMaximum(value); } - @Override public int getMaximum() { return timeSlider.getMaximum(); } - @Override - public void setThumb(int w) { - timeSlider.setUpperValue(timeSlider.getLowerValue()+w); + public int getMinimum() { + return timeSlider.getMinimum(); } } From bd0629301b8df62c731f9f2e8ef319ceb5806e92 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 6 Jan 2022 17:48:40 +0100 Subject: [PATCH 06/28] add next increment - basically working --- .../ui/swt/internal/WaveformCanvas.java | 50 +- .../ui/swt/internal/WaveformView.java | 19 +- .../ui/swt/internal/slider/ImageButton.java | 49 +- .../ui/swt/internal/slider/RangeSlider.java | 1305 +++-------------- .../internal/slider/TimeZoomScrollbar.java | 20 +- .../ui/swt/internal/slider/h-slider-drag.png | Bin 1057 -> 0 bytes .../ui/swt/internal/slider/h-slider-hover.png | Bin 1057 -> 0 bytes .../swt/internal/slider/h-slider-normal.png | Bin 1055 -> 0 bytes .../swt/internal/slider/h-slider-selected.png | Bin 1041 -> 0 bytes .../ui/swt/internal/slider/marker_l.png | Bin 374 -> 350 bytes .../ui/swt/internal/slider/marker_l_bl.png | Bin 353 -> 0 bytes .../ui/swt/internal/slider/marker_l_bl_lt.png | Bin 343 -> 0 bytes .../ui/swt/internal/slider/marker_l_hover.png | Bin 0 -> 336 bytes .../ui/swt/internal/slider/marker_l_lt.png | Bin 385 -> 0 bytes .../swt/internal/slider/marker_l_pressed.png | Bin 0 -> 352 bytes .../ui/swt/internal/slider/marker_r.png | Bin 358 -> 329 bytes .../ui/swt/internal/slider/marker_r_bl.png | Bin 386 -> 0 bytes .../ui/swt/internal/slider/marker_r_bl_lt.png | Bin 366 -> 0 bytes .../ui/swt/internal/slider/marker_r_hover.png | Bin 0 -> 326 bytes .../ui/swt/internal/slider/marker_r_lt.png | Bin 345 -> 0 bytes .../swt/internal/slider/marker_r_pressed.png | Bin 0 -> 349 bytes .../ui/swt/internal/slider/slider-drag.png | Bin 1085 -> 0 bytes .../ui/swt/internal/slider/slider-hover.png | Bin 1083 -> 0 bytes .../ui/swt/internal/slider/slider-normal.png | Bin 1072 -> 0 bytes .../swt/internal/slider/slider-selected.png | Bin 430 -> 0 bytes .../e4/application/parts/WaveformViewer.java | 11 +- 26 files changed, 330 insertions(+), 1124 deletions(-) delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-hover.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-normal.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-selected.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_bl_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_hover.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_l_pressed.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_hover.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_lt.png create mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_pressed.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-hover.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png delete mode 100644 plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-selected.png diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index e2e3712..5f7cde9 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -84,6 +84,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ private TimeZoomScrollbar horizontal; + private int[] lastHorSelection; + private ScrollBar vertical; HashMap wave2painterMap; @@ -156,10 +158,10 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setOrigin(int x, int y) { checkWidget(); - if(x<=0) horizontal.setSelection(-x); - x = -horizontal.getSelection()[0]; - if(y<=0) vertical.setSelection(-y); - y = -vertical.getSelection(); +// if(x<=0) horizontal.setSelection(-x); +// x = -horizontal.getSelection()[0]; +// if(y<=0) vertical.setSelection(-y); +// y = -vertical.getSelection(); origin.x = x; origin.y = y; syncSb(); @@ -300,18 +302,24 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void widgetSelected(SelectionEvent event) { if (!painterList.isEmpty()) { int[] sel = horizontal.getSelection(); - //long width = maxTime / getScale(); - int currentThumbWidth = getClientArea().width; - int newThumbWidth = sel[1]-sel[0]; - if(currentThumbWidth!=newThumbWidth) { - long newScaleFactor =getScale()*newThumbWidth/currentThumbWidth; - updateScaleFactor(Math.max(1, newScaleFactor)); + long lowerTime = sel[0]*maxTime/horizontal.getMaximum(); + long upperTime = sel[1]*maxTime/horizontal.getMaximum(); + if(sel[1]-sel[0] != lastHorSelection[1]-lastHorSelection[0]) { + long time_diff = upperTime-lowerTime; + long factor = time_diff/getClientArea().width; + setScalingFactor(factor, lowerTime+time_diff/2); + } else { + origin.x = -(int) (lowerTime / getScale()); + event.widget.getDisplay().asyncExec(() -> {redraw();}); } - origin.x=-sel[0]; - syncSb(); + lastHorSelection=sel; } } }); + horizontal.setMinimum(0); + horizontal.setMaximum(10000); + lastHorSelection = horizontal.getSelection(); + vertical.setEnabled(false); vertical.setVisible(true); vertical.addSelectionListener(new SelectionAdapter() { @@ -319,7 +327,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void widgetSelected(SelectionEvent event) { if (!painterList.isEmpty()) { origin.y=-vertical.getSelection(); - syncSb(); + fireSelectionEvent(); + event.widget.getDisplay().asyncExec(() -> {redraw();}); } } }); @@ -363,16 +372,15 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ private void syncHSb() { horizontal.setEnabled(wave2painterMap.size()>0); Rectangle clientArea=getClientArea(); - long width = maxTime / getScale(); int clientWidth = clientArea.width; - horizontal.setIncrement(clientWidth / 100); - horizontal.setPageIncrement(clientWidth/2); - horizontal.setMinimum(0); - horizontal.setMaximum((int)width); - if (width>0 && -origin.x > horizontal.getMaximum() - clientWidth) { - origin.x = -horizontal.getMaximum() + clientWidth; + if(maxTime>0) { + int lower = (int) ( -origin.x * getScale() * horizontal.getMaximum() / maxTime); + int upper = (int) ((clientWidth-origin.x) * getScale() * horizontal.getMaximum() / maxTime); + int[] curSel = horizontal.getSelection(); + lastHorSelection = new int[] {Math.max(lower,0), Math.min(upper, horizontal.getMaximum())}; + horizontal.setSelection(lastHorSelection); } - horizontal.setSelection(new int[] {Math.max(-origin.x,0), Math.min(clientWidth-origin.x, horizontal.getMaximum())}); + long width = maxTime / getScale(); horizontal.setButtonsEnabled(width > clientWidth); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 80f92a4..755af81 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -267,11 +267,24 @@ public class WaveformView implements IWaveformView { switch (e.type) { case SWT.MouseWheel: if((e.stateMask & SWT.CTRL) != 0) { - if(e.count<0) + if(e.count<0) // up scroll waveformCanvas.setScale(waveformCanvas.getScale()*11/10); - else + else // down scroll waveformCanvas.setScale(waveformCanvas.getScale()*10/11); - } + e.doit=false; + } else if((e.stateMask & SWT.SHIFT) != 0) { + long upper = waveformCanvas.getMaxVisibleTime(); + long lower = waveformCanvas.getMinVisibleTime(); + long duration = upper-lower; + if(e.count<0) { // up scroll + long newLower = Math.min(waveformCanvas.getMaxTime()-duration, lower+duration/10); + waveformCanvas.setMinVisibleTime(newLower); + } else {// down scroll + long newLower = Math.max(0, lower-duration/10); + waveformCanvas.setMinVisibleTime(newLower); + } + e.doit=false; + } break; case SWT.MouseDown: start = new Point(e.x, e.y); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java index cc4a667..91841fb 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ImageButton.java @@ -2,6 +2,9 @@ package com.minres.scviewer.database.ui.swt.internal.slider; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; @@ -46,24 +49,36 @@ public class ImageButton extends Composite addListener(SWT.Paint, event -> { paintControl(event); }); - addListener(SWT.MouseDown, event -> { - if(!isEnabled()) return; - pressed=true; - notifyListeners(); - if(autoFire) actionTimer.activate(); - redraw(); + addMouseTrackListener(new MouseTrackAdapter() { + public void mouseEnter(MouseEvent arg0) { + if(isEnabled()) { + hover=true; + redraw(); + } + } + public void mouseExit(MouseEvent arg0) { + if(isEnabled()) { + hover=false; + redraw(); + } + } }); - addListener(SWT.MouseUp, event -> { - pressed=false; - redraw(); - }); - addListener(SWT.MouseMove, event -> { - if(!isEnabled()) return; - Point sz = ((ImageButton)event.widget).getSize(); - final boolean within_x = event.x>0 && event.x0 && event.y - *
- *
Styles:
- *
BORDER
- *
HORIZONTAL
- *
VERTICAL
- *
CONTROL - Allow key and mouse manipulation to control both lower and - * upper value thumbs simultaneously
- *
ON - Indicates that selection listeners are notified continuously during - * thumb drag events. Otherwise, notification occurs only after the drag event - * terminates.
- *
HIGH - Indicates high quality tick marks are generated dynamically to a - * factor of the pageIncrement or increment. Otherwise, tick marks divide the - * scale evenly into ten parts.
- *
SMOOTH - Indicates mouse manipulation of upper and lower values are - * computed smoothly from the exact mouse cursor position disregarding the - * increment value. Otherwise, values are constrained to an incremental - * value.
- *
Events:
- *
Selection
- *
- *

- *

- * Note: Styles HORIZONTAL and VERTICAL are mutually exclusive. - *

- */ public class RangeSlider extends Canvas { - private static final byte NONE = 0; - private static final byte UPPER = 1 << 0; - private static final byte LOWER = 1 << 1; - private static final byte BOTH = UPPER | LOWER; + private static final int NONE = 0; + private static final int UPPER = 1 << 0; + private static final int LOWER = 1 << 1; + private static final int BOTH = UPPER | LOWER; - private static int minWidth = 18; - private static int minHeight = 18; - private static int imgWidth = 8; - private static int minThumbWidth = 5; + private final int minHeight; + private final int markerWidth; + private final int thumbWidth = 0; + private final Image[] slider, sliderHover, sliderDrag; + private int minimum; private int maximum; private int lowerValue; private int upperValue; - private final Image[] slider, sliderHover, sliderDrag, sliderSelected; - private final Image vSlider, vSliderHover, vSliderDrag, vSliderSelected; - private int orientation; + private int increment; private int pageIncrement; - private byte selectedElement, priorSelectedElement; - private boolean dragInProgress; + private int selectedElement; private boolean upperHover, lowerHover; private int previousUpperValue, previousLowerValue; private int startDragUpperValue, startDragLowerValue; private Point startDragPoint; - private boolean hasFocus; private final boolean isSmooth; - private final boolean isFullSelection; + private final boolean isFullSelection=false; private final boolean isHighQuality; private final boolean isOn; private Format toolTipFormatter; private String clientToolTipText; + private StringBuffer toolTip; + private Point coordUpper; + private Point coordLower; - /** - * Constructs a new instance of this class given its parent and a style value - * describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in class - * SWT which is applicable to instances of this class, or must be - * built by bitwise OR'ing together (that is, using the - * int "|" operator) two or more of those SWT style - * constants. The class description lists the style constants that are - * applicable to the class. Style bits are also inherited from superclasses. - *

- * - * @param parent a composite control which will be the parent of the new - * instance (cannot be null) - * @param style the style of control to construct. Default style is HORIZONTAL - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the parent is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the parent
  • - *
- * @see SWT#HORIZONTAL - * @see SWT#VERTICAL - * @see Widget#getStyle - * - */ public RangeSlider(final Composite parent, final int style) { super(parent, SWT.DOUBLE_BUFFERED | ((style & SWT.BORDER) == SWT.BORDER ? SWT.BORDER : SWT.NONE)); - minimum = lowerValue = 0; - maximum = upperValue = 100; - increment = 1; - pageIncrement = 10; slider = new Image[] { SWTResourceManager.getImage(this.getClass(), "marker_l.png"), SWTResourceManager.getImage(this.getClass(), "marker_r.png")}; sliderHover = new Image[] { - SWTResourceManager.getImage(this.getClass(), "marker_l_lt.png"), - SWTResourceManager.getImage(this.getClass(), "marker_r_lt.png")}; + SWTResourceManager.getImage(this.getClass(), "marker_l_hover.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r_hover.png")}; sliderDrag = new Image[] { - SWTResourceManager.getImage(this.getClass(), "marker_l_bl.png"), - SWTResourceManager.getImage(this.getClass(), "marker_r_bl.png")}; - sliderSelected = new Image[] { - SWTResourceManager.getImage(this.getClass(), "marker_l_bl_lt.png"), - SWTResourceManager.getImage(this.getClass(), "marker_r_bl_lt.png")}; - - vSlider = SWTResourceManager.getImage(this.getClass(), "h-slider-normal.png"); - vSliderHover = SWTResourceManager.getImage(this.getClass(), "h-slider-hover.png"); - vSliderDrag = SWTResourceManager.getImage(this.getClass(), "h-slider-drag.png"); - vSliderSelected = SWTResourceManager.getImage(this.getClass(), "h-slider-selected.png"); - - if ((style & SWT.VERTICAL) == SWT.VERTICAL) { - orientation = SWT.VERTICAL; - } else { - orientation = SWT.HORIZONTAL; - } + SWTResourceManager.getImage(this.getClass(), "marker_l_pressed.png"), + SWTResourceManager.getImage(this.getClass(), "marker_r_pressed.png")}; + Rectangle imgSize = slider[0].getBounds(); + minHeight =imgSize.height+2; + markerWidth = imgSize.width; + minimum = lowerValue = 0; + maximum = upperValue = 100; + increment = 1; + pageIncrement = 10; isSmooth = (style & SWT.SMOOTH) == SWT.SMOOTH; - isFullSelection = (style & SWT.CONTROL) == SWT.CONTROL; isHighQuality = (style & SWT.HIGH) == SWT.HIGH; isOn = (style & SWT.ON) == SWT.ON; - selectedElement = isFullSelection ? BOTH : LOWER; + selectedElement = NONE; addMouseListeners(); addListener(SWT.Resize, event -> { }); - addListener(SWT.FocusIn, e -> { - hasFocus = true; - redraw(); - }); - addListener(SWT.FocusOut, e -> { - hasFocus = false; - redraw(); - }); addListener(SWT.KeyDown, event -> { handleKeyDown(event); }); @@ -165,22 +86,37 @@ public class RangeSlider extends Canvas { @Override public int getStyle() { - return super.getStyle() | orientation | (isSmooth ? SWT.SMOOTH : SWT.NONE) | // + return super.getStyle() | (isSmooth ? SWT.SMOOTH : SWT.NONE) | // (isOn ? SWT.ON : SWT.NONE) | // (isFullSelection ? SWT.CONTROL : SWT.NONE) | // (isHighQuality ? SWT.HIGH : SWT.NONE); } - /** - * Add the mouse listeners (mouse up, mouse down, mouse move, mouse wheel) - */ private void addMouseListeners() { - addListener(SWT.MouseDown, event -> { - handleMouseDown(event); + addListener(SWT.MouseDown, e -> { + if (e.button == 1) { + selectKnobs(e); + if (upperHover || lowerHover) { + selectedElement = (lowerHover ? LOWER : NONE) + (upperHover ? UPPER : NONE); + startDragLowerValue = previousLowerValue = lowerValue; + startDragUpperValue = previousUpperValue = upperValue; + startDragPoint = new Point(e.x, e.y); + } + } }); - addListener(SWT.MouseUp, event -> { - handleMouseUp(event); + addListener(SWT.MouseUp, e -> { + if (selectedElement!=NONE) { + startDragPoint = null; + validateNewValues(e); + super.setToolTipText(clientToolTipText); + selectedElement=NONE; + redraw(); + } + }); + + addListener(SWT.MouseDoubleClick, event -> { + handleMouseDoubleClick(event); }); addListener(SWT.MouseMove, event -> { @@ -195,51 +131,15 @@ public class RangeSlider extends Canvas { handleMouseHover(event); }); - addListener(SWT.MouseDoubleClick, event -> { - handleMouseDoubleClick(event); + addMouseTrackListener(new MouseTrackAdapter() { + public void mouseExit(MouseEvent event) { + lowerHover = upperHover = false; + redraw(); + } }); + } - /** - * Code executed when the mouse is down - * - * @param e event - */ - private void handleMouseDown(final Event e) { - selectKnobs(e); - if (e.count == 1) { - priorSelectedElement = selectedElement; - } - if (upperHover || lowerHover) { - selectedElement = isFullSelection && lowerHover && upperHover ? BOTH : lowerHover ? LOWER : upperHover ? UPPER : selectedElement; - dragInProgress = true; - startDragLowerValue = previousLowerValue = lowerValue; - startDragUpperValue = previousUpperValue = upperValue; - startDragPoint = new Point(e.x, e.y); - } - } - - /** - * Code executed when the mouse is up - * - * @param e event - */ - private void handleMouseUp(final Event e) { - if (dragInProgress) { - startDragPoint = null; - validateNewValues(e); - dragInProgress = false; - super.setToolTipText(clientToolTipText); - } - } - - /** - * invoke selection listeners if either upper or lower value has changed. if - * listeners reject the change, restore the previous values. redraw if either - * upper or lower value has changed. - * - * @param e event - */ private void validateNewValues(final Event e) { if (upperValue != previousUpperValue || lowerValue != previousLowerValue) { if (!SelectionListenerUtil.fireSelectionListeners(this,e)) { @@ -248,18 +148,15 @@ public class RangeSlider extends Canvas { } previousUpperValue = upperValue; previousLowerValue = lowerValue; + increment = Math.max(1, (upperValue-lowerValue)/100); + pageIncrement = Math.max(1, (upperValue-lowerValue)/2); redraw(); } } - /** - * Code executed when the mouse pointer is moving - * - * @param e event - */ private void handleMouseMove(final Event e) { - if (!dragInProgress) { + if (selectedElement==NONE) { final boolean wasUpper = upperHover; final boolean wasLower = lowerHover; selectKnobs(e); @@ -267,75 +164,39 @@ public class RangeSlider extends Canvas { redraw(); } } else { // dragInProgress - final int x = e.x, y = e.y; - if (orientation == SWT.HORIZONTAL) { - if (selectedElement == BOTH) { - final int diff = (int) ((startDragPoint.x - x) / computePixelSizeForHorizontalSlider()) + minimum; - int newUpper = startDragUpperValue - diff; - int newLower = startDragLowerValue - diff; - if (newUpper > maximum) { - newUpper = maximum; - newLower = maximum - (startDragUpperValue - startDragLowerValue); - } else if (newLower < minimum) { - newLower = minimum; - newUpper = minimum + startDragUpperValue - startDragLowerValue; - } - upperValue = newUpper; - lowerValue = newLower; - if (!isSmooth) { - lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; - upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; - } - handleToolTip(lowerValue, upperValue); - } else if ((selectedElement & UPPER) != 0) { - upperValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; - if (!isSmooth) { - upperValue = Math.min(lowerValue, (int) (Math.ceil(upperValue / increment) * increment) - increment); - } - checkUpperValue(); - handleToolTip(upperValue); - } else { - lowerValue = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; - if (!isSmooth) { - lowerValue = Math.max(upperValue, (int) (Math.ceil(lowerValue / increment) * increment) - increment); - } - checkLowerValue(); - handleToolTip(lowerValue); + final int x = e.x; + if (selectedElement == BOTH) { + final int diff = (int) ((startDragPoint.x - x) / computePixelSizeForSlider()) + minimum; + int newUpper = startDragUpperValue - diff; + int newLower = startDragLowerValue - diff; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - (startDragUpperValue - startDragLowerValue); + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + startDragUpperValue - startDragLowerValue; } - } else { - if (selectedElement == BOTH) { - final int diff = (int) ((startDragPoint.y - y) / computePixelSizeForVerticalSlider()) + minimum; - int newUpper = startDragUpperValue - diff; - int newLower = startDragLowerValue - diff; - if (newUpper > maximum) { - newUpper = maximum; - newLower = maximum - (startDragUpperValue - startDragLowerValue); - } else if (newLower < minimum) { - newLower = minimum; - newUpper = minimum + startDragUpperValue - startDragLowerValue; - } - upperValue = newUpper; - lowerValue = newLower; - if (!isSmooth) { - lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; - upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; - } - handleToolTip(lowerValue, upperValue); - } else if ((selectedElement & UPPER) != 0) { - upperValue = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; - if (!isSmooth) { - upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; - } - checkUpperValue(); - handleToolTip(upperValue); - } else { - lowerValue = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; - if (!isSmooth) { - lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; - } - checkLowerValue(); - handleToolTip(lowerValue); + upperValue = newUpper; + lowerValue = newLower; + if (!isSmooth) { + lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; + upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; } + handleToolTip(lowerValue, upperValue); + } else if (selectedElement == UPPER) { + upperValue = (int) Math.round((x - 9d) / computePixelSizeForSlider()) + minimum; + if (!isSmooth) { + upperValue = Math.min(lowerValue, (int) (Math.ceil(upperValue / increment) * increment) - increment); + } + checkUpperValue(); + handleToolTip(upperValue); + } else if (selectedElement == LOWER){ + lowerValue = (int) Math.round((x - 9d) / computePixelSizeForSlider()) + minimum; + if (!isSmooth) { + lowerValue = Math.max(upperValue, (int) (Math.ceil(lowerValue / increment) * increment) - increment); + } + checkLowerValue(); + handleToolTip(lowerValue); } if (isOn) { validateNewValues(e); @@ -345,126 +206,48 @@ public class RangeSlider extends Canvas { } } - /** - * determine whether the input coordinate is within the scale bounds and between - * the current upper and lower values. - * - * @param x - * @param y - * @return - */ private boolean isBetweenKnobs(int x, int y) { - return orientation == SWT.HORIZONTAL ? x < coordUpper.x && x > coordLower.x && y >= minHeight/3 && y <= minHeight/3 + getClientArea().height - 2*minHeight/3 : // - y < coordUpper.y && y > coordLower.y && x >= minWidth/3 && x <= minWidth/3 + getClientArea().width - 2*minWidth/3; + return x < coordUpper.x && x > coordLower.x && y >= minHeight/3 && y <= minHeight/3 + getClientArea().height - 2*minHeight/3; } - /** - * set the upperHover and lowerHover values according to the coordinates of the - * input event, the key modifier state, and whether the style allows selection - * of both knobs. - * - * @param e - */ private void selectKnobs(final Event e) { if (coordLower == null) { return; } - final Image img = orientation == SWT.HORIZONTAL ? slider[0] : vSlider; + final Image img = slider[0]; final Rectangle imgBounds = img.getBounds(); final int x = e.x, y = e.y; lowerHover = x >= coordLower.x && x <= coordLower.x + imgBounds.width && y >= coordLower.y && y <= coordLower.y + imgBounds.height; upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // x >= coordUpper.x && x <= coordUpper.x + imgBounds.width && // y >= coordUpper.y && y <= coordUpper.y + imgBounds.height; - lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; - if (!lowerHover && !upperHover && isFullSelection && isBetweenKnobs(x, y)) { - lowerHover = upperHover = true; - } + lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; + if (!lowerHover && !upperHover && isBetweenKnobs(x, y)) { + lowerHover = upperHover = true; + } } - /** - * if the input coordinate is within the scale bounds, return the corresponding - * scale value of the coordinate. otherwise return -1. - * - * @param x x coordinate value - * @param y y coordinate value - * @return - */ private int getCursorValue(int x, int y) { int value = -1; final Rectangle clientArea = getClientArea(); - if (orientation == SWT.HORIZONTAL) { - if (x < clientArea.width - 2*imgWidth && x >= imgWidth && y >= minHeight/3 && y <= clientArea.height - minHeight/3) { - value = (int) Math.round((x - 9d) / computePixelSizeForHorizontalSlider()) + minimum; - } - } else if (y < 9 + clientArea.height - 20 && y >= 9 && x >= 9 && x <= 9 + clientArea.width - 20) { - value = (int) Math.round((y - 9d) / computePixelSizeForVerticalSlider()) + minimum; + if (x < clientArea.width - 2*markerWidth && x >= markerWidth && y >= minHeight/3 && y <= clientArea.height - minHeight/3) { + value = (int) Math.round((x - 9d) / computePixelSizeForSlider()) + minimum; } return value; } - /** - * Code executed when the mouse double click - * - * @param e event - */ private void handleMouseDoubleClick(final Event e) { final int value = getCursorValue(e.x, e.y); if (value >= 0) { - selectedElement = priorSelectedElement; if (value > upperValue) { - if (selectedElement == BOTH) { - lowerValue += value - upperValue; - upperValue = value; - } else if ((selectedElement & UPPER) != 0) { - upperValue = value; - } else if ((selectedElement & LOWER) != 0) { - final int diff = upperValue - lowerValue; - if (value + diff > maximum) { - upperValue = maximum; - lowerValue = maximum - diff; - } else { - upperValue = value + diff; - lowerValue = value; - } - } + translateValues(value-upperValue); } else if (value < lowerValue) { - if (selectedElement == BOTH) { - upperValue += value - lowerValue; - lowerValue = value; - } else if ((selectedElement & LOWER) != 0) { - lowerValue = value; - } else if ((selectedElement & UPPER) != 0) { - final int diff = upperValue - lowerValue; - if (value - diff < minimum) { - lowerValue = minimum; - upperValue = minimum + diff; - } else { - upperValue = value; - lowerValue = value - diff; - } - } - } else if (value > lowerValue && value < upperValue && selectedElement != BOTH) { - if ((selectedElement & LOWER) != 0) { - lowerValue = value; - } else if ((selectedElement & UPPER) != 0) { - upperValue = value; - } + translateValues(value-lowerValue); } validateNewValues(e); } } - private StringBuffer toolTip; - private Point coordUpper; - private Point coordLower; - - /** - * set the tooltip if a toolTipFormatter is present. either one or two values - * are accepted. - * - * @param values - */ private void handleToolTip(int... values) { if (toolTipFormatter != null) { try { @@ -485,13 +268,8 @@ public class RangeSlider extends Canvas { } } - /** - * Code executed on mouse hover - * - * @param e event - */ private void handleMouseHover(final Event e) { - if (!dragInProgress && toolTipFormatter != null) { + if (selectedElement!=NONE && toolTipFormatter != null) { final int value = getCursorValue(e.x, e.y); if (value >= 0) { try { @@ -507,16 +285,6 @@ public class RangeSlider extends Canvas { } } - /** - * a formatter for displaying a tool tip when hovering over the scale and during - * thumb modification events. The - * {@link Format#format(Object, StringBuffer, java.text.FieldPosition)} method - * is invoked to retrieve the text for the tooltip where the input - * {@code Object} is an {@code Integer} with a value within the minimum and - * maximum. - * - * @param formatter - */ public void setToolTipFormatter(Format formatter) { toolTip = formatter != null ? new StringBuffer() : null; toolTipFormatter = formatter; @@ -527,13 +295,8 @@ public class RangeSlider extends Canvas { super.setToolTipText(clientToolTipText = string); } - /** - * Code executed when the mouse wheel is activated - * - * @param e event - */ private void handleMouseWheel(final Event e) { - if (selectedElement == NONE || dragInProgress) { + if (selectedElement == NONE) { e.doit = false; // we are consuming this event return; } @@ -563,41 +326,26 @@ public class RangeSlider extends Canvas { e.doit = false; // we are consuming this event } - /** - * Check if the lower value is in ranges - */ private void checkLowerValue() { if (lowerValue < minimum) { lowerValue = minimum; - } - if (lowerValue > (maximum-minThumbWidth)) { - lowerValue = (maximum-minThumbWidth); - } - if (lowerValue > (upperValue-minThumbWidth)) { - lowerValue = (upperValue-minThumbWidth); + } else if (lowerValue > (upperValue-thumbWidth)) { + lowerValue = (upperValue-thumbWidth); } } - /** - * Check if the upper value is in ranges - */ private void checkUpperValue() { - if (upperValue < (minimum+minThumbWidth)) { - upperValue = minimum+minThumbWidth; - } if (upperValue > maximum) { upperValue = maximum; - } - if (upperValue < (lowerValue+minThumbWidth)) { - upperValue = lowerValue+minThumbWidth; + } else if (upperValue < (lowerValue+thumbWidth)) { + upperValue = lowerValue+thumbWidth; } } - /** - * Draws the widget - * - * @param e paint event - */ + private float computePixelSizeForSlider() { + return (getClientArea().width - 2.0f*markerWidth) / (maximum - minimum); + } + private void drawWidget(final PaintEvent e) { final Rectangle rect = getClientArea(); if (rect.width == 0 || rect.height == 0) { @@ -605,50 +353,28 @@ public class RangeSlider extends Canvas { } e.gc.setAdvanced(true); e.gc.setAntialias(SWT.ON); - if (orientation == SWT.HORIZONTAL) { - drawHorizontalRangeSlider(e.gc); - } else { - drawVerticalRangeSlider(e.gc); - } - - } - - /** - * Draw the range slider (horizontal) - * - * @param gc graphic context - */ - private void drawHorizontalRangeSlider(final GC gc) { - drawBackgroundHorizontal(gc); + drawBackground(e.gc); if (lowerHover || (selectedElement & LOWER) != 0) { - coordUpper = drawHorizontalKnob(gc, upperValue, true); - coordLower = drawHorizontalKnob(gc, lowerValue, false); + coordUpper = drawMarker(e.gc, upperValue, true); + coordLower = drawMarker(e.gc, lowerValue, false); } else { - coordLower = drawHorizontalKnob(gc, lowerValue, false); - coordUpper = drawHorizontalKnob(gc, upperValue, true); + coordLower = drawMarker(e.gc, lowerValue, false); + coordUpper = drawMarker(e.gc, upperValue, true); } } - /** - * Draw the background - * - * @param gc graphic context - */ - private void drawBackgroundHorizontal(final GC gc) { + private void drawBackground(final GC gc) { final Rectangle clientArea = getClientArea(); - gc.setBackground(getBackground()); - //gc.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));//getBackground()); gc.fillRectangle(clientArea); - if (isEnabled()) { gc.setForeground(getForeground()); } else { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); } - gc.drawRoundRectangle(imgWidth, minHeight/3, clientArea.width - 2*imgWidth, clientArea.height - 2*minHeight/3, 3, 3); + gc.drawRoundRectangle(markerWidth, minHeight/3, clientArea.width - 2*markerWidth, clientArea.height - 2*minHeight/3, 3, 3); - final float pixelSize = computePixelSizeForHorizontalSlider(); + final float pixelSize = computePixelSizeForSlider(); final int startX = (int) (pixelSize * lowerValue); final int endX = (int) (pixelSize * upperValue); if (isEnabled()) { @@ -656,44 +382,24 @@ public class RangeSlider extends Canvas { } else { gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); } - gc.fillRectangle(imgWidth+startX, minHeight/3, endX - startX, clientArea.height - 2*minHeight/3); + gc.fillRectangle(markerWidth+startX, minHeight/3, endX - startX, clientArea.height - 2*minHeight/3); } - /** - * @return how many pixels corresponds to 1 point of value - */ - private float computePixelSizeForHorizontalSlider() { - return (getClientArea().width - 2.0f*imgWidth) / (maximum - minimum); - } - - /** - * Draws an horizontal knob - * - * @param gc graphic context - * @param value corresponding value - * @param upper if true, draws the upper knob. If - * false, draws the lower knob - * @return the coordinate of the upper left corner of the knob - */ - private Point drawHorizontalKnob(final GC gc, final int value, final boolean upper) { - final float pixelSize = computePixelSizeForHorizontalSlider(); + private Point drawMarker(final GC gc, final int value, final boolean upper) { + final float pixelSize = computePixelSizeForSlider(); int x = (int) (pixelSize * value); final int idx = upper?1:0; Image image; if (upper) { if (upperHover) { - image = dragInProgress || (selectedElement & UPPER) != 0 ? sliderDrag[idx] : sliderHover[idx]; - } else if ((selectedElement & UPPER) != 0 && !lowerHover) { - image = hasFocus ? sliderSelected[idx] : sliderHover[idx]; + image = (selectedElement & UPPER) != 0 ? sliderDrag[idx] : sliderHover[idx]; } else { image = slider[idx]; } } else { if (lowerHover) { - image = dragInProgress || (selectedElement & LOWER) != 0 ? sliderDrag[idx] : sliderHover[idx]; - } else if ((selectedElement & LOWER) != 0 && !upperHover) { - image = hasFocus ? sliderSelected[idx] : sliderHover[idx]; + image = (selectedElement & LOWER) != 0 ? sliderDrag[idx] : sliderHover[idx]; } else { image = slider[idx]; } @@ -710,120 +416,6 @@ public class RangeSlider extends Canvas { return new Point(x, getClientArea().height / 2 - slider[idx].getBounds().height / 2); } - /** - * Draw the range slider (vertical) - * - * @param gc graphic context - */ - private void drawVerticalRangeSlider(final GC gc) { - drawBackgroundVertical(gc); - drawBarsVertical(gc); - if (lowerHover || (selectedElement & LOWER) != 0) { - coordUpper = drawVerticalKnob(gc, upperValue, true); - coordLower = drawVerticalKnob(gc, lowerValue, false); - } else { - coordLower = drawVerticalKnob(gc, lowerValue, false); - coordUpper = drawVerticalKnob(gc, upperValue, true); - } - } - - /** - * Draws the background - * - * @param gc graphic context - */ - private void drawBackgroundVertical(final GC gc) { - final Rectangle clientArea = getClientArea(); - gc.setBackground(getBackground()); - gc.fillRectangle(clientArea); - - if (isEnabled()) { - gc.setForeground(getForeground()); - } else { - gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); - } - gc.drawRoundRectangle(9, 9, clientArea.width - 20, clientArea.height - 20, 3, 3); - - final float pixelSize = computePixelSizeForVerticalSlider(); - final int startY = (int) (pixelSize * lowerValue); - final int endY = (int) (pixelSize * upperValue); - if (isEnabled()) { - gc.setBackground(getForeground()); - } else { - gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); - } - gc.fillRectangle(9, 12 + startY, clientArea.width - 20, endY - startY - 6); - - } - - /** - * @return how many pixels corresponds to 1 point of value - */ - private float computePixelSizeForVerticalSlider() { - return (getClientArea().height - 20f) / (maximum - minimum); - } - - /** - * Draws the bars - * - * @param gc graphic context - */ - private void drawBarsVertical(final GC gc) { - if (isEnabled()) { - gc.setForeground(getForeground()); - } else { - gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_GRAY)); - } - } - - /** - * Draws a vertical knob - * - * @param gc graphic context - * @param value corresponding value - * @param upper if true, draws the upper knob. If - * false, draws the lower knob - * @return the coordinate of the upper left corner of the knob - */ - private Point drawVerticalKnob(final GC gc, final int value, final boolean upper) { - final float pixelSize = computePixelSizeForVerticalSlider(); - final int y = (int) (pixelSize * value); - - Image image; - if (upper) { - if (upperHover) { - image = dragInProgress || (selectedElement & UPPER) != 0 ? vSliderDrag : vSliderHover; - } else if ((selectedElement & UPPER) != 0 && !lowerHover) { - image = hasFocus ? vSliderSelected : vSliderHover; - } else { - image = vSlider; - } - } else { - if (lowerHover) { - image = dragInProgress || (selectedElement & LOWER) != 0 ? vSliderDrag : vSliderHover; - } else if ((selectedElement & LOWER) != 0 && !upperHover) { - image = hasFocus ? vSliderSelected : vSliderHover; - } else { - image = vSlider; - } - } - - if (isEnabled()) { - gc.drawImage(image, getClientArea().width / 2 - 8, y + 4); - } else { - final Image temp = new Image(getDisplay(), image, SWT.IMAGE_DISABLE); - gc.drawImage(temp, getClientArea().width / 2 - 8, y + 4); - temp.dispose(); - } - return new Point(getClientArea().width / 2 - 8, y + 4); - } - - /** - * move the cursor location by the input delta values. - * - * @param xDelta - * @param yDelta - */ private void moveCursorPosition(int xDelta, int yDelta) { final Point cursorPosition = getDisplay().getCursorLocation(); cursorPosition.x += xDelta; @@ -831,162 +423,74 @@ public class RangeSlider extends Canvas { getDisplay().setCursorLocation(cursorPosition); } - /** - * Code executed when a key is typed - * - * @param event event - */ private void handleKeyDown(final Event event) { - // TODO consider API for setting accelerator values int accelerator = (event.stateMask & SWT.SHIFT) != 0 ? 10 : (event.stateMask & SWT.CTRL) != 0 ? 2 : 1; - if (dragInProgress) { + if (selectedElement != NONE) { switch (event.keyCode) { - case SWT.ESC: - startDragPoint = null; - upperValue = startDragUpperValue; - lowerValue = startDragLowerValue; - validateNewValues(event); - dragInProgress = false; - if (!isOn) { - redraw(); - } - event.doit = false; - break; - case SWT.ARROW_UP: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - case SWT.ARROW_LEFT: - if (orientation == SWT.VERTICAL) { - moveCursorPosition(0, -accelerator); - } else { - moveCursorPosition(-accelerator, 0); - } - event.doit = false; - break; - case SWT.ARROW_DOWN: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - case SWT.ARROW_RIGHT: - if (orientation == SWT.VERTICAL) { - moveCursorPosition(0, accelerator); - } else { - moveCursorPosition(accelerator, 0); - } - event.doit = false; - break; + case SWT.ESC: + startDragPoint = null; + upperValue = startDragUpperValue; + lowerValue = startDragLowerValue; + validateNewValues(event); + selectedElement = NONE; + if (!isOn) { + redraw(); + } + event.doit = false; + break; + case SWT.ARROW_UP: + accelerator = -accelerator; + case SWT.ARROW_LEFT: + moveCursorPosition(-accelerator, 0); + event.doit = false; + break; + case SWT.ARROW_DOWN: + accelerator = -accelerator; + case SWT.ARROW_RIGHT: + moveCursorPosition(accelerator, 0); + event.doit = false; + break; } return; } previousLowerValue = lowerValue; previousUpperValue = upperValue; - if (selectedElement == NONE) { - selectedElement = LOWER; - } switch (event.keyCode) { - case SWT.HOME: - if (selectedElement == BOTH) { - if ((event.stateMask & SWT.SHIFT) != 0) { - lowerValue = maximum - (upperValue - lowerValue); - upperValue = maximum; - } else { - upperValue = minimum + upperValue - lowerValue; - lowerValue = minimum; - } - } else if ((selectedElement & UPPER) != 0) { - upperValue = maximum; - } else { - lowerValue = minimum; - } - break; - case SWT.END: - if (selectedElement == BOTH) { - if ((event.stateMask & SWT.SHIFT) != 0) { - upperValue = minimum + upperValue - lowerValue; - lowerValue = minimum; - } else { - lowerValue = maximum - (upperValue - lowerValue); - upperValue = maximum; - } - } else if ((selectedElement & UPPER) != 0) { - upperValue = lowerValue; - } else { - lowerValue = upperValue; - } - break; - case SWT.PAGE_UP: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - if (selectedElement == BOTH) { - translateValues(pageIncrement * -accelerator); - } else if ((selectedElement & UPPER) != 0) { - upperValue -= pageIncrement * accelerator; - } else { - lowerValue -= pageIncrement * accelerator; - } - break; - case SWT.PAGE_DOWN: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - if (selectedElement == BOTH) { - translateValues(pageIncrement * accelerator); - } else if ((selectedElement & UPPER) != 0) { - upperValue += pageIncrement * accelerator; - } else { - lowerValue += pageIncrement * accelerator; - } - break; - case SWT.ARROW_DOWN: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - case SWT.ARROW_RIGHT: - if (selectedElement == BOTH) { - translateValues(accelerator * increment); - } else if ((selectedElement & UPPER) != 0) { - upperValue += accelerator * increment; - } else { - lowerValue += accelerator * increment; - } - break; - case SWT.ARROW_UP: - accelerator = orientation == SWT.HORIZONTAL ? -accelerator : accelerator; - case SWT.ARROW_LEFT: - if (selectedElement == BOTH) { - translateValues(-accelerator * increment); - } else if ((selectedElement & UPPER) != 0) { - upperValue -= accelerator * increment; - } else { - lowerValue -= accelerator * increment; - } - break; - case SWT.TAB: - final boolean next = (event.stateMask & SWT.SHIFT) == 0; - if (next && (selectedElement & LOWER) != 0) { - selectedElement = isFullSelection && selectedElement == LOWER ? BOTH : UPPER; - redraw(); - } else if (!next && (selectedElement & UPPER) != 0) { - selectedElement = isFullSelection && selectedElement == UPPER ? BOTH : LOWER; - redraw(); - } else { - traverse(next ? SWT.TRAVERSE_TAB_NEXT : SWT.TRAVERSE_TAB_PREVIOUS); - } - return; + case SWT.HOME: + if ((event.stateMask & (SWT.SHIFT| SWT.CTRL)) == 0) { + upperValue = minimum + upperValue - lowerValue; + lowerValue = minimum; + } + break; + case SWT.END: + if ((event.stateMask & (SWT.SHIFT| SWT.CTRL)) == 0) { + lowerValue = maximum - (upperValue - lowerValue); + upperValue = maximum; + } + break; + case SWT.PAGE_UP: + translateValues(-accelerator * pageIncrement); + break; + case SWT.PAGE_DOWN: + translateValues( accelerator * pageIncrement); + break; + case SWT.ARROW_DOWN: + case SWT.ARROW_RIGHT: + translateValues( accelerator * increment); + break; + case SWT.ARROW_UP: + case SWT.ARROW_LEFT: + translateValues(-accelerator * increment); + break; } if (previousLowerValue != lowerValue || previousUpperValue != upperValue) { - if (selectedElement == BOTH) { - checkLowerValue(); - checkUpperValue(); - } else if ((selectedElement & UPPER) != 0) { - checkUpperValue(); - } else { - checkLowerValue(); - } + checkLowerValue(); + checkUpperValue(); validateNewValues(event); } } - /** - * translate both the upper and lower values by the input amount. The updated - * values are constrained to be within the minimum and maximum. The difference - * between upper and lower values is retained. - * - * @param amount - */ private void translateValues(int amount) { int newLower = lowerValue + amount; int newUpper = upperValue + amount; @@ -1001,336 +505,64 @@ public class RangeSlider extends Canvas { lowerValue = newLower; } - /** - * Adds the listener to the collection of listeners who will be notified when - * the user changes the receiver's value, by sending it one of the messages - * defined in the SelectionListener interface. - *

- * widgetSelected is called when the user changes the receiver's - * value. widgetDefaultSelected is not called. - *

- * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * - * @see SelectionListener - * @see #removeSelectionListener - */ public void addSelectionListener(final SelectionListener listener) { checkWidget(); SelectionListenerUtil.addSelectionListener(this, listener); } - /** - * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean) - */ - @Override - public Point computeSize(final int wHint, final int hHint, final boolean changed) { - final int width, height; - checkWidget(); - if (orientation == SWT.HORIZONTAL) { - if (wHint < 100) { - width = 100; - } else { - width = wHint; - } - - if (hHint < minHeight) { - height = minHeight; - } else { - height = hHint; - } - } else { - if (wHint < minWidth) { - width = minWidth; - } else { - width = wHint; - } - - if (hHint < 100) { - height = 100; - } else { - height = hHint; - } - } - - return new Point(width, height); - } - - /** - * Returns the amount that the selected receiver's value will be modified by - * when the up/down (or right/left) arrows are pressed. - * - * @return the increment - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getIncrement() { - checkWidget(); - return increment; - } - - /** - * Returns the 'lower selection', which is the lower receiver's position. - * - * @return the selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getLowerValue() { - checkWidget(); - return lowerValue; - } - - /** - * Returns the maximum value which the receiver will allow. - * - * @return the maximum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getMaximum() { - checkWidget(); - return maximum; - } - - /** - * Returns the minimum value which the receiver will allow. - * - * @return the minimum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getMinimum() { - checkWidget(); - return minimum; - } - - /** - * Returns the amount that the selected receiver's value will be modified by - * when the page increment/decrement areas are selected. - * - * @return the page increment - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getPageIncrement() { - checkWidget(); - return pageIncrement; - } - - /** - * Returns the 'selection', which is an array where the first element is the - * lower selection, and the second element is the upper selection - * - * @return the selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int[] getSelection() { - checkWidget(); - final int[] selection = new int[2]; - selection[0] = lowerValue; - selection[1] = upperValue; - return selection; - } - - /** - * Returns the 'upper selection', which is the upper receiver's position. - * - * @return the selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public int getUpperValue() { - checkWidget(); - return upperValue; - } - - /** - * Removes the listener from the collection of listeners who will be notified - * when the user changes the receiver's value. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * - * @see SelectionListener - * @see #addSelectionListener - */ public void removeSelectionListener(final SelectionListener listener) { checkWidget(); SelectionListenerUtil.removeSelectionListener(this, listener); } - /** - * Sets the amount that the selected receiver's value will be modified by when - * the up/down (or right/left) arrows are pressed to the argument, which must be - * at least one. - * - * @param increment the new increment (must be greater than zero) - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public void setIncrement(final int increment) { + @Override + public Point computeSize(final int wHint, final int hHint, final boolean changed) { checkWidget(); - this.increment = increment; - redraw(); + final int width = Math.max(2*markerWidth+100, wHint); + final int height = Math.max(minHeight, hHint); + return new Point(width, height); } - /** - * Sets the 'lower selection', which is the receiver's lower value, to the input - * argument which must be less than or equal to the current 'upper selection' - * and greater or equal to the minimum. If either condition fails, no action is - * taken. - * - * @param value the new lower selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * @see #getUpperValue() - * @see #getMinimum() - * @see #setSelection(int, int) - */ - public void setLowerValue(final int value) { - setSelection(value, upperValue); + public int[] getSelection() { + checkWidget(); + return new int[] {lowerValue, upperValue}; } - /** - * Sets the maximum value that the receiver will allow. This new value will be - * ignored if it is not greater than the receiver's current minimum value. If - * the new maximum is applied then the receiver's selection value will be - * adjusted if necessary to fall within its new range. - * - * @param value the new maximum, which must be greater than the current minimum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * @see #setExtrema(int, int) - */ + public int getIncrement() { + checkWidget(); + return increment; + } + + public int getMaximum() { + checkWidget(); + return maximum; + } + + public int getMinimum() { + checkWidget(); + return minimum; + } + + public int getPageIncrement() { + checkWidget(); + return pageIncrement; + } + +// public void setIncrement(final int increment) { +// checkWidget(); +// this.increment = increment; +// redraw(); +// } + public void setMaximum(final int value) { - setExtrema(minimum, value); + setLimits(minimum, value); } - /** - * Sets the minimum value that the receiver will allow. This new value will be - * ignored if it is negative or is not less than the receiver's current maximum - * value. If the new minimum is applied then the receiver's selection value will - * be adjusted if necessary to fall within its new range. - * - * @param value the new minimum, which must be nonnegative and less than the - * current maximum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * @see #setExtrema(int, int) - */ public void setMinimum(final int value) { - setExtrema(value, maximum); + setLimits(value, maximum); } - /** - * Sets the minimum and maximum values that the receiver will allow. The new - * values will be ignored if either are negative or the min value is not less - * than the max. The receiver's selection values will be adjusted if necessary - * to fall within the new range. - * - * @param min the new minimum, which must be nonnegative and less than the max - * @param max the new maximum, which must be greater than the min - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public void setExtrema(final int min, final int max) { + public void setLimits(final int min, final int max) { checkWidget(); if (min >= 0 && min < max && (min != minimum || max != maximum)) { minimum = min; @@ -1349,73 +581,41 @@ public class RangeSlider extends Canvas { } } - /** - * Sets the amount that the receiver's value will be modified by when the page - * increment/decrement areas are selected to the argument, which must be at - * least one. - * - * @param pageIncrement the page increment (must be greater than zero) - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public void setPageIncrement(final int pageIncrement) { + public int getUpperValue() { checkWidget(); - this.pageIncrement = pageIncrement; - redraw(); + return upperValue; } - /** - * Sets the 'selection', which is the receiver's value. The lower value must be - * less than or equal to the upper value. Additionally, both values must be - * inclusively between the slider minimum and maximum. If either condition - * fails, no action is taken. - * - * @param value the new selection (first value is lower value, second value is - * upper value) - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- */ - public void setSelection(final int[] values) { + public void setUpperValue(final int value) { + setValues(lowerValue, value); + } + + public int getLowerValue() { + checkWidget(); + return lowerValue; + } + + public void setLowerValue(final int value) { + setValues(value, upperValue); + } + +// public void setPageIncrement(final int pageIncrement) { +// checkWidget(); +// this.pageIncrement = pageIncrement; +// redraw(); +// } + + public void setValues(final int[] values) { if (values.length == 2) { - setSelection(values[0], values[1]); + setValues(values[0], values[1]); } } - /** - * Sets the 'selection', which is the receiver's value. The lower value must be - * less than or equal to the upper value. Additionally, both values must be - * inclusively between the slider minimum and maximum. If either condition - * fails, no action is taken. - * - * @param lowerValue the new lower selection - * @param upperValue the new upper selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * @see #getMinimum() - * @see #getMaximum() - */ - public void setSelection(final int lowerValue, final int upperValue) { - setSelection(lowerValue, upperValue, false); + public void setValues(final int lowerValue, final int upperValue) { + setValues(lowerValue, upperValue, false); } - public void setSelection(final int lowerValue, final int upperValue, boolean update) { + + public void setValues(final int lowerValue, final int upperValue, boolean update) { checkWidget(); if (lowerValue <= upperValue && lowerValue >= minimum && upperValue <= maximum && (this.lowerValue != lowerValue || this.upperValue != upperValue)) { this.lowerValue = lowerValue; @@ -1429,27 +629,4 @@ public class RangeSlider extends Canvas { redraw(); } } - - /** - * Sets the 'upper selection', which is the upper receiver's value, to the input - * argument which must be greater than or equal to the current 'lower selection' - * and less or equal to the maximum. If either condition fails, no action is - * taken. - * - * @param value the new upper selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * @see #getLowerValue() - * @see #getMaximum() - * @see #setSelection(int, int) - */ - public void setUpperValue(final int value) { - setSelection(lowerValue, value); - } } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java index ecca946..3bac523 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java @@ -64,18 +64,18 @@ public class TimeZoomScrollbar extends Composite { @Override public void widgetSelected(SelectionEvent e) { int[] value = timeSlider.getSelection(); - int diff = value[1]-value[0]; - int newLow = Math.max(0, value[0]-Math.max(1, diff/10)); - timeSlider.setSelection(newLow, newLow+diff, true); + int incr=timeSlider.getIncrement(); + int lower = Math.max(timeSlider.getMinimum(), value[0]-incr); + timeSlider.setValues(lower, lower + (value[1]-value[0]), true); } }); rightButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int[] value = timeSlider.getSelection(); - int diff = value[1]-value[0]; - int newHigh = Math.min(timeSlider.getMaximum(), value[1] + diff/10); - timeSlider.setSelection(newHigh-diff, newHigh, true); + int incr=timeSlider.getIncrement(); + int upper = Math.min(timeSlider.getMaximum(), value[1]+incr); + timeSlider.setValues(upper - (value[1]-value[0]), upper, true); } }); @@ -104,7 +104,7 @@ public class TimeZoomScrollbar extends Composite { } public void setSelection(int[] sel) { assert(sel.length==2); - timeSlider.setSelection(sel[0], sel[1]); + timeSlider.setValues(sel[0], sel[1]); } public int[] getSelection() { return timeSlider.getSelection(); @@ -112,12 +112,6 @@ public class TimeZoomScrollbar extends Composite { public void addSelectionListener(SelectionListener selectionListener) { timeSlider.addSelectionListener(selectionListener); } - public void setIncrement(int value) { - timeSlider.setIncrement(value); - } - public void setPageIncrement(int value) { - timeSlider.setPageIncrement(value); - } public void setMinimum(int value) { timeSlider.setMinimum(value); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/h-slider-drag.png deleted file mode 100644 index 2011d9b40b5cafb987a58f3af01a9333f3905fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 zcmeAS@N?(olHy`uVBq!ia0vp^f5hcz=sfi_-`FRQA=g;4G z^F4Xp-d-vn-?nmE0{``CV`Oh!E{#|)Y>t zcRv2Ubm`KMKmVS7`SakxgXq?!XKp?D_4i*$-Mnw#zHK^o73iH&Fd71shd_Aha}%H` zj3q&S!3+-1ZlnP@v7RoDAr-fh6Amz#g>5QO&^>hM)PaP&#H1DLSFc^UZjp+*-WgVr zNn1@!jV@ficqt%s+H`>jPm>(Q0w;((d6wcPI8o@)!vv@B!{<8E_^hR8#s0}r_&!7V ej`A^f5eA09t-?MpMSGru-0tb>=d#Wzp$Pyk5hcz=sfi_-`FRQRdO?fI8VrJbhi+Z*%hqsp)k# z8VUe~I14-?iy0XB4uLSEsD@VqP>?0v(btiIVPik{pF~y$24;o;pAgso|Np;u_qluR z(Z#Da+`4t^=g*%{-+ZcDdT8?Q>waaEC(l|iZSRej-~RZNOnmX-ThprJufF}=`rx~F z@x&PmmOXp+tY^!`nfq_P{{DBzqo3>U{Rpd@ef8>9oBEA!zW?3z_}8WfKhK{(|Mthf zZI6Dx`|)qrlRszAp8fj!-;MWwzWx4p`{SSQfBxP3^ykN)e~&)@dHUt=&p-d3fBk#u z(xsn&|GoV7_rZe)8FLO@c=-0$-+zfycYpi#ZO4VjK#z=q(GZ|k2pl}0t_(Dbu_VYZ zn8D%MjWi%9*3-o?q~ca`!U2XbF{1(n)iZ}q9Z1MZTe5!f;-w3ht5hcz=sfi_-`FRQXI+2kK-m@$_|Nzs=1fq^AF` zjj;_V#981GS*8o|0J?9FfcO&_=LFr|NsB(+qX-W zELpj7<*i${e*XOV`t|EMbLMQ?v?(_?cjnBQTefWZ{P}ZscJ{k>?-njx_~px&>({Sm zWo6BqH}BcAXRBAQ-nMPq&6_u`T)9$OT6*>B)q;Y8uV24jyLRpT`SWMbp8fUf*PAzQ ze*gac{{8z8A3l8i`0>)EOMm|S`Sj`2g9i^LOqg)@?%mGL&Trqooj!dU=*Uqp8UpkT zfpaT@Y=QPMmIV0)GdMiEkp|>Md%8G=RNP8VIKWV4b*Vr>^UR@B2No<{yN-p0i_6H! zD9I_tK{2zGH&is$&eg2YQH(J!PERaFFtU&_&o50xkke6)Pp!oCO;5(N4VxF5hcz=sfi_-`FRQKieMtHhuDU*ONas@BiL-|Ht;@-`gMm*nRqY@6#Xq&wn3%{$u~;@6#`T z9lrj3{`IfJx4$pH{mqzj$l=Z#$M1i4TzCw0)hHMZfdLEw{km1EKBqYnY0CqjQi+2Y!DI$yzVcPf2Xhze-h5E$p^*vnGxR57bPmj-+ znv>yh_^MVb83XcP_@0@oQGZHFwpi34>G%7oQcASe zl4Y69W;6MoOk@m5-0SsTMx)UKGh?&az&QtF4EEjw0HW!1Dy>!vd7dML0BbFn8C6;0 zr`tswMG@xnIhYyN+8X(i001!nXsuzb1rdRnVT=L1$JGH8MFAp02m#JH5D^;QxsBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0Sie)K~yMHb&*R-#6S>+E05ktz@6JhglrADKrRpv(F=Hlge2xP zZez=u78|wgMXQG{x{g$^V5sL zFReL036|&i=6E>B>Bf_DZ3&iT*|sPO`LW;2>H1c#SFkiqU&Anb9LEua5FjTB8emD1 zY=R(o7>0qGqHO`>FTmnB-uk|O-*p|ds?jtJoq!He6zyEsz0*Y$IuL*kob#|OOPX5i zQ$gf_JL|e$rd8Jv0e#<7f)EPtv_`Mc4(mzEmHu_mFga)di&a&fKtgF*flVz9x9Y@~ uv>nF*&-1{xZ7@v}EXyKY7>4@uBm4m5xA1jwJj6k-xI4^0QUsaVJK80n@3UHw_PMB<{5CKY;PrFXnUZ zLx5dnwQqbcyuSM7WWpT~RN1Tr$GihZBflCBxm~YGrO>Kkn}T5={k~s6J#+KEB9(%v zLe7Lu!DvAS1Fql3WK}2y&$;uqY+uwhaW*4u!>Z)PHbXelDN3tfesAR-8Ezy(;?*w~5NaTTf3r3oPbT{DP)8gv2_khUdM z710b=0~Op1iV}7&>Y5~i_ZC+Jv>(~FgldVXQu@$U@Hik+K$@0V*IPiOHz+QKb;@5QX8l38IUXCN&io-~=2Ybt)eMo8#mFAms)$xdjptm5X3jFYmxm+*|140N$DS??M007L45CWKa1VfAysOuWc z3=u&H0bSQYLzn;&ji7B?hzMfSOu$+@#=h_2y+?Fz0?s*j@6j|3VvMNk8fe=aIGs*d iuh(~vnUtW1H~auKJ?_B$=(TGA0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TxL_K~yMHb&g9) z#6S>+D-*JlQ34SHAp`0G#$}F>Wke-w50TehT&m+0Jc1|4GK+wV0m=KFwB2PoWCRO7 z(w+LM{)YeR6E4q2VK;2%``?m2yr*YjcOlOAlahiUc>9WDGTq#g`QK8K@B4=+ipclz zNT%!ki6D8N_a25JiRm@m>@Zh^J-bvgCGddG!4>H zfCg-6^I)3h{Wy+L*Y$66-ayy}!!YjpzF#Jp#6^r4h5^d5gsQ3#-eg~lVAJa+KQ~OE z#bi}zYxg(cIK(r7^??S8sA*9R_rV7(!1KB|m2|{)tVw~0{h1ImKK(G@+ z7@ZUoAE2K0`_E|(T$pdJ^u}vvr3+s9dU|~I+O~Wa<2e3YEtmPW+sn`6YLyS)-cN!( z4hDn#q2JH9-CkZg!jCA5?nk2$)9IA!Rto_C7$=hnh&V`2kSaxPKo?O{?G;kz z0(3b-N+>80a^(gId)MCe?lQJE1;G@MkzO@l@ic>i^uyC5|I7&B`{Vr+c(^MRBz-)l z#bWVw7b!^2m{e8OeWW0jheIlgB9&!%ixi}Mw@cgYHf=VW8-FwbXqpBuf{0MpHS_uW z6=1nszD)qEwS=xCgn;)RW6TAOG6m^*wW1Xv#z^-Er_(93+3b9W+SEAbu-2lrMr%!; z=VV!S?%Dr1ALXPy79zU!Mup`Uom>-v9sr07*qoM6N<$f+ydO AjQ{`u delta 331 zcmV-R0kr z)b|qM^g=!s3mJ_@PkW(oaxU-lxlE^184ib&T_}+tXsxj!(0}Xou0u&+{$d*J+F)j$@L|k%jjdW3~osEsaKll_ASm?o=3K zXti1^Kr4lE?nIBFEX#F8mXZAcHd&VC>XRzV_*`#o^v*e|sv;qZNZV}=MeyF^y(ff# dbB<=S$u~>H`|M})O$`75002ovPDHLkV1g8Xo0k9p diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl.png deleted file mode 100644 index 558f9bd8c979be89c1625127ce3c88847c45428f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)4f26vgrXz4OLqBLrMTNU@MMm93-=1QJ3NY^*IqAR(}wsQ5XoB?JU3KZC7>ogW|s z=IuD^%;ep7pG7tSC7$LqzjMekvu`|J<3CZEtyf>?uRj9yy}~!2mLK1Lmihe6`F%)B zE{vnHzyIpx+1cAq|02bqX$HCuwzr?ZI6Zy$*OTIf*d$^!77Jl(Ywz&ns8srfDiRHg*q=k3W0{>Oh7?bbcG8R4{|<>x#99J9|e*`X%6nc2QVbAtfOtNJ%hz zz;ya-H{j4lq0352U?wXlOeRVwE_AKZW?e0XWP&AS7?gm+uePG~KuSW+f|+7T==&Au zmx0a#W`boUo09$Zp+Mi&EInYRxZeOT$}m<0Tp0VBKG$Tw0bZ0+lyRsCRGBBUOD3fv gyWm;w`qA`?KQM~Ctzq%VNdN!<07*qoM6N<$f*$CpmjD0& diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_bl_lt.png deleted file mode 100644 index e37e735e502b7acb6e1d625a46287de40c4b4d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366 zcmV-!0g?WRP)j!H;O&wemz9dZ^@hMa_yU~KfAPw6 M07*qoM6N<$f{SaUu>b%7 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_hover.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3696e2d53ae3c289fb1fd31d71daeb750c2052 GIT binary patch literal 326 zcmV-M0lEH(P)PHzF`^ZDHXAclaNp{l4VB62{z zBA1oDzdR9hMpeoCJ{%4ijYjkUM1&9mAq1RrIOnMAnxZI<8A3{^DltZK&cqn`3F&q_ z!hV=iBF6X!I7i%vJe*1?9f61-UH5D0y+4A_wq>XKv+&*{BHzG#iG~f_AQAk{u*_uvWL=5?n#b6ay&&HjeY-yYF3# ziNk>L!r>O@I~UHyo1wgOcFaE$nc->tmOefKM+b>;d8OMd)5T)(d=Ls3BmLOzbhFv$ zd_I5q1BLUEZnI3YEYtORt!bLRb|H%@bzS3uIF6akW_PM;mdoV>;4BJtRUtqK0b>l) z>GW1r&1$u}x4OR|fcL)DWHPw{B8w_jRpC_e-V;J-q49WpZBZ!85&=Y{HAMsw!Gcni zCEu!u2qA>lG{!V7ilS(NZaPU4ECGt5pzb7p6-7~V;VaLnLclqPh_t)c>oq|BnN#@2 r=xQ(+UopbyE9pCRGGRBm-00000NkvXXu0mjf^cIxB diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_pressed.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/marker_r_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e602b5660e84fd1b4a3d095fad9fbd405d3d716c GIT binary patch literal 349 zcmV-j0iyniP)dR^>1onXQy|fTaEq)wd{f|n zP{>HreVTKI?_lut&RvIpCJY8y>+SjJ1&FVTdN}swcI&6p>FZTg566C56n?+oUq|(D z?C(b-Kby^bS(blL1mJo-7K;VWIVO`y4ltk3AA!#ZAaRawYgsOrq-lDAB7p4XmfC2H zF|1ZAoO2XKkpp1_&`A>lYca+kB5XDrk|ZI|^M_-HEF-iQt@UYlyB+<0|5!40jzAwH zwALu4P)eP@NSz~UBH}p47;_1-ZkJFgMC249B4=RRZKUZSA}FQMT5~uYnhRM*+ literal 0 HcmV?d00001 diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-drag.png deleted file mode 100644 index 2d88c1afbd14dea934b22941e9beda11fe12abb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1085 zcmeAS@N?(olHy`uVBq!ia0vp^AhsX}GmyOe_w02brB~t_QQ};bnpl#VpQjL#nVZT` zoS3VpU}&U}mtUr*U}Ruus9#HaCxutg6yO z_60y8&H|6fVg?4jLmgEw{G3~`Sa(Km+wlZtf^hJ$2Fy9;`BKUOZT0B{MI?S`q|r$l`}UsF57?c>4%ub zC!G?jrp;aW?Af#C#k*Tp9J>7cQ|g*a0SnLg=C)qFdQ~T>``W87S(|P~t-5;t{P`Pi zz9(z`#ezr6nbcf-AJ?|%H<{pkD0pMQ@(|M}(Dze{g^ef$0I z&d1-EE?xTZ=ik#We;zz|5Z$`;%&jNC{{9Q8oA>S8w@t^c0=+W|Mniz|5C~6wZUQug zu_VYZn8D%MjWi&q($mE;q~ezBvD-pU0TK-t_h0Jd3lYvTtG?hd$z;~rW54ag_g%X> z>7K@nxFaR{w)Tp;6L8^A*PJx*6cf*h7c{O#9lv;C zv3$#NgAeDGX0Lty)~38(VB*a?k(SxFC;b=qzC9~QvRC~L`~4fjKHbZ!3_#HaCxutoSRl zFa@9xXMsm#F#`kNArNL1)$nQn3bLd-`Z_W&Z0zU$lgP@zz|0Wf6XN>+|Nj^7K6kG@ zx_H%wTeoig{Q2|gn@@F14^7^E-LGu&u)wjP}AAI*N zo;YK{vS-hp^=!E~bN|iP-~aA-^mE<4A7OQ~uU@@sQ@`=e_rJRy|JwB6=lS#J-~RZw z?a}XdKmP4{^5^W?vtNJzyYc?dx8MJ6fBf_P&%b-0{`~m!@6qQ!Prv;A`RCvBuYWIH zy7cq!zn9oVw+6e2tfeOw;3CY_U_V zu!Pw!{o&7f9C{4ftP2I)uebfYSNN8fJA3Q1f0MF=mMru=Zv*n1r>mdKI;Vst00{B; A;s5{u diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/slider-normal.png deleted file mode 100644 index 4c5098ca95cb10882ccfe36902fac9a8de247103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmeAS@N?(olHy`uVBq!ia0vp^AhsX}GmyOe_w02brB~t_QQ};bnpl#VpQjL#nVZT` zoS3VpU}&U}mtUr*U}Ruus9PU}#{lVd@EapicG@PhVH|+uS@tvK;Al z(N}>&oCO|{#S9F5hd`K7RKu$QD9DoT=wtDsIZQHipym|A=l`EyCrB|C>lyjvNJ}AwbU% zIJY9m7HA)1NswPKgTu2MX+Tbnr;B4q#Vyri(R@t?BCH3L!veY@RDwJ+4><<~^ZbsV zH|O?GsW%q`?=ysN;i+?XWdL(wZ7v`&G9Yemb}k??FflP8F*!OgHaamgAS*C2FfbqQ{ks4F00(qQ zO+^RW3k(tqC(w7(TL1t632;bRa{vGi!vFvd!vV){sAK>D00d`2O+f$vv5yP`8-0VU3{kYKMw+mZv00001bW%=J06^y0W&i*HY)M2x zRCwAg#?cl+KmbM2TP7hij3h~tM*jZ?bFB8$*5WPvBKi4?*-Li%V6tn+H%2 state) { Integer waves = state.containsKey(SHOWN_WAVEFORM+"S") ? Integer.parseInt(state.get(SHOWN_WAVEFORM + "S")):0; //$NON-NLS-1$ //$NON-NLS-2$ List trackEntries = new LinkedList<>(); + List selectedTrackEntries = new LinkedList<>(); for (int i = 0; i < waves; i++) { IWaveform waveform = database.getStreamByName(state.get(SHOWN_WAVEFORM + i)); if (waveform != null) { TrackEntry trackEntry = waveformPane.addWaveform(waveform, -1); //check if t is selected - boolean isSelected = Boolean.parseBoolean(state.get(SHOWN_WAVEFORM + i + WAVEFORM_SELECTED)); - if(isSelected) { - trackEntry.selected = true; - } else { - trackEntry.selected = false; - } trackEntries.add(trackEntry); + if(Boolean.parseBoolean(state.get(SHOWN_WAVEFORM + i + WAVEFORM_SELECTED))) + selectedTrackEntries.add(trackEntry); String v = state.get(SHOWN_WAVEFORM + i + VALUE_DISPLAY); if(v!=null) trackEntry.valueDisplay=ValueDisplay.valueOf(v); @@ -856,6 +853,8 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis } catch (NumberFormatException e) { } } + ISelection sel = new StructuredSelection(selectedTrackEntries); + waveformPane.setSelection(sel); updateAll(); } From 24890f9bbb835e95757af6cab8a007e214f80c35 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 6 Jan 2022 19:15:31 +0100 Subject: [PATCH 07/28] change behavior with a clear distinction If no modifier key is used the zoombar acts as a scroll bar. If ctrl is used it modifies the zoom level, shift is a speed modifier --- .../ui/swt/internal/WaveformView.java | 2 +- .../ui/swt/internal/slider/RangeSlider.java | 69 ++++++++++++------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 755af81..11cdd0f 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -205,7 +205,7 @@ public class WaveformView implements IWaveformView { long endTime = waveformCanvas.getTimeForOffset(end.x); if(startTime { if (e.button == 1) { selectKnobs(e); - if (upperHover || lowerHover) { - selectedElement = (lowerHover ? LOWER : NONE) + (upperHover ? UPPER : NONE); + selectedElement = (lowerHover ? LOWER : NONE) | (upperHover ? UPPER : NONE); + if (selectedElement!=NONE) { + if((e.stateMask & SWT.CTRL)==0) + selectedElement=BOTH; startDragLowerValue = previousLowerValue = lowerValue; startDragUpperValue = previousUpperValue = upperValue; startDragPoint = new Point(e.x, e.y); @@ -112,6 +114,16 @@ public class RangeSlider extends Canvas { super.setToolTipText(clientToolTipText); selectedElement=NONE; redraw(); + } else { + if(e.xcoordUpper.x+markerWidth) { + translateValues(pageIncrement); + validateNewValues(e); + redraw(); + } } }); @@ -211,20 +223,18 @@ public class RangeSlider extends Canvas { } private void selectKnobs(final Event e) { - if (coordLower == null) { - return; + if (coordLower != null) { + final Rectangle imgBounds = slider[0].getBounds(); + final int x = e.x, y = e.y; + lowerHover = x >= coordLower.x && x <= coordLower.x + imgBounds.width && y >= coordLower.y && y <= coordLower.y + imgBounds.height; + upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // + x >= coordUpper.x && x <= coordUpper.x + imgBounds.width && // + y >= coordUpper.y && y <= coordUpper.y + imgBounds.height; + lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; + if (!lowerHover && !upperHover && isBetweenKnobs(x, y)) { + lowerHover = upperHover = true; + } } - final Image img = slider[0]; - final Rectangle imgBounds = img.getBounds(); - final int x = e.x, y = e.y; - lowerHover = x >= coordLower.x && x <= coordLower.x + imgBounds.width && y >= coordLower.y && y <= coordLower.y + imgBounds.height; - upperHover = ((e.stateMask & (SWT.CTRL | SWT.SHIFT)) != 0 || !lowerHover) && // - x >= coordUpper.x && x <= coordUpper.x + imgBounds.width && // - y >= coordUpper.y && y <= coordUpper.y + imgBounds.height; - lowerHover &= (e.stateMask & SWT.CTRL) != 0 || !upperHover; - if (!lowerHover && !upperHover && isBetweenKnobs(x, y)) { - lowerHover = upperHover = true; - } } private int getCursorValue(int x, int y) { @@ -296,14 +306,10 @@ public class RangeSlider extends Canvas { } private void handleMouseWheel(final Event e) { - if (selectedElement == NONE) { - e.doit = false; // we are consuming this event - return; - } previousLowerValue = lowerValue; previousUpperValue = upperValue; - final int amount = increment * ((e.stateMask & SWT.SHIFT) != 0 ? 10 : (e.stateMask & SWT.CTRL) != 0 ? 2 : 1); - if (selectedElement == BOTH) { + final int amount = Math.max(1, ((e.stateMask & SWT.SHIFT) != 0 ? (upperValue-lowerValue)/6 : (upperValue-lowerValue)/15)); + if ((e.stateMask&SWT.CTRL)==0) { int newLower = lowerValue + e.count * amount; int newUpper = upperValue + e.count * amount; if (newUpper > maximum) { @@ -315,12 +321,23 @@ public class RangeSlider extends Canvas { } upperValue = newUpper; lowerValue = newLower; - } else if ((selectedElement & LOWER) != 0) { - lowerValue += e.count * amount; - checkLowerValue(); } else { - upperValue += e.count * amount; - checkUpperValue(); + int newLower = lowerValue + e.count * amount/2; + int newUpper = upperValue - e.count * amount/2; + int dist = newUpper - newLower; + if (newUpper > maximum) { + newUpper = maximum; + newLower = maximum - dist; + } else if (newLower < minimum) { + newLower = minimum; + newUpper = minimum + dist; + } + if(newUpper<=newLower) { + newLower=lowerValue + (upperValue - lowerValue)/2; + newUpper=newLower+1; + } + upperValue = newUpper; + lowerValue = newLower; } validateNewValues(e); e.doit = false; // we are consuming this event From 20934a9f47388248babfd7842ad81d789a013826 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 7 Jan 2022 19:42:27 +0100 Subject: [PATCH 08/28] fix behavior of ZoomBar used by WaveformCanvas --- .../ui/swt/internal/WaveformCanvas.java | 50 +++++++++---------- .../ui/swt/internal/WaveformView.java | 8 +-- .../ui/swt/internal/slider/RangeSlider.java | 40 ++++----------- .../{TimeZoomScrollbar.java => ZoomBar.java} | 6 +-- 4 files changed, 42 insertions(+), 62 deletions(-) rename plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/{TimeZoomScrollbar.java => ZoomBar.java} (96%) diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java index 5f7cde9..ec07c38 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformCanvas.java @@ -46,7 +46,7 @@ import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.ZoomKind; import com.minres.scviewer.database.ui.swt.Constants; -import com.minres.scviewer.database.ui.swt.internal.slider.TimeZoomScrollbar; +import com.minres.scviewer.database.ui.swt.internal.slider.ZoomBar; public class WaveformCanvas extends Canvas implements IWaveformZoom{ @@ -54,6 +54,8 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public static final long ZOOM_FULL = -1; + private static final int INITIAL_ZOOM_BAR_MAX = 1000; + private boolean doubleBuffering = true; IWaveformStyleProvider styleProvider; @@ -82,22 +84,17 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ private List cursorPainters; - private TimeZoomScrollbar horizontal; + private ZoomBar horizontal; private int[] lastHorSelection; + private long sliderScaleFactor = 1; + private ScrollBar vertical; HashMap wave2painterMap; - /** - * Constructor for ScrollableCanvas. - * - * @param parent - * the parent of this control.super(parent, style | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL); - * @param style - * the style of this control. - */ - public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider, TimeZoomScrollbar.IProvider scrollbarProvider) { + + public WaveformCanvas(final Composite parent, int style, IWaveformStyleProvider styleProvider, ZoomBar.IProvider scrollbarProvider) { super(parent, (style & ~SWT.H_SCROLL) | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.V_SCROLL ); this.styleProvider=styleProvider; addControlListener(new ControlAdapter() { /* resize listener. */ @@ -158,10 +155,6 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setOrigin(int x, int y) { checkWidget(); -// if(x<=0) horizontal.setSelection(-x); -// x = -horizontal.getSelection()[0]; -// if(y<=0) vertical.setSelection(-y); -// y = -vertical.getSelection(); origin.x = x; origin.y = y; syncSb(); @@ -174,6 +167,12 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void setMaxTime(long maxTime) { this.maxTime = maxTime; + if(maxTime>INITIAL_ZOOM_BAR_MAX) { + long maxBarTime = maxTime; + while(maxBarTime>Integer.MAX_VALUE) maxBarTime/=1000; + horizontal.setMaximum((int) maxBarTime); + } + sliderScaleFactor = maxTime/horizontal.getMaximum(); syncSb(); } @@ -302,22 +301,22 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ public void widgetSelected(SelectionEvent event) { if (!painterList.isEmpty()) { int[] sel = horizontal.getSelection(); - long lowerTime = sel[0]*maxTime/horizontal.getMaximum(); - long upperTime = sel[1]*maxTime/horizontal.getMaximum(); + long lowerTime = sel[0]*sliderScaleFactor; + long upperTime = sel[1]*sliderScaleFactor; if(sel[1]-sel[0] != lastHorSelection[1]-lastHorSelection[0]) { long time_diff = upperTime-lowerTime; long factor = time_diff/getClientArea().width; setScalingFactor(factor, lowerTime+time_diff/2); } else { - origin.x = -(int) (lowerTime / getScale()); - event.widget.getDisplay().asyncExec(() -> {redraw();}); + origin.x = -(int) (lowerTime/getScale()); + WaveformCanvas.this.getDisplay().asyncExec(() -> {redraw();}); } lastHorSelection=sel; } } }); horizontal.setMinimum(0); - horizontal.setMaximum(10000); + horizontal.setMaximum(INITIAL_ZOOM_BAR_MAX); lastHorSelection = horizontal.getSelection(); vertical.setEnabled(false); @@ -328,7 +327,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ if (!painterList.isEmpty()) { origin.y=-vertical.getSelection(); fireSelectionEvent(); - event.widget.getDisplay().asyncExec(() -> {redraw();}); + WaveformCanvas.this.getDisplay().asyncExec(() -> {redraw();}); } } }); @@ -345,7 +344,7 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ syncVSb(); fireSelectionEvent(); } - this.getDisplay().asyncExec(() -> {redraw();}); + redraw(); } private void syncVSb() { @@ -373,10 +372,9 @@ public class WaveformCanvas extends Canvas implements IWaveformZoom{ horizontal.setEnabled(wave2painterMap.size()>0); Rectangle clientArea=getClientArea(); int clientWidth = clientArea.width; - if(maxTime>0) { - int lower = (int) ( -origin.x * getScale() * horizontal.getMaximum() / maxTime); - int upper = (int) ((clientWidth-origin.x) * getScale() * horizontal.getMaximum() / maxTime); - int[] curSel = horizontal.getSelection(); + if(sliderScaleFactor>0) { + int lower = (int) ( ( -origin.x * getScale()) / sliderScaleFactor); + int upper = (int) (((clientWidth-origin.x) * getScale()) / sliderScaleFactor); lastHorSelection = new int[] {Math.max(lower,0), Math.min(upper, horizontal.getMaximum())}; horizontal.setSelection(lastHorSelection); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 11cdd0f..ae2347a 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -91,7 +91,7 @@ import com.minres.scviewer.database.ui.IWaveformStyleProvider; import com.minres.scviewer.database.ui.IWaveformView; import com.minres.scviewer.database.ui.IWaveformZoom; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.database.ui.swt.internal.slider.TimeZoomScrollbar; +import com.minres.scviewer.database.ui.swt.internal.slider.ZoomBar; public class WaveformView implements IWaveformView { @@ -352,11 +352,11 @@ public class WaveformView implements IWaveformView { gl_waveformPane.marginHeight = 0; waveformPane.setLayout(gl_waveformPane); - waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider, new TimeZoomScrollbar.IProvider() { + waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider, new ZoomBar.IProvider() { @Override - public TimeZoomScrollbar getScrollBar() { - TimeZoomScrollbar timeSliderPane = new TimeZoomScrollbar(waveformPane, SWT.NONE); + public ZoomBar getScrollBar() { + ZoomBar timeSliderPane = new ZoomBar(waveformPane, SWT.NONE); GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1); timeSliderPane.setLayoutData(gd_timeSliderPane); return timeSliderPane; diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java index 9d6847c..d484730 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java @@ -40,7 +40,6 @@ public class RangeSlider extends Canvas { private int previousUpperValue, previousLowerValue; private int startDragUpperValue, startDragLowerValue; private Point startDragPoint; - private final boolean isSmooth; private final boolean isFullSelection=false; private final boolean isHighQuality; private final boolean isOn; @@ -68,7 +67,6 @@ public class RangeSlider extends Canvas { maximum = upperValue = 100; increment = 1; pageIncrement = 10; - isSmooth = (style & SWT.SMOOTH) == SWT.SMOOTH; isHighQuality = (style & SWT.HIGH) == SWT.HIGH; isOn = (style & SWT.ON) == SWT.ON; selectedElement = NONE; @@ -86,7 +84,7 @@ public class RangeSlider extends Canvas { @Override public int getStyle() { - return super.getStyle() | (isSmooth ? SWT.SMOOTH : SWT.NONE) | // + return super.getStyle() | // (isOn ? SWT.ON : SWT.NONE) | // (isFullSelection ? SWT.CONTROL : SWT.NONE) | // (isHighQuality ? SWT.HIGH : SWT.NONE); @@ -166,7 +164,8 @@ public class RangeSlider extends Canvas { } } - + private boolean busy = false; + private void handleMouseMove(final Event e) { if (selectedElement==NONE) { final boolean wasUpper = upperHover; @@ -190,28 +189,20 @@ public class RangeSlider extends Canvas { } upperValue = newUpper; lowerValue = newLower; - if (!isSmooth) { - lowerValue = (int) (Math.ceil(lowerValue / increment) * increment) - increment; - upperValue = (int) (Math.ceil(upperValue / increment) * increment) - increment; - } handleToolTip(lowerValue, upperValue); } else if (selectedElement == UPPER) { - upperValue = (int) Math.round((x - 9d) / computePixelSizeForSlider()) + minimum; - if (!isSmooth) { - upperValue = Math.min(lowerValue, (int) (Math.ceil(upperValue / increment) * increment) - increment); - } + upperValue = (int) Math.round((double)(x - markerWidth) / computePixelSizeForSlider()) + minimum; checkUpperValue(); handleToolTip(upperValue); } else if (selectedElement == LOWER){ - lowerValue = (int) Math.round((x - 9d) / computePixelSizeForSlider()) + minimum; - if (!isSmooth) { - lowerValue = Math.max(upperValue, (int) (Math.ceil(lowerValue / increment) * increment) - increment); - } + lowerValue = (int) Math.round((double)(x - markerWidth) / computePixelSizeForSlider()) + minimum; checkLowerValue(); handleToolTip(lowerValue); } - if (isOn) { + if (isOn && !busy) { validateNewValues(e); + busy=true; + getDisplay().timerExec(50, ()->{busy=false;}); } else { redraw(); } @@ -565,12 +556,6 @@ public class RangeSlider extends Canvas { return pageIncrement; } -// public void setIncrement(final int increment) { -// checkWidget(); -// this.increment = increment; -// redraw(); -// } - public void setMaximum(final int value) { setLimits(minimum, value); } @@ -616,12 +601,6 @@ public class RangeSlider extends Canvas { setValues(value, upperValue); } -// public void setPageIncrement(final int pageIncrement) { -// checkWidget(); -// this.pageIncrement = pageIncrement; -// redraw(); -// } - public void setValues(final int[] values) { if (values.length == 2) { setValues(values[0], values[1]); @@ -642,6 +621,9 @@ public class RangeSlider extends Canvas { e.type=SWT.Selection; e.doit=true; validateNewValues(e); + } else { + increment = Math.max(1, (upperValue-lowerValue)/100); + pageIncrement = Math.max(1, (upperValue-lowerValue)/2); } redraw(); } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomBar.java similarity index 96% rename from plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java rename to plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomBar.java index 3bac523..593a5a2 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/TimeZoomScrollbar.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/ZoomBar.java @@ -12,10 +12,10 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.wb.swt.SWTResourceManager; -public class TimeZoomScrollbar extends Composite { +public class ZoomBar extends Composite { static public interface IProvider { - TimeZoomScrollbar getScrollBar(); + ZoomBar getScrollBar(); } final RangeSlider timeSlider; @@ -26,7 +26,7 @@ public class TimeZoomScrollbar extends Composite { * @param parent * @param style */ - public TimeZoomScrollbar(Composite parent, int style) { + public ZoomBar(Composite parent, int style) { super(parent, SWT.NO_FOCUS); GridLayout gridLayout = new GridLayout(3, false); gridLayout.horizontalSpacing = 0; From 7dbcffe95db963f5de97ccca11d62106be388781 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 7 Jan 2022 21:25:01 +0100 Subject: [PATCH 09/28] fix layout for auto-hiding scrollbar (e.g. GTK) --- README.md | 62 ++++++++++++------- .../ui/swt/internal/WaveformView.java | 27 +++++++- .../ui/swt/internal/slider/RangeSlider.java | 6 +- 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 589cc20..e330fb0 100644 --- a/README.md +++ b/README.md @@ -30,25 +30,43 @@ Legend: * Mouse Scroll wheel: MScrl * Context any means Name List, Value List or Waveform -| Input | Modifier | Context | Action | -|-----------|----------|----------|-----------------------------------| -| LMB klick | | any | select | -| LMB klick | Shift | Waveform | move selected marker to position | -| LMB klick | Control | Waveform | move cursor to position | -| LMB drag | | Waveform | zoom to range | -| MMB klick | | Waveform | move selected marker to position | -| MScrl | | any | scroll window up/down | -| MScrl | Shift | any | scroll window left/right | -| Key left | | Waveform | scroll window to the left (slow) | -| Key right | | Waveform | scroll window to the right (slow) | -| Key left | Shift | Waveform | scroll window to the left (fast) | -| Key right | Shift | Waveform | scroll window to the right (fast) | -| Key up | | Waveform | move selection up | -| Key down | | Waveform | move selection down | -| Key up | Control | Waveform | move selected track up | -| Key down | Control | Waveform | move selected track down | -| Key + | Control | Waveform | zoom in | -| Key - | Control | Waveform | zoom out | -| Key Pos1 | | Waveform | jump to selected marker | -| Key End | | Waveform | jump to cursor | -| Key Del | | any | delete selected entries | +| Input | Modifier | Context | Action | +|------------|----------|----------|-----------------------------------| +| LMB click | | any | select | +| LMB click | Shift | Waveform | move selected marker to position | +| LMB click | Control | Waveform | move cursor to position | +| LMB drag | | Waveform | zoom to range | +| MMB click | | Waveform | move selected marker to position | +| MScrl | | any | scroll window up/down | +| MScrl | Shift | any | scroll window left/right | +| MScrl | Control | Waveform | zoom in/out | +| Key left | | Waveform | scroll window to the left (slow) | +| Key right | | Waveform | scroll window to the right (slow) | +| Key left | Shift | Waveform | scroll window to the left (fast) | +| Key right | Shift | Waveform | scroll window to the right (fast) | +| Key up | | Waveform | move selection up | +| Key down | | Waveform | move selection down | +| Key up | Control | Waveform | move selected track up | +| Key down | Control | Waveform | move selected track down | +| Key + | Control | Waveform | zoom in | +| Key - | Control | Waveform | zoom out | +| Key Pos1 | | Waveform | jump to selected marker | +| Key End | | Waveform | jump to cursor | +| Key Del | | any | delete selected entries | +| LMB click | | ZoomBar | increment/decrement 1 page | +| LMB drag | | ZoomBar | drag both markers (pan) | +| LMB drag | Control | ZoomBar | drag one marker (zoom) | +| MMB drag | | ZoomBar | drag one marker (zoom) | +| xMB dclick | | ZoomBar | pan to position | +| MScrl | | ZoomBar | scroll window left/right | +| MScrl | Shift | ZoomBar | scroll window left/right double speed | +| MScrl | Control | ZoomBar | zoom in/out | +| Key left | | ZoomBar | scroll window to the left (slow) | +| Key right | | ZoomBar | scroll window to the right (slow) | +| Key up | | ZoomBar | scroll window to the left (slow) | +| Key down | | ZoomBar | scroll window to the right (slow) | +| Key PgUp | | ZoomBar | scroll window to the left (fast) | +| Key PgDown | | ZoomBar | scroll window to the right (fast) | +| Key Pos1 | | ZoomBar | scroll to begin | +| Key End | | ZoomBar | scroll to end | + diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index ae2347a..c0c3fae 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -113,6 +113,10 @@ public class WaveformView implements IWaveformView { private final Canvas valueList; + private final Control nameFill; + + private final Control valueFill; + final WaveformCanvas waveformCanvas; final ToolTipHandler toolTipHandler; @@ -379,7 +383,10 @@ public class WaveformView implements IWaveformView { @Override public void controlResized(ControlEvent e) { nameListScrolled.getVerticalBar().setVisible(false); - + if(nameListScrolled.getSize().y == nameList.getSize().y) { + ((GridData)nameFill.getLayoutData()).heightHint=18; + namePane.layout(); + } } }); nameList = new Canvas(nameListScrolled, SWT.NONE) { @@ -398,7 +405,8 @@ public class WaveformView implements IWaveformView { }); nameList.addMouseListener(nameValueMouseListener); nameListScrolled.setContent(nameList); - + nameFill = createFill(namePane); + createTextPane(valuePane, "Value"); valuePane.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); @@ -411,7 +419,10 @@ public class WaveformView implements IWaveformView { @Override public void controlResized(ControlEvent e) { valueListScrolled.getVerticalBar().setVisible(false); - + if(valueListScrolled.getSize().y == valueList.getSize().y) { + ((GridData)valueFill.getLayoutData()).heightHint=18; + valuePane.layout(); + } } }); valueList = new Canvas(valueListScrolled, SWT.NONE) { @@ -430,6 +441,7 @@ public class WaveformView implements IWaveformView { }); valueList.addMouseListener(nameValueMouseListener); valueListScrolled.setContent(valueList); + valueFill = createFill(valuePane); waveformCanvas.setMaxTime(1); waveformCanvas.addPaintListener(waveformMouseListener); @@ -489,6 +501,15 @@ public class WaveformView implements IWaveformView { }); } + private Control createFill(Composite pane) { + Label cLabel = new Label(pane, SWT.NONE); + cLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND)); + GridData gd_cLabel = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); + gd_cLabel.heightHint = 0; + cLabel.setLayoutData(gd_cLabel); + return cLabel; + } + private void createTextPane(Composite namePane, String text) { GridLayout glNamePane = new GridLayout(1, false); glNamePane.verticalSpacing = 0; diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java index d484730..2f4964c 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/slider/RangeSlider.java @@ -92,11 +92,11 @@ public class RangeSlider extends Canvas { private void addMouseListeners() { addListener(SWT.MouseDown, e -> { - if (e.button == 1) { + if (e.button == 1 || e.button == 2) { selectKnobs(e); selectedElement = (lowerHover ? LOWER : NONE) | (upperHover ? UPPER : NONE); if (selectedElement!=NONE) { - if((e.stateMask & SWT.CTRL)==0) + if((e.stateMask & SWT.CTRL)==0 && e.button != 2) selectedElement=BOTH; startDragLowerValue = previousLowerValue = lowerValue; startDragUpperValue = previousUpperValue = upperValue; @@ -112,7 +112,7 @@ public class RangeSlider extends Canvas { super.setToolTipText(clientToolTipText); selectedElement=NONE; redraw(); - } else { + } else if (e.button == 1) { if(e.x Date: Sat, 8 Jan 2022 17:24:26 +0100 Subject: [PATCH 10/28] first working version of help with dummy input --- doc/com.minres.scviewer.doc/.gitignore | 1 + doc/com.minres.scviewer.doc/.project | 11 + doc/com.minres.scviewer.doc/pom.xml | 182 ++++++++++++++++ .../src/asciidoc/Overview.adoc | 26 +++ .../src/asciidoc/Reference.adoc | 39 ++++ .../src/asciidoc/SCViewerHelp.adoc | 28 +++ .../asciidoc/images/Minres_logo_square.png | Bin 0 -> 21175 bytes .../src/docbkx/.gitignore | 1 + .../src/docbkx/css/narrow_style.css | 124 +++++++++++ .../src/docbkx/images/.gitignore | 1 + .../.gitignore | 1 + .../.project | 17 ++ .../build.properties | 1 + .../feature.xml | 204 ++++++++++++++++++ .../pom.xml | 12 ++ .../.classpath | 7 + .../.gitignore | 1 + .../.project | 28 +++ .../.settings/org.eclipse.jdt.core.prefs | 9 + .../META-INF/MANIFEST.MF | 8 + .../OSGI-INF/l10n/bundle.properties | 5 + .../build.properties | 7 + .../html/maintopic.html | 13 ++ .../html/subtopic.html | 13 ++ .../html/toc.html | 13 ++ .../plugin.xml | 16 ++ .../pom.xml | 13 ++ .../testToc.xml | 6 + .../toc.xml | 9 + .../Application.e4xmi | 15 +- .../META-INF/MANIFEST.MF | 6 +- .../handlers/HelpContentsHandler.java | 15 ++ .../e4/application/handlers/HelpHandler.java | 2 +- pom.xml | 3 + .../scviewer.product | 4 +- 35 files changed, 830 insertions(+), 11 deletions(-) create mode 100644 doc/com.minres.scviewer.doc/.gitignore create mode 100644 doc/com.minres.scviewer.doc/.project create mode 100644 doc/com.minres.scviewer.doc/pom.xml create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo_square.png create mode 100644 doc/com.minres.scviewer.doc/src/docbkx/.gitignore create mode 100644 doc/com.minres.scviewer.doc/src/docbkx/css/narrow_style.css create mode 100644 doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore create mode 100644 features/com.minres.scviewer.e4.help.feature/.gitignore create mode 100644 features/com.minres.scviewer.e4.help.feature/.project create mode 100644 features/com.minres.scviewer.e4.help.feature/build.properties create mode 100644 features/com.minres.scviewer.e4.help.feature/feature.xml create mode 100644 features/com.minres.scviewer.e4.help.feature/pom.xml create mode 100644 plugins/com.minres.scviewer.e4.application.help/.classpath create mode 100644 plugins/com.minres.scviewer.e4.application.help/.gitignore create mode 100644 plugins/com.minres.scviewer.e4.application.help/.project create mode 100644 plugins/com.minres.scviewer.e4.application.help/.settings/org.eclipse.jdt.core.prefs create mode 100644 plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF create mode 100644 plugins/com.minres.scviewer.e4.application.help/OSGI-INF/l10n/bundle.properties create mode 100644 plugins/com.minres.scviewer.e4.application.help/build.properties create mode 100644 plugins/com.minres.scviewer.e4.application.help/html/maintopic.html create mode 100644 plugins/com.minres.scviewer.e4.application.help/html/subtopic.html create mode 100644 plugins/com.minres.scviewer.e4.application.help/html/toc.html create mode 100644 plugins/com.minres.scviewer.e4.application.help/plugin.xml create mode 100644 plugins/com.minres.scviewer.e4.application.help/pom.xml create mode 100644 plugins/com.minres.scviewer.e4.application.help/testToc.xml create mode 100644 plugins/com.minres.scviewer.e4.application.help/toc.xml create mode 100644 plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java diff --git a/doc/com.minres.scviewer.doc/.gitignore b/doc/com.minres.scviewer.doc/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/doc/com.minres.scviewer.doc/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/doc/com.minres.scviewer.doc/.project b/doc/com.minres.scviewer.doc/.project new file mode 100644 index 0000000..f250ef1 --- /dev/null +++ b/doc/com.minres.scviewer.doc/.project @@ -0,0 +1,11 @@ + + + com.minres.scviewer.doc + + + + + + + + diff --git a/doc/com.minres.scviewer.doc/pom.xml b/doc/com.minres.scviewer.doc/pom.xml new file mode 100644 index 0000000..53d18b8 --- /dev/null +++ b/doc/com.minres.scviewer.doc/pom.xml @@ -0,0 +1,182 @@ + + 4.0.0 + com.minres.scviewer.doc + 1.0.0-SNAPSHOT + pom + + com.minres.scviewer + com.minres.scviewer.parent + 2.15.1 + ../.. + + + + UTF-8 + 1.5.6 + 1.5.0-alpha.16 + 1.5.6 + 1.7.26 + target/eclipse + + + + + + org.asciidoctor + asciidoctor-maven-plugin + ${asciidoctor.maven.plugin.version} + + + org.asciidoctor + asciidoctorj-pdf + ${asciidoctorj.pdf.version} + + + + org.jruby + jruby-complete + ${jruby.version} + + + + org.asciidoctor + asciidoctorj + ${asciidoctorj.version} + + + + src/asciidoc + SCViewerHelp.adoc + true + + + + output-html + generate-resources + + process-asciidoc + + + coderay + html + + + false + + + + + output-docbook + generate-resources + + process-asciidoc + + + docbook + + + + output-pdf + generate-resources + + process-asciidoc + + + pdf + coderay + + font + + + + - + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + copy-asciidoc-resources + generate-resources + + copy-resources + + + + + target/generated-docs/ + + SCViewerHelp.xml + **/*.jpg + **/*.png + **/*.svg + + + + src/docbkx + + + + + + com.agilejava.docbkx + docbkx-maven-plugin + 2.0.17 + + + + generate-resources + + generate-eclipse + + + + + + org.docbook + docbook-xml + 4.4 + runtime + + + + src/docbkx + ${help.plugin.target.dir} + + + + + + + + + ./ + + 1 + 1 + java + 1 + A4 + + + + + css/narrow_style.css + + SCViewerHelp.xml + true + true + + com.minres.scviewer.doc + + + + + diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc new file mode 100644 index 0000000..10248d4 --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc @@ -0,0 +1,26 @@ +// ///////////////////////////////////////////////////////////////////////////////////////////////////// OVERVIEW /////////////////////////////////////////////////////// + +[#_introduction] +== Introduction + +[#_overview] +=== SCViewer overview + +SCViewer is composed of a set of eclipse plugins to display VCD and transaction streams +created by the SystemC VCD trace implementation and the SystemC Verification Library (SCV). +For further description of the SCV please refer to +http://www.accellera.org/activities/committees/systemc-verification. + + +[#_features] +=== SCViewer features + +Features include: +* support of VCD files (compressed and uncompressed) +** real numbers +** showing vectors and real numbers as analog (step-wise & continuous) +* various value representations of bit vectors +* support of SCV transaction recordings in various formats +** text log files (compressed and uncompressed) +** sqlite based +** visualization of transaction relations diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc new file mode 100644 index 0000000..8867c5b --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc @@ -0,0 +1,39 @@ +// ///////////////////////////////////////////////////////////////////////////////////////////////////// Reference ////////////////////////////////////////////////////// + +[#_reference] +== Reference + +In this section you will find detailed descriptions of all GUI and menu elements of the SCViewer including their functions and keyboard shortcuts. + +[#_keybindings] +=== Key Shortcuts + +Legend: + +* Left Mouse Button: LMB +* Middle Mouse Button: MMB +* Mouse Scroll wheel: MScrl +* Context any means Name List, Value List or Waveform + +| Input | Modifier | Context | Action | +|-----------|----------|----------|-----------------------------------| +| LMB klick | | any | select | +| LMB klick | Shift | Waveform | move selected marker to position | +| LMB klick | Control | Waveform | move cursor to position | +| LMB drag | | Waveform | zoom to range | +| MMB klick | | Waveform | move selected marker to position | +| MScrl | | any | scroll window up/down | +| MScrl | Shift | any | scroll window left/right | +| Key left | | Waveform | scroll window to the left (slow) | +| Key right | | Waveform | scroll window to the right (slow) | +| Key left | Shift | Waveform | scroll window to the left (fast) | +| Key right | Shift | Waveform | scroll window to the right (fast) | +| Key up | | Waveform | move selection up | +| Key down | | Waveform | move selection down | +| Key up | Control | Waveform | move selected track up | +| Key down | Control | Waveform | move selected track down | +| Key + | Control | Waveform | zoom in | +| Key - | Control | Waveform | zoom out | +| Key Pos1 | | Waveform | jump to selected marker | +| Key End | | Waveform | jump to cursor | +| Key Del | | any | delete selected entries | diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc new file mode 100644 index 0000000..3c3e6e9 --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc @@ -0,0 +1,28 @@ +[#_start] += SCViewer User Guide +:doctype: book +:source-highlighter: coderay +:coderay-linenums-mode: inline +:coderay-css: class +:listing-caption: Listing +:icons: font +//add table-of-contents (toc) and set its depth +:toc: +:toclevels: 6 +//set directories +:imagesdir: ./images +:iconsdir: ./icons +:stylesdir: ./styles +:scriptsdir: ./js +:title-logo-image: image:Minres_logo_square.png[] +//add math support, also do via cmd-line a 'gem install asciimath' +:stem: + +// unset toc, otherwise it appears in table cells -> known bug, should be fixed in later versions! +:toc!: + +// ///////////////////////////////////////////////////////////////////////////////////////////////////// OVERVIEW /////////////////////////////////////////////////////// +include::Overview.adoc[] + +// ///////////////////////////////////////////////////////////////////////////////////////////////////// Reference ////////////////////////////////////////////////////// +include::Reference.adoc[] diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo_square.png b/doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..981da5e86aa7fd207d0e7138d6e1820770f333b0 GIT binary patch literal 21175 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ⅅ^t<#b+bzCmQPO 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 a0{ + + com.minres.scviewer.e4.help.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/com.minres.scviewer.e4.help.feature/build.properties b/features/com.minres.scviewer.e4.help.feature/build.properties new file mode 100644 index 0000000..64f93a9 --- /dev/null +++ b/features/com.minres.scviewer.e4.help.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/com.minres.scviewer.e4.help.feature/feature.xml b/features/com.minres.scviewer.e4.help.feature/feature.xml new file mode 100644 index 0000000..d9d9fb0 --- /dev/null +++ b/features/com.minres.scviewer.e4.help.feature/feature.xml @@ -0,0 +1,204 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/features/com.minres.scviewer.e4.help.feature/pom.xml b/features/com.minres.scviewer.e4.help.feature/pom.xml new file mode 100644 index 0000000..a6a6050 --- /dev/null +++ b/features/com.minres.scviewer.e4.help.feature/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + com.minres.scviewer.e4.help.feature + eclipse-feature + + com.minres.scviewer + com.minres.scviewer.parent + 2.15.1 + ../.. + + 1.0.0-SNAPSHOT + diff --git a/plugins/com.minres.scviewer.e4.application.help/.classpath b/plugins/com.minres.scviewer.e4.application.help/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/plugins/com.minres.scviewer.e4.application.help/.gitignore b/plugins/com.minres.scviewer.e4.application.help/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/plugins/com.minres.scviewer.e4.application.help/.project b/plugins/com.minres.scviewer.e4.application.help/.project new file mode 100644 index 0000000..6204755 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/.project @@ -0,0 +1,28 @@ + + + com.minres.scviewer.e4.application.help + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/com.minres.scviewer.e4.application.help/.settings/org.eclipse.jdt.core.prefs b/plugins/com.minres.scviewer.e4.application.help/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..c9545f0 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF new file mode 100644 index 0000000..9b463f6 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: SCViewer Help +Bundle-SymbolicName: com.minres.scviewer.e4.application.help;singleton:=true +Bundle-Version: 2.15.1 +Bundle-Vendor: MINRES Technologies GmbH +Automatic-Module-Name: com.minres.scviewer.e4.application.help +Bundle-RequiredExecutionEnvironment: JavaSE-11 diff --git a/plugins/com.minres.scviewer.e4.application.help/OSGI-INF/l10n/bundle.properties b/plugins/com.minres.scviewer.e4.application.help/OSGI-INF/l10n/bundle.properties new file mode 100644 index 0000000..91ef34c --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,5 @@ +#Properties file for com.minres.scviewer.e4.application +Bundle-Vendor = MINRES Technologies GmbH +Bundle-Name = Application Help +product.description = SystemC Transaction and Waveform Viewer +product.name = SCViewer \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/build.properties b/plugins/com.minres.scviewer.e4.application.help/build.properties new file mode 100644 index 0000000..fc53675 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/build.properties @@ -0,0 +1,7 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + html/,\ + *.xml diff --git a/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html b/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html new file mode 100644 index 0000000..a476078 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html @@ -0,0 +1,13 @@ + + + + + + Main Topic + + + +

Main Topic

+Please enter your text here. + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html b/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html new file mode 100644 index 0000000..8a61c50 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html @@ -0,0 +1,13 @@ + + + + + + Sub Topic + + + +

Sub Topic

+Please enter your text here. + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/html/toc.html b/plugins/com.minres.scviewer.e4.application.help/html/toc.html new file mode 100644 index 0000000..326f0a9 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/html/toc.html @@ -0,0 +1,13 @@ + + + + + + Table of Contents + + + +

Table of Contents

+Please enter your text here. + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/plugin.xml b/plugins/com.minres.scviewer.e4.application.help/plugin.xml new file mode 100644 index 0000000..00836fc --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/plugin.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/plugins/com.minres.scviewer.e4.application.help/pom.xml b/plugins/com.minres.scviewer.e4.application.help/pom.xml new file mode 100644 index 0000000..614de66 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + com.minres.scviewer.e4.application.help + + com.minres.scviewer + com.minres.scviewer.parent + 2.15.1 + ../.. + + eclipse-plugin + diff --git a/plugins/com.minres.scviewer.e4.application.help/testToc.xml b/plugins/com.minres.scviewer.e4.application.help/testToc.xml new file mode 100644 index 0000000..bf1e67a --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/testToc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/toc.xml b/plugins/com.minres.scviewer.e4.application.help/toc.xml new file mode 100644 index 0000000..1f661a6 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/toc.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index 56d12d1..cc44340 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -57,7 +57,8 @@ - + + @@ -113,8 +114,9 @@ - + + type:user @@ -248,7 +250,7 @@ - + @@ -292,12 +294,13 @@ - - - + + + + diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index 86e2263..cfc1e01 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -35,7 +35,11 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.equinox.p2.core;bundle-version="2.6.300", org.eclipse.equinox.p2.engine;bundle-version="2.6.600", org.eclipse.equinox.p2.operations;bundle-version="2.5.700", - org.eclipse.equinox.p2.metadata.repository;bundle-version="1.3.400" + org.eclipse.equinox.p2.metadata.repository;bundle-version="1.3.400", + org.eclipse.help;bundle-version="3.8.700", + org.eclipse.help.webapp;bundle-version="3.9.800", + org.eclipse.help.base;bundle-version="4.2.900", + com.minres.scviewer.e4.application.help;bundle-version="1.0.0" Bundle-RequiredExecutionEnvironment: JavaSE-11 Import-Package: com.minres.scviewer.database, javax.annotation;version="1.0.0";resolution:=optional, diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java new file mode 100644 index 0000000..d673ba0 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java @@ -0,0 +1,15 @@ +package com.minres.scviewer.e4.application.handlers; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.help.internal.base.BaseHelpSystem; +import org.eclipse.help.internal.server.WebappManager; + +public class HelpContentsHandler { + @Execute + public void execute() throws Exception { + BaseHelpSystem.ensureWebappRunning(); + String helpURL = "http://" //$NON-NLS-1$ + + WebappManager.getHost() + ":" //$NON-NLS-1$ + + WebappManager.getPort() + "/help/index.jsp"; //$NON-NLS-1$ + BaseHelpSystem.getHelpBrowser(false).displayURL(helpURL); + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java index 187c7d7..eb00b3a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java @@ -18,7 +18,7 @@ import org.eclipse.e4.ui.workbench.modeling.EModelService; public class HelpHandler { - static final String WINDOW_ID="com.minres.scviewer.e4.application.window.help"; //$NON-NLS-1$ + static final String WINDOW_ID="com.minres.scviewer.e4.application.window.web_help"; //$NON-NLS-1$ @CanExecute public boolean canExecute(MApplication app) { return !app.getChildren().stream().filter(e -> e.getElementId().equals(WINDOW_ID)).findFirst().isPresent(); diff --git a/pom.xml b/pom.xml index 848bb7d..ff64bd9 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,7 @@ pom releng/com.minres.scviewer.target + doc/com.minres.scviewer.doc plugins/com.minres.scviewer.database plugins/com.minres.scviewer.database.sqlite plugins/com.minres.scviewer.database.text @@ -15,12 +16,14 @@ tests/com.minres.scviewer.database.test plugins/com.minres.scviewer.database.ui.swt plugins/com.minres.scviewer.e4.application + plugins/com.minres.scviewer.e4.application.help plugins/com.minres.scviewer.ui features/com.minres.scviewer.database.feature features/com.minres.scviewer.ui.feature features/com.minres.scviewer.feature features/com.minres.scviewer.e4.platform.feature features/com.minres.scviewer.e4.feature + features/com.minres.scviewer.e4.help.feature releng/com.minres.scviewer.updateSite products/com.minres.scviewer.e4.product diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index 3e2be35..aed1aa7 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -3,7 +3,6 @@ - @@ -18,7 +17,6 @@ - @@ -35,7 +33,6 @@ - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 @@ -65,6 +62,7 @@ + From 8119c1a4f3dc017c187d02e3fdcf64016f44fc3e Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 8 Jan 2022 17:36:52 +0100 Subject: [PATCH 11/28] direct generation of help plugin --- doc/com.minres.scviewer.doc/pom.xml | 2 +- .../.gitignore | 3 +++ .../build.properties | 7 ++++-- .../html/maintopic.html | 13 ----------- .../html/subtopic.html | 13 ----------- .../html/toc.html | 13 ----------- .../index.xml | 2 ++ .../plugin.xml | 23 +++++++------------ .../testToc.xml | 6 ----- .../toc.xml | 19 +++++++-------- 10 files changed, 29 insertions(+), 72 deletions(-) delete mode 100644 plugins/com.minres.scviewer.e4.application.help/html/maintopic.html delete mode 100644 plugins/com.minres.scviewer.e4.application.help/html/subtopic.html delete mode 100644 plugins/com.minres.scviewer.e4.application.help/html/toc.html create mode 100644 plugins/com.minres.scviewer.e4.application.help/index.xml delete mode 100644 plugins/com.minres.scviewer.e4.application.help/testToc.xml diff --git a/doc/com.minres.scviewer.doc/pom.xml b/doc/com.minres.scviewer.doc/pom.xml index 53d18b8..85f68e7 100644 --- a/doc/com.minres.scviewer.doc/pom.xml +++ b/doc/com.minres.scviewer.doc/pom.xml @@ -17,7 +17,7 @@ 1.5.0-alpha.16 1.5.6 1.7.26 - target/eclipse + ../../plugins/com.minres.scviewer.e4.application.help diff --git a/plugins/com.minres.scviewer.e4.application.help/.gitignore b/plugins/com.minres.scviewer.e4.application.help/.gitignore index b83d222..187a545 100644 --- a/plugins/com.minres.scviewer.e4.application.help/.gitignore +++ b/plugins/com.minres.scviewer.e4.application.help/.gitignore @@ -1 +1,4 @@ /target/ +/css/ +/images/ +/*.html diff --git a/plugins/com.minres.scviewer.e4.application.help/build.properties b/plugins/com.minres.scviewer.e4.application.help/build.properties index fc53675..b439b53 100644 --- a/plugins/com.minres.scviewer.e4.application.help/build.properties +++ b/plugins/com.minres.scviewer.e4.application.help/build.properties @@ -3,5 +3,8 @@ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ .,\ - html/,\ - *.xml + images/,\ + css/,\ + *.html,\ + *.xml,\ + OSGI-INF/ diff --git a/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html b/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html deleted file mode 100644 index a476078..0000000 --- a/plugins/com.minres.scviewer.e4.application.help/html/maintopic.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Main Topic - - - -

Main Topic

-Please enter your text here. - - \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html b/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html deleted file mode 100644 index 8a61c50..0000000 --- a/plugins/com.minres.scviewer.e4.application.help/html/subtopic.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Sub Topic - - - -

Sub Topic

-Please enter your text here. - - \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/html/toc.html b/plugins/com.minres.scviewer.e4.application.help/html/toc.html deleted file mode 100644 index 326f0a9..0000000 --- a/plugins/com.minres.scviewer.e4.application.help/html/toc.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Table of Contents - - - -

Table of Contents

-Please enter your text here. - - \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/index.xml b/plugins/com.minres.scviewer.e4.application.help/index.xml new file mode 100644 index 0000000..1030b6d --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application.help/index.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/plugin.xml b/plugins/com.minres.scviewer.e4.application.help/plugin.xml index 00836fc..54d61bf 100644 --- a/plugins/com.minres.scviewer.e4.application.help/plugin.xml +++ b/plugins/com.minres.scviewer.e4.application.help/plugin.xml @@ -1,16 +1,9 @@ - - - - - - - - - + + + + - - + + + + \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/testToc.xml b/plugins/com.minres.scviewer.e4.application.help/testToc.xml deleted file mode 100644 index bf1e67a..0000000 --- a/plugins/com.minres.scviewer.e4.application.help/testToc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/toc.xml b/plugins/com.minres.scviewer.e4.application.help/toc.xml index 1f661a6..3e9aedd 100644 --- a/plugins/com.minres.scviewer.e4.application.help/toc.xml +++ b/plugins/com.minres.scviewer.e4.application.help/toc.xml @@ -1,9 +1,10 @@ - - - - - - - - - + + + + + + + + + + \ No newline at end of file From c474ca33d8c4b14f9c1406da512613945b8dda22 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 8 Jan 2022 18:31:27 +0100 Subject: [PATCH 12/28] use internal help browser --- .../Application.e4xmi | 5 +- .../scviewer/e4/application/Messages.java | 14 +- .../handlers/HelpContentsHandler.java | 27 ++- .../e4/application/handlers/HelpHandler.java | 9 +- .../e4/application/messages.properties | 14 +- .../e4/application/parts/HelpDialog.java | 177 ------------------ .../application/parts/help/HelpBrowser.java | 39 ++-- 7 files changed, 61 insertions(+), 224 deletions(-) delete mode 100644 plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpDialog.java diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index cc44340..d8ea1ab 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -121,7 +121,7 @@ type:user - + @@ -253,6 +253,9 @@ + + + diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java index 3d88974..6e683f4 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/Messages.java @@ -83,16 +83,14 @@ public class Messages extends NLS { public static String cursor; public static String cursor_drag; public static String cursor_text; + public static String HelpBrowser_0; + public static String HelpBrowser_1; + public static String HelpBrowser_2; + public static String HelpBrowser_3; + public static String HelpBrowser_4; + public static String HelpBrowser_5; public static String HelpBrowser_7; public static String HelpBrowser_8; - public static String HelpDialog_0; - public static String HelpDialog_1; - public static String HelpDialog_2; - public static String HelpDialog_3; - public static String HelpDialog_4; - public static String HelpDialog_5; - public static String HelpDialog_6; - public static String HelpDialog_7; public static String marker; public static String marker_text; public static String rel_arrow; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java index d673ba0..fc1969a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpContentsHandler.java @@ -1,15 +1,34 @@ package com.minres.scviewer.e4.application.handlers; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.ui.basic.MWindow; +import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.help.internal.base.BaseHelpSystem; import org.eclipse.help.internal.server.WebappManager; public class HelpContentsHandler { - @Execute - public void execute() throws Exception { + + static final String WINDOW_ID="com.minres.scviewer.e4.application.window.help_content"; //$NON-NLS-1$ + + @CanExecute + public boolean canExecute(MApplication app) { + return !app.getChildren().stream().filter(e -> e.getElementId().equals(WINDOW_ID)).findFirst().isPresent(); + } + + @Execute + public void execute(MApplication app, EModelService modelService /*@Named("mdialog01.dialog.0") MDialog dialog*/) { BaseHelpSystem.ensureWebappRunning(); String helpURL = "http://" //$NON-NLS-1$ + WebappManager.getHost() + ":" //$NON-NLS-1$ + WebappManager.getPort() + "/help/index.jsp"; //$NON-NLS-1$ - BaseHelpSystem.getHelpBrowser(false).displayURL(helpURL); - } + // BaseHelpSystem.getHelpBrowser(false).displayURL(helpURL); + MWindow newWin = (MWindow)modelService.cloneSnippet(app, WINDOW_ID, null); + final IEclipseContext ctx=app.getContext(); + if(ctx.containsKey("help_url")) + ctx.remove("help_url"); + ctx.modify("help_url", helpURL); + app.getChildren().add(newWin); + } } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java index eb00b3a..bd6292e 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/HelpHandler.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.minres.scviewer.e4.application.handlers; +import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.model.application.MApplication; @@ -19,15 +20,19 @@ import org.eclipse.e4.ui.workbench.modeling.EModelService; public class HelpHandler { static final String WINDOW_ID="com.minres.scviewer.e4.application.window.web_help"; //$NON-NLS-1$ + @CanExecute public boolean canExecute(MApplication app) { return !app.getChildren().stream().filter(e -> e.getElementId().equals(WINDOW_ID)).findFirst().isPresent(); } @Execute - public void execute(MApplication app, MWindow window, EModelService modelService /*@Named("mdialog01.dialog.0") MDialog dialog*/) { + public void execute(MApplication app, EModelService modelService /*@Named("mdialog01.dialog.0") MDialog dialog*/) { MWindow newWin = (MWindow)modelService.cloneSnippet(app, WINDOW_ID, null); + final IEclipseContext ctx=app.getContext(); + if(ctx.containsKey("help_url")) + ctx.remove("help_url"); + ctx.modify("help_url", "https://minres.github.io/SCViewer/#key-shortcuts"); app.getChildren().add(newWin); } - } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties index 6c98d1c..1266f5a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/messages.properties @@ -77,16 +77,14 @@ signal_nan=Signal NaN Value cursor=Cursor cursor_drag=dragged Cursor cursor_text=Cursor Text +HelpBrowser_0=Back +HelpBrowser_1=Forward +HelpBrowser_2=Stop +HelpBrowser_3=Refresh +HelpBrowser_4=Go +HelpBrowser_5=Address HelpBrowser_7=Error initializing help browser HelpBrowser_8=An error occurred while initializing the help browser: -HelpDialog_0=Back -HelpDialog_1=Forward -HelpDialog_2=Stop -HelpDialog_3=Refresh -HelpDialog_4=Go -HelpDialog_5=Address -HelpDialog_6=https://minres.github.io/SCViewer/#key-shortcuts -HelpDialog_7=Could not instantiate Browser: marker=Marker marker_text=Marker TExt rel_arrow=Relation arrow diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpDialog.java deleted file mode 100644 index 749ab42..0000000 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpDialog.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.minres.scviewer.e4.application.parts; - -import javax.annotation.PostConstruct; -import javax.inject.Inject; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTError; -import org.eclipse.swt.browser.Browser; -import org.eclipse.swt.browser.LocationListener; -import org.eclipse.swt.browser.ProgressEvent; -import org.eclipse.swt.browser.ProgressListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.ProgressBar; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; - -import com.minres.scviewer.e4.application.Messages; - -public class HelpDialog extends Dialog { - /** - * Create the dialog. - * - * @param parentShell the parent shell - */ - @Inject - public HelpDialog(Shell parentShell) { - super(parentShell); - setShellStyle(getShellStyle() | SWT.MODELESS | SWT.MAX | SWT.BORDER | SWT.TITLE); - setBlockOnOpen(false); - } - - @Override - protected boolean isResizable() { - return true; - } - - @Override - protected Point getInitialSize() { - return new Point(800, 600); - } - - /** - * Create contents of the dialog. - * - * @param parent the parent - * @return the control - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - GridLayout gridLayout = new GridLayout(); - gridLayout.numColumns = 3; - container.setLayout(gridLayout); - ToolBar toolbar = new ToolBar(container, SWT.NONE); - ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH); - itemBack.setText(Messages.HelpDialog_0); - ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH); - itemForward.setText(Messages.HelpDialog_1); - ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH); - itemStop.setText(Messages.HelpDialog_2); - ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH); - itemRefresh.setText(Messages.HelpDialog_3); - ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH); - itemGo.setText(Messages.HelpDialog_4); - - GridData data = new GridData(); - data.horizontalSpan = 3; - toolbar.setLayoutData(data); - - Label labelAddress = new Label(container, SWT.NONE); - labelAddress.setText(Messages.HelpDialog_5); - - final Text location = new Text(container, SWT.BORDER); - data = new GridData(); - data.horizontalAlignment = GridData.FILL; - data.horizontalSpan = 2; - data.grabExcessHorizontalSpace = true; - location.setLayoutData(data); - - final Browser browser; - try { - browser = new Browser(container, SWT.NONE); - data = new GridData(); - // data.widthHint = 800; - // data.heightHint =600; - data.horizontalAlignment = GridData.FILL; - data.verticalAlignment = GridData.FILL; - data.horizontalSpan = 3; - data.grabExcessHorizontalSpace = true; - data.grabExcessVerticalSpace = true; - browser.setLayoutData(data); - - final Label status = new Label(container, SWT.NONE); - data = new GridData(GridData.FILL_HORIZONTAL); - data.horizontalSpan = 2; - status.setLayoutData(data); - - final ProgressBar progressBar = new ProgressBar(container, SWT.NONE); - data = new GridData(); - data.horizontalAlignment = GridData.END; - progressBar.setLayoutData(data); - - /* event handling */ - Listener listener = event -> { - ToolItem item = (ToolItem) event.widget; - String string = item.getText(); - if (string.equals(Messages.HelpDialog_0)) - browser.back(); - else if (string.equals(Messages.HelpDialog_1)) - browser.forward(); - else if (string.equals(Messages.HelpDialog_2)) - browser.stop(); - else if (string.equals(Messages.HelpDialog_3)) - browser.refresh(); - else if (string.equals(Messages.HelpDialog_4)) - browser.setUrl(location.getText()); - }; - browser.addProgressListener(new ProgressListener() { - @Override - public void changed(ProgressEvent event) { - if (event.total == 0) return; - int ratio = event.current * 100 / event.total; - progressBar.setSelection(ratio); - } - @Override - public void completed(ProgressEvent event) { - progressBar.setSelection(0); - } - }); - browser.addStatusTextListener(event -> status.setText(event.text)); - browser.addLocationListener(LocationListener.changedAdapter(event -> { - if (event.top) location.setText(event.location); - } - )); - itemBack.addListener(SWT.Selection, listener); - itemForward.addListener(SWT.Selection, listener); - itemStop.addListener(SWT.Selection, listener); - itemRefresh.addListener(SWT.Selection, listener); - itemGo.addListener(SWT.Selection, listener); - location.addListener(SWT.DefaultSelection, e -> browser.setUrl(location.getText())); - - browser.setUrl(Messages.HelpDialog_6); - } catch (SWTError e) { - System.out.println(Messages.HelpDialog_7 + e.getMessage()); - } - return container; - } - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) - */ - @Override - protected void createButtonsForButtonBar(Composite parent) { - // create OK button - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); - } - - /** - * Open the dialog. - * @return the result - */ - @PostConstruct - @Override - public int open() { - return super.open(); - } - -} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java index d962fbb..7f64fe4 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java @@ -4,6 +4,7 @@ import java.io.File; import javax.annotation.PostConstruct; import javax.inject.Inject; +import javax.inject.Named; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.model.application.ui.MUIElement; @@ -48,32 +49,28 @@ public class HelpBrowser { } @PostConstruct - protected Control createComposite(Composite container) { -// container.getShell().addListener(SWT.Close, e -> { -// e.doit= false; -// element.setVisible(false); -// }); + protected Control createComposite(Composite container, @Named("help_url") String helpUrl) { GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 3; container.setLayout(gridLayout); ToolBar toolbar = new ToolBar(container, SWT.NONE); ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH); - decorateItem(itemBack, Messages.HelpDialog_0, "arrow_undo.png"); //$NON-NLS-1$ + decorateItem(itemBack, Messages.HelpBrowser_0, "arrow_undo.png"); //$NON-NLS-1$ ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH); - decorateItem(itemForward, Messages.HelpDialog_1, "arrow_redo.png"); //$NON-NLS-1$ + decorateItem(itemForward, Messages.HelpBrowser_1, "arrow_redo.png"); //$NON-NLS-1$ ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH); - decorateItem(itemStop, Messages.HelpDialog_2, "cross.png"); //$NON-NLS-1$ + decorateItem(itemStop, Messages.HelpBrowser_2, "cross.png"); //$NON-NLS-1$ ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH); - decorateItem(itemRefresh, Messages.HelpDialog_3, "arrow_refresh.png"); //$NON-NLS-1$ + decorateItem(itemRefresh, Messages.HelpBrowser_3, "arrow_refresh.png"); //$NON-NLS-1$ ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH); - decorateItem(itemGo, Messages.HelpDialog_4, "accept.png"); //$NON-NLS-1$ + decorateItem(itemGo, Messages.HelpBrowser_4, "accept.png"); //$NON-NLS-1$ GridData data = new GridData(); data.horizontalSpan = 3; toolbar.setLayoutData(data); Label labelAddress = new Label(container, SWT.NONE); - labelAddress.setText(Messages.HelpDialog_5); + labelAddress.setText(Messages.HelpBrowser_5); final Text location = new Text(container, SWT.BORDER); data = new GridData(); @@ -81,10 +78,8 @@ public class HelpBrowser { data.horizontalSpan = 2; data.grabExcessHorizontalSpace = true; location.setLayoutData(data); - - final Browser browser; try { - browser = new Browser(container, SWT.NONE); + final Browser browser = new Browser(container, SWT.NONE); data = new GridData(); // data.widthHint = 800; // data.heightHint =600; @@ -109,15 +104,15 @@ public class HelpBrowser { Listener listener = event -> { ToolItem item = (ToolItem) event.widget; String string = (String) item.getData(); - if (string.equals(Messages.HelpDialog_0)) + if (string.equals(Messages.HelpBrowser_0)) browser.back(); - else if (string.equals(Messages.HelpDialog_1)) + else if (string.equals(Messages.HelpBrowser_1)) browser.forward(); - else if (string.equals(Messages.HelpDialog_2)) + else if (string.equals(Messages.HelpBrowser_2)) browser.stop(); - else if (string.equals(Messages.HelpDialog_3)) + else if (string.equals(Messages.HelpBrowser_3)) browser.refresh(); - else if (string.equals(Messages.HelpDialog_4)) + else if (string.equals(Messages.HelpBrowser_4)) browser.setUrl(location.getText()); }; browser.addProgressListener(new ProgressListener() { @@ -140,14 +135,10 @@ public class HelpBrowser { itemRefresh.addListener(SWT.Selection, listener); itemGo.addListener(SWT.Selection, listener); location.addListener(SWT.DefaultSelection, e -> browser.setUrl(location.getText())); - browser.setUrl(Messages.HelpDialog_6); + browser.setUrl(helpUrl); } catch (SWTError e) { MessageDialog.openWarning(container.getDisplay().getActiveShell(), Messages.HelpBrowser_7,Messages.HelpBrowser_8+e.getMessage()); } return container; } - - void handleShellCloseEvent(){ - - } } \ No newline at end of file From fc64fa781a8307d2553f6bd2cc8f1d4cf9947f86 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 8 Jan 2022 18:31:42 +0100 Subject: [PATCH 13/28] fix adoc syntax --- .../src/asciidoc/Overview.adoc | 1 + .../src/asciidoc/Reference.adoc | 45 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc index 10248d4..3599325 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc @@ -16,6 +16,7 @@ http://www.accellera.org/activities/committees/systemc-verification. === SCViewer features Features include: + * support of VCD files (compressed and uncompressed) ** real numbers ** showing vectors and real numbers as analog (step-wise & continuous) diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc index 8867c5b..71beeaf 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc @@ -15,25 +15,26 @@ Legend: * Mouse Scroll wheel: MScrl * Context any means Name List, Value List or Waveform -| Input | Modifier | Context | Action | -|-----------|----------|----------|-----------------------------------| -| LMB klick | | any | select | -| LMB klick | Shift | Waveform | move selected marker to position | -| LMB klick | Control | Waveform | move cursor to position | -| LMB drag | | Waveform | zoom to range | -| MMB klick | | Waveform | move selected marker to position | -| MScrl | | any | scroll window up/down | -| MScrl | Shift | any | scroll window left/right | -| Key left | | Waveform | scroll window to the left (slow) | -| Key right | | Waveform | scroll window to the right (slow) | -| Key left | Shift | Waveform | scroll window to the left (fast) | -| Key right | Shift | Waveform | scroll window to the right (fast) | -| Key up | | Waveform | move selection up | -| Key down | | Waveform | move selection down | -| Key up | Control | Waveform | move selected track up | -| Key down | Control | Waveform | move selected track down | -| Key + | Control | Waveform | zoom in | -| Key - | Control | Waveform | zoom out | -| Key Pos1 | | Waveform | jump to selected marker | -| Key End | | Waveform | jump to cursor | -| Key Del | | any | delete selected entries | +[cols="1,1,1,4",options="header"] +|=== +| Input | Modifier | Context | Action +| LMB klick | | any | select +| LMB klick | Shift | Waveform | move selected marker to position +| LMB klick | Control | Waveform | move cursor to position +| LMB drag | | Waveform | zoom to range +| MMB klick | | Waveform | move selected marker to position +| MScrl | | any | scroll window up/down +| MScrl | Shift | any | scroll window left/right +| Key left | | Waveform | scroll window to the left (slow) +| Key right | | Waveform | scroll window to the right (slow) +| Key left | Shift | Waveform | scroll window to the left (fast) +| Key right | Shift | Waveform | scroll window to the right (fast) +| Key up | | Waveform | move selection up +| Key down | | Waveform | move selection down +| Key up | Control | Waveform | move selected track up +| Key down | Control | Waveform | move selected track down +| Key + | Control | Waveform | zoom in +| Key - | Control | Waveform | zoom out +| Key Pos1 | | Waveform | jump to selected marker +| Key End | | Waveform | jump to cursor +| Key Del | | any | delete selected entries From fd8e2ea7514a04fc905acfbc4e509ba1b9378d88 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 8 Jan 2022 19:26:22 +0100 Subject: [PATCH 14/28] finishing touches on help system --- doc/com.minres.scviewer.doc/pom.xml | 2 +- .../src/asciidoc/Reference.adoc | 59 ++++++++++++------- .../plugin.xml | 2 +- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/doc/com.minres.scviewer.doc/pom.xml b/doc/com.minres.scviewer.doc/pom.xml index 85f68e7..dd2e999 100644 --- a/doc/com.minres.scviewer.doc/pom.xml +++ b/doc/com.minres.scviewer.doc/pom.xml @@ -174,7 +174,7 @@ true true - com.minres.scviewer.doc + com.minres.scviewer.e4.application.help diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc index 71beeaf..dccba11 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc @@ -17,24 +17,41 @@ Legend: [cols="1,1,1,4",options="header"] |=== -| Input | Modifier | Context | Action -| LMB klick | | any | select -| LMB klick | Shift | Waveform | move selected marker to position -| LMB klick | Control | Waveform | move cursor to position -| LMB drag | | Waveform | zoom to range -| MMB klick | | Waveform | move selected marker to position -| MScrl | | any | scroll window up/down -| MScrl | Shift | any | scroll window left/right -| Key left | | Waveform | scroll window to the left (slow) -| Key right | | Waveform | scroll window to the right (slow) -| Key left | Shift | Waveform | scroll window to the left (fast) -| Key right | Shift | Waveform | scroll window to the right (fast) -| Key up | | Waveform | move selection up -| Key down | | Waveform | move selection down -| Key up | Control | Waveform | move selected track up -| Key down | Control | Waveform | move selected track down -| Key + | Control | Waveform | zoom in -| Key - | Control | Waveform | zoom out -| Key Pos1 | | Waveform | jump to selected marker -| Key End | | Waveform | jump to cursor -| Key Del | | any | delete selected entries +| Input | Modifier | Context | Action +| LMB click | | any | select +| LMB click | Shift | Waveform | move selected marker to position +| LMB click | Control | Waveform | move cursor to position +| LMB drag | | Waveform | zoom to range +| MMB click | | Waveform | move selected marker to position +| MScrl | | any | scroll window up/down +| MScrl | Shift | any | scroll window left/right +| Key left | | Waveform | scroll window to the left (slow) +| Key right | | Waveform | scroll window to the right (slow) +| Key left | Shift | Waveform | scroll window to the left (fast) +| Key right | Shift | Waveform | scroll window to the right (fast) +| Key up | | Waveform | move selection up +| Key down | | Waveform | move selection down +| Key up | Control | Waveform | move selected track up +| Key down | Control | Waveform | move selected track down +| Key + | Control | Waveform | zoom in +| Key - | Control | Waveform | zoom out +| Key Pos1 | | Waveform | jump to selected marker +| Key End | | Waveform | jump to cursor +| Key Del | | any | delete selected entries +| LMB click | | ZoomBar | increment/decrement 1 page +| LMB drag | | ZoomBar | drag both markers (pan) +| LMB drag | Control | ZoomBar | drag one marker (zoom) +| MMB drag | | ZoomBar | drag one marker (zoom) +| xMB dclick | | ZoomBar | pan to position +| MScrl | | ZoomBar | scroll window left/right +| MScrl | Shift | ZoomBar | scroll window left/right double speed +| MScrl | Control | ZoomBar | zoom in/out +| Key left | | ZoomBar | scroll window to the left (slow) +| Key right | | ZoomBar | scroll window to the right (slow) +| Key up | | ZoomBar | scroll window to the left (slow) +| Key down | | ZoomBar | scroll window to the right (slow) +| Key PgUp | | ZoomBar | scroll window to the left (fast) +| Key PgDown | | ZoomBar | scroll window to the right (fast) +| Key Pos1 | | ZoomBar | scroll to begin +| Key End | | ZoomBar | scroll to end + diff --git a/plugins/com.minres.scviewer.e4.application.help/plugin.xml b/plugins/com.minres.scviewer.e4.application.help/plugin.xml index 54d61bf..78b73bf 100644 --- a/plugins/com.minres.scviewer.e4.application.help/plugin.xml +++ b/plugins/com.minres.scviewer.e4.application.help/plugin.xml @@ -1,5 +1,5 @@ - + From f81f84d60e43a333819ec1c049cc11a928f37419 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 08:44:59 +0100 Subject: [PATCH 15/28] cleanup of settings and add non-linux bundles to help feature --- .../feature.xml | 20 +++++++++++++++++++ .../.classpath | 1 - .../build.properties | 1 - 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/features/com.minres.scviewer.e4.help.feature/feature.xml b/features/com.minres.scviewer.e4.help.feature/feature.xml index d9d9fb0..dd433d9 100644 --- a/features/com.minres.scviewer.e4.help.feature/feature.xml +++ b/features/com.minres.scviewer.e4.help.feature/feature.xml @@ -201,4 +201,24 @@ version="0.0.0" unpack="false"/> + + + +
diff --git a/plugins/com.minres.scviewer.e4.application.help/.classpath b/plugins/com.minres.scviewer.e4.application.help/.classpath index e801ebf..bc3587d 100644 --- a/plugins/com.minres.scviewer.e4.application.help/.classpath +++ b/plugins/com.minres.scviewer.e4.application.help/.classpath @@ -2,6 +2,5 @@ - diff --git a/plugins/com.minres.scviewer.e4.application.help/build.properties b/plugins/com.minres.scviewer.e4.application.help/build.properties index b439b53..5e627c9 100644 --- a/plugins/com.minres.scviewer.e4.application.help/build.properties +++ b/plugins/com.minres.scviewer.e4.application.help/build.properties @@ -1,4 +1,3 @@ -source.. = src/ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ From 6987985e36367836406351bbe6a7b7476a615836 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 08:57:45 +0100 Subject: [PATCH 16/28] fix maven build --- features/com.minres.scviewer.e4.help.feature/feature.xml | 9 --------- .../com.minres.scviewer.e4.application.help/.classpath | 6 +++++- .../com.minres.scviewer.e4.application.help/.gitignore | 1 + .../build.properties | 1 + .../com.minres.scviewer.e4.application.help/src/.gitkeep | 0 5 files changed, 7 insertions(+), 10 deletions(-) create mode 100644 plugins/com.minres.scviewer.e4.application.help/src/.gitkeep diff --git a/features/com.minres.scviewer.e4.help.feature/feature.xml b/features/com.minres.scviewer.e4.help.feature/feature.xml index dd433d9..f53b91f 100644 --- a/features/com.minres.scviewer.e4.help.feature/feature.xml +++ b/features/com.minres.scviewer.e4.help.feature/feature.xml @@ -211,14 +211,5 @@ fragment="true" unpack="false"/> -
diff --git a/plugins/com.minres.scviewer.e4.application.help/.classpath b/plugins/com.minres.scviewer.e4.application.help/.classpath index bc3587d..638f5b3 100644 --- a/plugins/com.minres.scviewer.e4.application.help/.classpath +++ b/plugins/com.minres.scviewer.e4.application.help/.classpath @@ -1,6 +1,10 @@ - + + + + + diff --git a/plugins/com.minres.scviewer.e4.application.help/.gitignore b/plugins/com.minres.scviewer.e4.application.help/.gitignore index 187a545..a734a88 100644 --- a/plugins/com.minres.scviewer.e4.application.help/.gitignore +++ b/plugins/com.minres.scviewer.e4.application.help/.gitignore @@ -2,3 +2,4 @@ /css/ /images/ /*.html +/bin \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application.help/build.properties b/plugins/com.minres.scviewer.e4.application.help/build.properties index 5e627c9..b439b53 100644 --- a/plugins/com.minres.scviewer.e4.application.help/build.properties +++ b/plugins/com.minres.scviewer.e4.application.help/build.properties @@ -1,3 +1,4 @@ +source.. = src/ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ diff --git a/plugins/com.minres.scviewer.e4.application.help/src/.gitkeep b/plugins/com.minres.scviewer.e4.application.help/src/.gitkeep new file mode 100644 index 0000000..e69de29 From 1866ae17a94415e5053c4fdd8f026f2784f051af Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 11:12:17 +0100 Subject: [PATCH 17/28] add JavaSE-15 execution environment --- .../com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF | 2 +- .../com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF | 2 +- tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF index 90c5dab..c2e25d4 100644 --- a/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SQLite transaction database Bundle-SymbolicName: com.minres.scviewer.database.sqlite Bundle-Version: 1.1.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0" Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar Service-Component: OSGI-INF/component.xml diff --git a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF index 6de81a4..8bed760 100644 --- a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: Textual transaction database Bundle-SymbolicName: com.minres.scviewer.database.text Bundle-Version: 4.0.1.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Import-Package: org.osgi.framework;version="1.3.0" Require-Bundle: com.minres.scviewer.database, org.eclipse.osgi.services;bundle-version="3.4.0", diff --git a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF index a00e2e4..3698813 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SWT database widget Bundle-SymbolicName: com.minres.scviewer.database.ui.swt Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", com.minres.scviewer.database;bundle-version="1.0.0", com.google.guava;bundle-version="15.0.0", diff --git a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF index 7a1dbaf..adeb1fa 100644 --- a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: VCD signal database Bundle-SymbolicName: com.minres.scviewer.database.vcd Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi.services;bundle-version="3.4.0", com.google.guava;bundle-version="15.0.0" diff --git a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF index 0b7dec7..367cdd4 100644 --- a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: Waveform database Bundle-SymbolicName: com.minres.scviewer.database Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Export-Package: com.minres.scviewer.database, com.minres.scviewer.database.tx Bundle-ActivationPolicy: lazy diff --git a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF index 9b463f6..42a3a9d 100644 --- a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF @@ -5,4 +5,4 @@ Bundle-SymbolicName: com.minres.scviewer.e4.application.help;singleton:=true Bundle-Version: 2.15.1 Bundle-Vendor: MINRES Technologies GmbH Automatic-Module-Name: com.minres.scviewer.e4.application.help -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index cfc1e01..0ec2230 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -40,7 +40,7 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.help.webapp;bundle-version="3.9.800", org.eclipse.help.base;bundle-version="4.2.900", com.minres.scviewer.e4.application.help;bundle-version="1.0.0" -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Import-Package: com.minres.scviewer.database, javax.annotation;version="1.0.0";resolution:=optional, javax.inject;version="1.0.0" diff --git a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF index 9e29130..27c4ee3 100644 --- a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF @@ -18,7 +18,7 @@ Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi, org.eclipse.core.expressions;bundle-version="3.4.600", org.eclipse.jface -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Bundle-ActivationPolicy: lazy Import-Package: com.google.common.collect Service-Component: OSGI-INF/component.xml diff --git a/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF b/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF index 514f11a..ae78593 100644 --- a/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF +++ b/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SCViewer database tests Bundle-SymbolicName: com.minres.scviewer.database.test Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 Require-Bundle: com.minres.scviewer.database, com.minres.scviewer.database.sqlite;bundle-version="1.0.0", com.minres.scviewer.database.text;bundle-version="1.0.0", From a6aa9859ea8e2832d858ddde945333c4fb8f9aca Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 11:52:25 +0100 Subject: [PATCH 18/28] update maven plugin versions --- doc/com.minres.scviewer.doc/pom.xml | 18 ++---------------- pom.xml | 2 +- .../com.minres.scviewer.target.target | 5 +---- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/doc/com.minres.scviewer.doc/pom.xml b/doc/com.minres.scviewer.doc/pom.xml index dd2e999..71950ca 100644 --- a/doc/com.minres.scviewer.doc/pom.xml +++ b/doc/com.minres.scviewer.doc/pom.xml @@ -13,10 +13,8 @@ UTF-8 - 1.5.6 - 1.5.0-alpha.16 - 1.5.6 - 1.7.26 + 2.0.0 + 1.6.2 ../../plugins/com.minres.scviewer.e4.application.help @@ -32,18 +30,6 @@ asciidoctorj-pdf ${asciidoctorj.pdf.version} - - - org.jruby - jruby-complete - ${jruby.version} - - - - org.asciidoctor - asciidoctorj - ${asciidoctorj.version} - src/asciidoc diff --git a/pom.xml b/pom.xml index ff64bd9..d6ae52d 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ - 1.5.0 + 2.3.0 3.6.0-03 3.0.3-01 ${project.basedir}/../../.. diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index 146343c..6be82b0 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -37,8 +37,5 @@ - - - -Xms40m -Xmx2G - + \ No newline at end of file From eb4e2301c1634a82f743bebc26f539ac6561c1ec Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 11:59:33 +0100 Subject: [PATCH 19/28] fix minimum required execution environment --- .../com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF | 2 +- .../com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF index c2e25d4..90c5dab 100644 --- a/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.sqlite/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SQLite transaction database Bundle-SymbolicName: com.minres.scviewer.database.sqlite Bundle-Version: 1.1.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0" Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar Service-Component: OSGI-INF/component.xml diff --git a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF index 8bed760..6de81a4 100644 --- a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: Textual transaction database Bundle-SymbolicName: com.minres.scviewer.database.text Bundle-Version: 4.0.1.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Import-Package: org.osgi.framework;version="1.3.0" Require-Bundle: com.minres.scviewer.database, org.eclipse.osgi.services;bundle-version="3.4.0", diff --git a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF index 3698813..a00e2e4 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.ui.swt/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SWT database widget Bundle-SymbolicName: com.minres.scviewer.database.ui.swt Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: org.eclipse.swt;bundle-version="3.103.1", com.minres.scviewer.database;bundle-version="1.0.0", com.google.guava;bundle-version="15.0.0", diff --git a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF index adeb1fa..7a1dbaf 100644 --- a/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.vcd/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: VCD signal database Bundle-SymbolicName: com.minres.scviewer.database.vcd Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi.services;bundle-version="3.4.0", com.google.guava;bundle-version="15.0.0" diff --git a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF index 367cdd4..0b7dec7 100644 --- a/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: Waveform database Bundle-SymbolicName: com.minres.scviewer.database Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Export-Package: com.minres.scviewer.database, com.minres.scviewer.database.tx Bundle-ActivationPolicy: lazy diff --git a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF index 42a3a9d..9b463f6 100644 --- a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF @@ -5,4 +5,4 @@ Bundle-SymbolicName: com.minres.scviewer.e4.application.help;singleton:=true Bundle-Version: 2.15.1 Bundle-Vendor: MINRES Technologies GmbH Automatic-Module-Name: com.minres.scviewer.e4.application.help -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index 0ec2230..cfc1e01 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -40,7 +40,7 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.help.webapp;bundle-version="3.9.800", org.eclipse.help.base;bundle-version="4.2.900", com.minres.scviewer.e4.application.help;bundle-version="1.0.0" -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Import-Package: com.minres.scviewer.database, javax.annotation;version="1.0.0";resolution:=optional, javax.inject;version="1.0.0" diff --git a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF index 27c4ee3..9e29130 100644 --- a/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.ui/META-INF/MANIFEST.MF @@ -18,7 +18,7 @@ Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", org.eclipse.osgi, org.eclipse.core.expressions;bundle-version="3.4.600", org.eclipse.jface -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy Import-Package: com.google.common.collect Service-Component: OSGI-INF/component.xml From 9fe7a83dfa084a8437090f19b54d849b240e8fee Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 12:13:01 +0100 Subject: [PATCH 20/28] update target definition to 2021-09 --- .../com.minres.scviewer.target.target | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index 6be82b0..bdae75b 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -3,7 +3,7 @@ - + @@ -13,13 +13,9 @@ - + - - - - @@ -36,6 +32,11 @@ + - + \ No newline at end of file From 2a9c5ff6a572acc6d6a2120263f2151579ec4c40 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 13:29:10 +0100 Subject: [PATCH 21/28] add justj runtime --- .../com.minres.scviewer.e4.help.feature/feature.xml | 8 -------- pom.xml | 3 +++ .../com.minres.scviewer.e4.product/scviewer.product | 1 + .../com.minres.scviewer.target.target | 10 +++++----- .../META-INF/MANIFEST.MF | 2 +- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/features/com.minres.scviewer.e4.help.feature/feature.xml b/features/com.minres.scviewer.e4.help.feature/feature.xml index f53b91f..ffba2a7 100644 --- a/features/com.minres.scviewer.e4.help.feature/feature.xml +++ b/features/com.minres.scviewer.e4.help.feature/feature.xml @@ -145,13 +145,6 @@ version="0.0.0" unpack="false"/> - - -
diff --git a/pom.xml b/pom.xml index d6ae52d..47be6d9 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,9 @@ 2.15.1 + org.eclipse.justj.openjdk.hotspot.jre.minimal-15 + org.eclipse.justj.openjdk.hotspot.jre.minimal-15 + true linux diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index 899efaf..d1f7a38 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -63,6 +63,7 @@ + diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index bdae75b..e4d2353 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -11,6 +11,7 @@ + @@ -32,11 +33,10 @@ - + + + + \ No newline at end of file diff --git a/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF b/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF index ae78593..514f11a 100644 --- a/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF +++ b/tests/com.minres.scviewer.database.test/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: SCViewer database tests Bundle-SymbolicName: com.minres.scviewer.database.test Bundle-Version: 4.0.0.qualifier Bundle-Vendor: MINRES Technologies GmbH -Bundle-RequiredExecutionEnvironment: JavaSE-11, JavaSE-15 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: com.minres.scviewer.database, com.minres.scviewer.database.sqlite;bundle-version="1.0.0", com.minres.scviewer.database.text;bundle-version="1.0.0", From fbec7085223576790ef306596a3b22e96c2cc477 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 13:54:58 +0100 Subject: [PATCH 22/28] fix geometry of file browser --- .../minres/scviewer/e4/application/parts/FileBrowserDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java index 50e400c..4c24554 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/FileBrowserDialog.java @@ -115,7 +115,7 @@ public class FileBrowserDialog extends TrayDialog { getButton(IDialogConstants.OK_ID).setEnabled(!tableViewer.getSelection().isEmpty()); if(parent instanceof Shell) { Point size = ((Shell)parent).computeSize(SWT.DEFAULT, SWT.DEFAULT); - ((Shell)parent).setSize(size.x, 400); + ((Shell)parent).setSize(Math.max(size.x, 600), Math.max(size.y, 450)); ((Shell)parent).setText("Select database"); } return ret; From 8f48abf0aeb71ef424dfc78b629937d005501b91 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 13:57:49 +0100 Subject: [PATCH 23/28] cleanup package structure --- plugins/com.minres.scviewer.e4.application/Application.e4xmi | 4 ++-- .../scviewer/e4/application/parts/{help => }/HelpBrowser.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/{help => }/HelpBrowser.java (98%) diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index d8ea1ab..b4b56a0 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -251,10 +251,10 @@ - + - + diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpBrowser.java similarity index 98% rename from plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java rename to plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpBrowser.java index 7f64fe4..ca9eb73 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/help/HelpBrowser.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/HelpBrowser.java @@ -1,4 +1,4 @@ -package com.minres.scviewer.e4.application.parts.help; +package com.minres.scviewer.e4.application.parts; import java.io.File; From d7f6d9b8796aee99fa05e7d022b726e941d186b7 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 14:02:05 +0100 Subject: [PATCH 24/28] add second style for documentation --- .../src/docbkx/css/style.css | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 doc/com.minres.scviewer.doc/src/docbkx/css/style.css diff --git a/doc/com.minres.scviewer.doc/src/docbkx/css/style.css b/doc/com.minres.scviewer.doc/src/docbkx/css/style.css new file mode 100644 index 0000000..9cbd9bc --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/docbkx/css/style.css @@ -0,0 +1,108 @@ +P.Code { + display: block; + text-align: left; + text-indent: 0.00pt; + margin-top: 0.000000pt; + margin-bottom: 0.000000pt; + margin-right: 0.000000pt; + margin-left: 15pt; + font-weight: normal; + font-style: normal; + color: #4444CC; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New", Courier, monospace; +} +H6.CaptionFigColumn { + display: block; + text-align: left; + text-indent: 0.000000pt; + margin-top: 3.000000pt; + margin-bottom: 11.000000pt; + margin-right: 0.000000pt; + margin-left: 0.000000pt; + font-size: 75%; + font-weight: bold; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; +} +P.Note { + display: block; + text-align: left; + text-indent: 0pt; + margin-top: 19.500000pt; + margin-bottom: 19.500000pt; + margin-right: 0.000000pt; + margin-left: 30pt; + font-size: 110%; + font-weight: normal; + font-style: Italic; + color: #000000; + text-decoration: none; + vertical-align: baseline; + text-transform: none; +} +EM.UILabel { + font-weight: Bold; + font-style: normal; + text-decoration: none; + vertical-align: baseline; + text-transform: none; +} +EM.CodeName { + font-weight: Bold; + font-style: normal; + text-decoration: none; + vertical-align: baseline; + text-transform: none; + font-family: "Courier New", Courier, monospace; +} +UL.NavList { + margin-left: 1.5em; + padding-left: 0px; + list-style-type: none; +} + +body, html { border: 0px } + + +/* following font face declarations need to be removed for DBCS */ + +body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-family: Arial, Helvetica, sans-serif; color: #000000} +pre, code { font-family: "Courier New", Courier, monospace;} + +/* end font face declarations */ + +@media print { + html { font-size: 12pt } +} + +body { font-size: 83%; background: #FFFFFF; margin-bottom: 1em } +h1 { font-size: 180%; margin-top: 5px; margin-bottom: 1px } +h2 { font-size: 140%; margin-top: 25px; margin-bottom: 3px } +h3 { font-size: 110%; margin-top: 20px; margin-bottom: 3px } +h4 { font-size: 100%; margin-top: 20px; margin-bottom: 3px; font-style: italic } +p { margin-top: 10px; margin-bottom: 10px } +pre { font-size: 93%; margin-left: 6; color: #4444CC } +code { font-size: 93%; } +table { font-size: 100% } /* needed for quirks mode */ +a:link { color: #0000FF } +a:hover { color: #000080 } +a:visited { text-decoration: underline } +ul { margin-top: 10px; margin-bottom: 10px; } +li { margin-top: 5px; margin-bottom: 5px; } +li p { margin-top: 5px; margin-bottom: 5px; } +ol { margin-top: 10px; margin-bottom: 10px; } +dl { margin-top: 10px; margin-bottom: 10px; } +dt { margin-top: 5px; margin-bottom: 5px; font-weight: bold; } +dd { margin-top: 5px; margin-bottom: 5px; } +strong { font-weight: bold} +em { font-style: italic} +var { font-style: italic} +div.revision { border-left-style: solid; border-left-width: thin; + border-left-color: #7B68EE; padding-left:5 } +th { font-weight: bold } From 85226270819e1785f601e4efcd50759d989cad02 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 9 Jan 2022 14:30:48 +0100 Subject: [PATCH 25/28] align adoc format and fix issues --- .../src/asciidoc/Overview.adoc | 2 - .../src/asciidoc/Reference.adoc | 4 +- .../src/asciidoc/SCViewerHelp.adoc | 23 +++-- .../src/asciidoc/fonts/OFL.txt | 93 ++++++++++++++++++ .../src/asciidoc/fonts/TitilliumWeb-Black.ttf | Bin 0 -> 43664 bytes .../src/asciidoc/fonts/TitilliumWeb-Bold.ttf | Bin 0 -> 53896 bytes .../fonts/TitilliumWeb-BoldItalic.ttf | Bin 0 -> 62924 bytes .../fonts/TitilliumWeb-ExtraLight.ttf | Bin 0 -> 56724 bytes .../fonts/TitilliumWeb-ExtraLightItalic.ttf | Bin 0 -> 60848 bytes .../asciidoc/fonts/TitilliumWeb-Italic.ttf | Bin 0 -> 65284 bytes .../src/asciidoc/fonts/TitilliumWeb-Light.ttf | Bin 0 -> 57600 bytes .../fonts/TitilliumWeb-LightItalic.ttf | Bin 0 -> 64560 bytes .../asciidoc/fonts/TitilliumWeb-Regular.ttf | Bin 0 -> 57392 bytes .../asciidoc/fonts/TitilliumWeb-SemiBold.ttf | Bin 0 -> 56752 bytes .../fonts/TitilliumWeb-SemiBoldItalic.ttf | Bin 0 -> 64816 bytes .../fonts/titilliumtext22l001-webfont.ttf | Bin 0 -> 42400 bytes .../fonts/titilliumtext22l002-webfont.ttf | Bin 0 -> 41200 bytes .../fonts/titilliumtext22l003-webfont.ttf | Bin 0 -> 40948 bytes .../asciidoc/fonts/titilliumtext22l003.ttf | Bin 0 -> 49344 bytes .../fonts/titilliumtext22l004-webfont.ttf | Bin 0 -> 41120 bytes .../fonts/titilliumtext22l005-webfont.ttf | Bin 0 -> 41240 bytes .../fonts/titilliumtext22l006-webfont.ttf | Bin 0 -> 40416 bytes .../src/asciidoc/images/Minres_logo.png | Bin 0 -> 24124 bytes .../src/asciidoc/images/Minres_logo_docs.png | Bin 0 -> 35830 bytes .../src/asciidoc/themes/mnrs-doc-theme.yml | 55 +++++++++++ .../src/docbkx/images/.gitignore | 2 +- 26 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Black.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Bold.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-BoldItalic.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLight.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLightItalic.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Italic.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Light.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-LightItalic.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Regular.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBold.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBoldItalic.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l001-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l002-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l003-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l003.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l004-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l005-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l006-webfont.ttf create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo.png create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo_docs.png create mode 100644 doc/com.minres.scviewer.doc/src/asciidoc/themes/mnrs-doc-theme.yml diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc index 3599325..14dbff3 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Overview.adoc @@ -1,5 +1,3 @@ -// ///////////////////////////////////////////////////////////////////////////////////////////////////// OVERVIEW /////////////////////////////////////////////////////// - [#_introduction] == Introduction diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc index dccba11..d32f393 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/Reference.adoc @@ -1,5 +1,3 @@ -// ///////////////////////////////////////////////////////////////////////////////////////////////////// Reference ////////////////////////////////////////////////////// - [#_reference] == Reference @@ -54,4 +52,4 @@ Legend: | Key PgDown | | ZoomBar | scroll window to the right (fast) | Key Pos1 | | ZoomBar | scroll to begin | Key End | | ZoomBar | scroll to end - +|=== diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc b/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc index 3c3e6e9..279c0d0 100644 --- a/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc +++ b/doc/com.minres.scviewer.doc/src/asciidoc/SCViewerHelp.adoc @@ -1,5 +1,6 @@ [#_start] = SCViewer User Guide +:title-logo-image: image:Minres_logo_docs.png[width=750, align="right"] :doctype: book :source-highlighter: coderay :coderay-linenums-mode: inline @@ -8,21 +9,31 @@ :icons: font //add table-of-contents (toc) and set its depth :toc: -:toclevels: 6 +:toclevels: 3 +:data-uri: +:sectnums: +:toc-title: Contents +:homepage: https://www.minres.com/ +:keywords: +:title-page: +:xrefstyle: short +:table-caption: Table +:figure-caption: Figure +:appendix-caption: Appendix +:section-refsig: Chapter //set directories :imagesdir: ./images :iconsdir: ./icons :stylesdir: ./styles :scriptsdir: ./js -:title-logo-image: image:Minres_logo_square.png[] -//add math support, also do via cmd-line a 'gem install asciimath' -:stem: +:pdf-themesdir: ./themes +:pdf-theme: mnrs-doc +:pdf-fontsdir: ./fonts + // unset toc, otherwise it appears in table cells -> known bug, should be fixed in later versions! :toc!: -// ///////////////////////////////////////////////////////////////////////////////////////////////////// OVERVIEW /////////////////////////////////////////////////////// include::Overview.adoc[] -// ///////////////////////////////////////////////////////////////////////////////////////////////////// Reference ////////////////////////////////////////////////////// include::Reference.adoc[] diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt new file mode 100644 index 0000000..4a44b9b --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Black.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec5b0935996e0b033e3d817c80d3931e72a5925c GIT binary patch literal 43664 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≶{2EmifK7QEBZHVhh95BMh#8 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 literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Bold.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b51a4d638774a8b5636e7cbef7e0a4d4b3ddf582 GIT binary patch literal 53896 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 z zWmev})p+_g&rrSBY8>}C<38`;U7uU;eb!apXzjIHN1xBl*7qoRqo?fib?>t7^Iq(r z&o|O{T5s`IYt8x*@n-97-fdl&`?mM@PPU@Qspcaej<@)7+u|+0oTr<*elItat~pWF z%fq|AqK&Ps{q1D^I=Qub0-dMl{L!A2HY;tGXO|JMNH&kDv6Y^`nfWvrn`WEnXeD?o1gXtLVH>t|0G#ovd>a|UaHufF<8rA3)-;Sx$DQ;S8>;3 zJl=#)ort$RGgyAxIh{Dd@2U7X4b8AHrR{UFbC1-z7UFu-alM5Zw7(OoGV>BR4KLm@ zDQ1z?Y<&!ApD~6wb57cyxK`8|bsV_G*)0T*<}01mwv=9;U_Rwk+L`@rpB*a#{r_zX z%>QNf5n7vV?QbWNU}))NTePsf&C_EGy0`*-Zi);#jx&73xMg54dfpEJnJ zn%^W8_e|ps%VK@Csvk^)g}4(o6qYroX+ypqWIMEdEEqd0?7a1f_y1e1?xa&_Y4(XV z_F9%RRoPQ%Y3FB#)@GmRL40y)4_bS3jvmwe%+cpLt{wmDBtw^@oj6IqGt5B8V+uZX zBHEH+5jr08)8BD?@dO<2cN_j2h&tQoJa!oVcOn=V?_mcH*Q3dB1X)eh$B_1$#}Mlh zX8nz8MV(Q{fm@v2LX;04X0?Skoy)3b($4H}c6R9MaWwk>Z_A=&M9ZaC#hQFQiNjnj zjSZjro!fYPkmF!WueOdz<)f7=MA#!L|f*< z9qI4zq@mNn(VP{t{w&vJwW!~9_22LMeUUTHJz}f{UDn39&abS7R=XEkd9!0>2_Kw_2tB0-fG{Ya~{ybKz8mrN&``+q}HK+d2wK~?F(yGIvpIY@NK2xk+ J6)Ps@{uh*&W)T1Y literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-BoldItalic.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0fe23bed28a03d76afc7e111a0f2b5635fef336 GIT binary patch literal 62924 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

p;>%*WBkH(Vr%x3@LFtA8K_ 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 E2f#0LCjbBd literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLight.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLight.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a590b734a120bb846618b19c853115293e56f0d7 GIT binary patch literal 56724 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 J^B;o+{~zQwy_^65 literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLightItalic.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-ExtraLightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8fe025617bf547d937b61156535e1f284a42d8e4 GIT binary patch literal 60848 zcmcG130z#&_5Zu?!OXzGunaKl%m%{})&Yin3n3vuAV45{0tpEufg}X7ncbLZG-@

CSS~YG}TeViLwl%!@f6sk0Fu;)5{yzWc&-c2qEmSAly)mZzHBQHMZRQH`TB3dA=Y_e|Boitg567Bc}?& zS4Kf#mo~O!=JX7lS0)GtO7Q;TCA}SMlJBwqh|kyI_nVe?tXqTcgHfJ-*DPPPX_$MiBN`ySqA;`aJg1lY+2sBfiV;#uu6n>28#d#Aj=F@4&{tTaV`9_j?6F)xB!< zl8*ZBw4;Ksw?Yu4{N9d@YuG133qBk1zOk>Pw`=v#zIB3dSX@D9Hmb_d=@ z8GflPYCHWP7H`b3W;}*#qh@0Pt}JWTW4QRI>k1w#c!K^JKQ=12k3UA2g{965#raZ% zU=)&tEWmC+tq}=Kon({ZS$LSrVz!}Gn&NKQyzuPQ6+n_9m8Kzc=Q!t5nqXP0*B<}DYGu}$as_(^g8zVhc0 z`6WGD*qVM_f}bzT4bLy^>Xu70Q$poGtYA&4Ha!cSEeO8Cjle**_=KPZO~nc+0>+Nz zTFg4YX3r^O5;HJ;PI#DF$IP~*Tt`0h{9qV<6F)4?VNYsg zQf%(>s3l$d=FIL`7rAJ~&i0#n+L$!ex@2yf_+0nVhDU3s&S~8nxns}NrWNO<=BCc? z8*1J8S>l@cgW@HN&d*KiycCUcy3%sG67-;vKPkjSzjQfwv!&u!G z^Aj_Z3F%HJ`-#tB!C+&C876j{i3N)H>M$QyV2l@HK58+_LTG+YM0gko4|udDnSqV) zu!tO>H1AL6o$Q=)@R3d%yRB(|pRuy(!d_F2SlY30-um~C%)9-zeKQtJJ9u^7^tS5D zZW0(VOwm`oN>BkThh4Jh)lB%zc(wJCSHPn>ooE_HA`C9A%?CBRVT#kuh}~NQ&ar+4eP14 zCiJ8MJt0)^S}>fT(M;w*7xHqG(f|p6P+DRqZ*DD{d#Eq9BPPbL`<|VXr=0J%t88<5 zL1$~Mv{XEH{*=Yx=HG7&_R|=R-K_V#$+D&Eao&UzHI*7Tiz-ciPh;Gn8e>Oe3 zFXgixx7{?@)E?*GJ9Fv&X_FHd#l@MHu|AD_UrRSTa^c|3;c8>df$p5VSY4nGYcR<_ z=3qQG0Sg1bLNvIaz>>gL)G9R}R%OCE%0zok0+Y;W2&1bsE3Rzb-c}ry9MSc3`~J;s zbM3J+HcqXY8u4>#cS3@8U+;#=;;N9uLR&?1R#VM}E7q;tysoUHROc)IH7X#`)bRMW z`BjzZ*)3?hA3ei5p?8?n%*Gs_Y1jp!@-ibkq!IhgbwhXS#5yx^=_?GEs;CM|9+aLtDUKm>Cco>}6tZ5_|ZCj<(87wY6w{<15SBa+Bjq z*UD$+UOdO4Hy2m;Hm+thTY7tXlV(h76pvj{ye2fPEJL3*Ek9-Zyj2Nd`7M)66Nm23 zjY)}4UzQmfzO-GGmekZGsLeB0Znw-O|$ql_G{pXhi(6Xc<9xj} zf?6E}QRxzb#6b2LpNoMkJTWg(43syqz4B~!l0EUv zGb!&{vGj|=HsLBUi7j@un`a95#kGx{nQ8nfu5d$f3CW^Gja zrjW!?@j1up+R|+WwutbWLo>^pFykVJN}6fH3Gy!a8 zKe9yp-K50H8_VxlS84IDC@+k)g@mUwN0@v^eL{%8DWU4Jmd?4xX-|BrB=xQjqwVGB4JG1L8Hq0f-BpKPdIZ4(4`H%gq z^8;oG7atp{e&-$Wh`fN^h*4`pxm73^0KCU@{D6}JL#i|u!z?7>fC)p`sDJpjne&-A8Y9@79T6RYPCLU(YhVtWAYLC zKXu@x3iNd8!zZuqV1CC=G!N~WN0d&rtVJz^H_k(ekDAnNC)g&9e8*%Kr;$II%4TWA z$4v73Ci!KPtITrVvPT(|SgnyCsAUNn`J-BT{b`f@tgH9eqW6$pdG8fwss@n}pCxu$ z&PYg+RIKc|{Mg0~HI1`l{FluwT~-sBc|&<^RM~FL$@*n}4_~*pW>uwL6(3R2UA6Vn ztAkZcYmy(KC4u+i38fb%y$NflT{7Wf|7wtTHCRtr8`w77*bMnT4A8Gx!w?h^UW&z{ z6r=(>-flZ#Jwfz=U)0V=SiMpolfYdaSkU#X{vusiN=croF2}GJFWysHlo4pkUn)*> zL2w~T1Yj&cFa!bUkm=c}Jp=WCps|mc)8yY@%4+3@0K?s^Sw1G;;)dd3l=KyZ6h?rv zd*xeBSP!#&w9(~yLu$qwSUCZwo{?~10eM;ga_uy>qxOXLNT9qcqh5CyMK+6jhN{IQ z{NCk)>;a`ORGNCK6rFh}^04(p5ge&20stC zazUpIj3oT}#@kD0wzVEDZdoWwZO7hRJnOpGx|hvJFa2rzoR+jwdGlRA?q2ZsZ?9Oo z0wl&qs2@=H38Cl`M-T}dHkX(ou}#kwTTgs>VCR~p%kxX0YiEK}5Fb0R{Z8}Y)dddu zLaJl4bCAOoOmo#20vCrP42w0%)=8rPWew{%Kxu`Wvdo#O?~MTKrvSC*yc;X7)LyPz z?E$e1&OwfA5?U~&uuiGO)zp}jP&9dtb@m&RL09di)sHs)W+D1F<BdERKYL3~+fDOJLV`^p>8eI)C-7 znepoNxA)}S(6D!1Ra2B|nRwHJd08o0MHQ>h5A-pGtX-6omR?k`Vs)@@JfT#$2`C~A zyCew$_$Cc|Ui124>tXST$wWg;?`;4qH{d;R4F}0Gq@L1B4aS5g)sbU!JHrO71Ci@G zU-Iv__WSSZnKhgJDEoCU+n1EgzLxc=RLkRN?HZ*ukU2P{-YyPU<&&!n)-WR6YEHaN zxC4UAQI1amwPQ-~X<^Yb%QMy}3rkJ%Gclu8{=*!9`7iT09Ud53&1tcB=t{H`hITGS zdGMzgMia^+F$LO5|tRLbecP??c&jD64^% z&VUX8$;5T?8#UIcYpu(f4u#grZ?If;p?o##piNO48}Xdvy3M(7BiGfnJ6hNOK{E_^7LbO<*Xz{82Vp%z>;(8iJOA z#pp%y{aHF-=Xu-lUxij0joc>#kV&Wtgp8( zNT}E9K#RUUy0o<7Z)&%9Wu#{1F9;6^@Y_E7-t9rY@}n7ZV#IEPuRg;X$KDRwbbLl; z<}yP_Fxsnk{>1(%z6&~}SwTvaS|`$+0G*I1B5^G$HwnT>5M!IC+0A;#ocyBpxLYi> zs%*Xe&9>!pBQg?;&FwKUY^b)jabfQ4;viq~HTijUN`OgD32H6gw8xPj8$&o*g4W(a z@4(R*UwbWPuBp-L6OO4!%Q9P;l^*O@m{ym!q_85fC~R`Up@A|sq>&Q*?H$hn3BE@C zzIS^HK_nbo6&!jD%?P$gaT`Gv%`PD8_5Q-a>E$J14$E!kXrI8;)Y9*2c6DX6M;1k9 zM+f+An|trJ0H3dilKOo^QjIZ$rWuMDPMcmA+16H3Zz}Jp+O_ZU@}Tzf`WIbM+FBf;HpSQO-nF)7`K+lW^Ybo! zhH#STjAk#3pP*(JP6*RPzG|#5uq>4^wl&Tgph<1EhwBdeUENz8cSD7yTo*ZA{6r-t zs3*4+8s$lU5g#=cFPRCNigbpE>44M<8&V0?X>h15B$QZeSm#|lkJJFD%H@oVAfk#0 ziZ~#%(HaZk1;ZU4#%ic0UdzcSH{2dwy{?{b{bGnsifN;=yU(zOvH^Eb_30Nhwg^ci(6k&!Hf9@8s9)KS_7 z%YcQQzd1a}Xz<0xF_8nk3+gNmBEcB(y zSa>v2w!Bq7;~EQhg%}H(@js(RKUzb$b%QI(dM(?3MRp$IP?#Tfb(s$t76~bwQL(KX9qa3=3f;3j zC8fBxHFZ&3{N$Q-txBz>B zs4yfK1GaG1%O?tP6SlvzZ9_$TM`3Au+)d`A)#rC*rezrl4B0W-wVQYD+EQE} z-X65^`fXW2u_XxI=ahMn$$~$p0(CwVJ3wALXbxH0p{ZDEn#+EuFE?0%^FrkF=>2?P z??b=?sT~%Pk?HF;4GoJd?5#OFn^X6fZJJj&#h{+Mt26VGq7|)v?3mMoCB(*(}_Rd0E%VTMOWIufJ$~i*|(J0p&jqHA^eX;Wb_Nw?b z_%_CZG%_^|Nu>GONYMvZrW>Sx*Z&c(<@Ea3RODEbHC6Ti$=BaMYJRJ#u|7!B`RMW- z6{kb*v9wsFyt(%TnJxa7(1H?OTxmkXG#{(alxe}uA(h3U2DJK^Gg|mi;Y)@Pd&py! zzeuOfR1iE`=PtHM{42r3;jlR38Nn4{AP7hx$Bkf8{!e25X9tK~HXfq*lJO9oFT5$H zuyP>;lw{`I&qm8a4kn#J#U6>j(rOP0)t2SBAKt8u4h%Hr)87OK=CILOAe;u~6)O~Y zC6+(OeJ-yLGsy<_CAodj!xPRs#Sn1@(Sd`kVq}yykV=fsVWQJ?KvDCFz?i;<1XIFF z|2fv`1z~}?C42k|3gXT2JC7%2FJCF1zsuj^zo@0GJVRqvZ{JEaqk6GbycOODZpjpB znsbTN5e`w7%aw#S^ecgh4bx{>V?zA=gLUs|-mAZD=1loz&Eke>nrXVg2z}x_M_!n? zP2(SHh>5Q#GRb!aCxn_1p|dWk7N;tlHK zDl~l^Eai~puws%_54}Qd;T;9qh=~^5_8D!n8FsD9(u^s8H&C<1$z9H(<7hxA(n7^h~+5@{$V-2@b^$bMR*1Fh+*QD zLb^}{K!`1JgBozm#T+aRE~|8g=oWDlOAiE{cxF%p9TnTsFf+aK{KU}Eknps&f}*K0 z+GY0Iwn>+lri6uu^>s{YF!*3LK;!SyM}QL&4ukdOl1~{hhpW|lWRli1_+eM)1W$e#k*Ht`ELLA zQ#*E?T3nWyQErR!XDP<)SYvuEOJkEiICA8J!))cVd-pzjp}e)>>KVSGQC+a3NMnRD zCJM*dE_Ma*7)KU&J@?sR5{M-JsTGF?Fp3FbQ`yKq1S(dm-cHc@Nq%W5%T!WeOpnjh zvIwD?%5qOSDRAgDz69j??4?gOkWv2(D30a*Zm}*KMw=+niFcps;WOY%6%4{@}ub!UcuEPmhozS{V7;P*U&VaZ{VZ zO+DP}_A+}^u3@?6ef!LpUw#_?39Ov#19qvDFxEHaVnML`v+m4Gczj5-EhosgU}1t!khoK43=CVKk&J#tf&QTCXj5RQ zS~O}C%t6rT7_*3-><48%f-+)Y$-ci;iJei4;sH;dGg>SFXNPS*5v~ldcH-D}V%8pF z#&0@rj;XXP4{(_CS+M^oQKMA;3wt8_Z-1GRGt)!ZK+RWy9BJ+mo-xZz(7vF2;mTlF z?VQi@)bo#-k6m`Xc~)&L`>5$+>rl6N%}_U6!0HH3dzemmf_1pZeotspDASSulGQj1 z0k1E~zP`{BfkAlhNq1N9r)D=biXk)VH7Uk)t(a&JHwNY9`uW%SB=}5Ht7B#pdlTNk zc&7l+`+aZg5e72Bft$w*)B=0j2RStPVpJA z%2}GYHErt9$t)!!P!&BjGf*vFF(Wo{cS}rMZTa6b3!?HO(jBo8d8l(fX6HZMvoo=r zMnmnZ+*p<}E#=k9y?gZRM6`+1DHd^<{Rtu$+!9>4lEcCWO_49vPbyt0Ajj@X-4&Y4 zlP~R#utp?m5_RtG4NW75?@)80@x%Aq+s&X7rT!(Z`eC>5s9(<=H466{A$iYcq|AiO zpfS|%!lcraJi{_}E=a5<%t_50C2 ztYDQfQhb(tSQ6QX#8BxfJaK+R+}h8>$HNvL4>|$s*Jw|VbX7;h{4;QncsP7qb#+Tu z57!0S8dcX3%`1LG509-YK5B8C_qrOT8!5%@Hvcu&az`i zN5`4>M}epGbWpki+`zzf1eKZdI2(8z;m@;baj-nQOB?D4WmS1gwffB9p?k)*(OX!N z8W>wxo)may^QeZfP7zM)q@BP6tq!mSyX6DVHrPsCe8@Gyalu2Mjjg-93jfYLHL6+# zew$Q}`V5NnPSe3a{24|Hxa2G>$zXwNhOAW(o(y&<7i^7hWNUJ$)<OHjd2#b&AG2j2gD+1qc!V{i>q%E z`qqXHuH`cT>jbyldid(tUZVfgV?B1m6Tt1b8?J|_pX#Ai&auEt?fbOXro#inz7 zkt`2>Awf029cY>iAKx%y$P1{v`!weW^e)GVUHT_bAs?id-Mz=l%DX3czd>@~{WRaH z>Z_IRuHXgS9YhJ z;PMi$9m`{$Ix*rklva-L7dT)%T!`p5_aX8T2;osX7z1&XgU-W~$WCHp{x#yE8*wKp zL-m!1i*CfJ=x*a`?x%#+Y(h_^ghBP{t^5e1?A2q*Y+(4qy||IL087|}Ex4wD*GA+& zD8%8tp-Dt7u9j}+W5RW!v7>^Z9;oeJys+Z!V~6P9UJ>arRv&vsC)NaI%yt19HCAw} z5biZ$!q(ZrATyLnSaBU*TO|#%awySjgG|^bJ80a{*|Cf&x$6b5G>G_eS!+ z>}mHCK9ela=)6LFQ8Iw<#0ZJ7o^U5Hw>9t}JX8R4CG0~K+UUZWO}Z^})^(5PG{w)# zY&-Uw?AbBwr?kuAwl+p4Ukev@!m~-4-+X(8Wl*;zw{y>ryJL3-iys@wgWZ}E9!>u2 z`V{#?%zo}U|1VYUus$yZ!4LRy?c7Z7W3BV z1>z^&CDXHGlcP&AvOCskC8MsR*_vErD@-w_wj?JuE*|e=xhMdB#_F(|~#qEPu&(;1^DAwm{pWR7{_i+E;g`^S7 z$H2Abp2I!Oe6EOSPpasfeGWIZ*s^zTSJ%)@=kiu7?MdJpWg7yJQuQ} z-Lv$|bD@iy42QOz3thv|{K)Z@&h^%FKq29G2-6f3L{=5oj5-(A{Hv-{D=TJ-;n`tv zVcBWtMA^P7M`=xFd?VRnF#9&+3?vlSDx|-TySe$n55DbWOT==R@7ybu*%IB z>HOpegSw~H#j00T&zB#rXuMMG3vEHv>{wbB;4AJ3?yc*J$}UCq}wEVljtQ|0=3EMdeZse_bRfw8T9R%kZowa;KrskPkPsvb#05^)zx=G0__u8e*r!hnu4ktK&*$-G6ycP6;atjZu0l#$kPk zBF-y-89)@U!SzwEcC)oojTq4>(B0Zuw#uef)DQ(<(!2WDZD%4ZF z#M;2P#Ly^r+{2>u!yXF(@W>+{Fq#zkz~h~Gupv<55&J-MkBy3dI7mZ1HU>g`)FlU? zPEn1~JZqgGh0%51Ped`U&N|oHPIZc$LV~#_s;uqAxG=FsgUcj^YBD_|HWcz{8ymKv zU_cDVXb`mIL-1PV_^}v;4^}>Y1jcn`ktgPTT$q2-mKkbovB326q)4}LG1Y#E_TE{|9c*@#$z%#KY{*1yhP7g<@m^qSP0@(EQb%`y|D>Y4@HB&e>)P3!Z0M?N`$fC8>~rZc`GbVyf2B+*P74Vz z=+*Ld0lh@E3Zx2F5Q*WQEWX?;gyj(6%9?NiMdwfyjADuIl$PU3@fjcz zW|U>S!IuTAhn^d2)^3Q7KJ)8QMs3tUl64|HtiMzTgGPKVxpfP?wC5C7Uxyc0=}DJ# z4SWoo+L_{W#CA;{F*T}F7fGhpD*t$0OTkh}eqe0ht_iZ4vTOyVEy1B@y1n%=7c-Xn zXovK8E@_=MZ^6N52d&bM+jI4|);Az*aj7=exV11U*ymh57h{4GLu2wMZA*;Ign^kN zYl`^(9*zMM?Q0v38OwKYzk*$_WhO}s^|4eL3w*56Wm6Ni*!7c0NLUG9LU=-RY^2(# z$v3qpy#5Y)KUKVjZvsN?i%>g7K3jzx+E)O!hyWHu@e+cEgP_@PtD_^KS$)~`B&PM} zA<)qt3Y287CP+4UL`6TJZ=RFDrls?6Xb&YSt~HKe6AyX>NCPg~H?#?MkZ5JU!-W0@ zZnU0Y_fRSfCSG?CN!-MVR%jLW0cVKhcG`(zqbaDzYkahYFY%)k0g93C;%mIphmG)& zMUysgmfcU1%ZV^SHzE|fl=q$}HdH0z^Y6ST6ty@}Pi(H1yajv5U7>3?SM+&_`EDaa zfon`QN*(7O6EJ~^c62Qah}C-UNfu&!m43V<-g1r+A!oMN5oy%L1$ybhYF;X%)j{9 zpZ`2me73-UQTYGq0iqRcIeHaC(V`=~o`=pU;kOg-Vu-szb3>>lw9v2MvWa&yY_T>p zSck6mzN10$W-b6u$qPv_s-9lRDYP=n(l|HYWGu~(kGKs{8ny;82J7-KvNd2nPG|$5 z)!3U2pce};s91sbTCBh%&5mAwM}fY>bN&5cTo11GSb(vA((SGs?ulYGf$b*$Y`VUF z%+fnyua5f$>POaGZ~c47bD4Gb^LqEVfW3H*%QN6w^7?U|>MANab7Z75ipAs`aIgRK zsJsF`<_+p*Ff!P>+OTTV&Q*+wuZJ{X@_-pjHk+Y{1LcYGD`R1gwN&lrGC{&j<8TiW znla)X&KZ2qjfHFqeAR-N)MLX91><8I4)-%rw63IVz+shTGYk7hcHeMYOn|w9K-k82 z;@p>?Q?DJ~h_ix>F+Oq4F$4vBg|_9mM}eYB$hYp|TppbgI~A7Y#S?xbF|9KThWp~8 zEGuR@jRx#jXQwQMK~G3f-zxms+n5xBJp*=HU9Oc*0Cv*4M{M=33<~NbFPnaQ6$NVU zS@!-)F|_)g`SXNZfPIv`N9d=r_lSZB|M%TTE+gN6w+X4jEjs)Udy&{q59#7s>00o` zO!R;U7ede{a~33RvXGw*k$2l#E40R-IVs!qEibjGwjeb$DB#SBb7J*% z7gp>4Z&)3}xBffy9vQ{V{-+&Z%<0MQhN+c2nQ#M;_I)l4|6OMaeB*40od#xj&pGjV ziwmC>|2KS+g!y0Xllv7H4F4DUJgmr$GG;g5$q#&;V=q4?b~)>Q{=Mee(G%|JuQ-K7 zTgsf4$TFNPRI2{p=QX=AW~N#EZ*~?+0jC=O2Yk7>_!E#ywZz4-CXqRqauR4= zTyaclf=3no#xp~K#6tv0{+NzGh0+C(Kw%}CXs0670g6WQx?wTWRlC=Hi)q}kFA9s% zij4J?V)w}E0`fB90?Gk9!5@yaJ=@fC&1N&(g+Fur+c%gSsJFYqIbqfG7gL7H`YR)|vg-cbhWlzUcqR6j|h>_Ki10%buM$bB)Df=h2;V-6adSX9( zBU7k`lh{LxTIR;FzsUjd&D>-nRnvZ2j*}{hBv;^>b8_^EMMGl!h%n%iQE7bnPDs}- zE#7bHr^}N>SwDW~p0gu)Kimcb&-5S5loLBDW#XZ?!Qs@!d-P! zzkp@rK@pwb;(cW&Ge()P5`%OS6?l6wYUeM~zGemHP z6)uUym5G>`B#VC6pfmZ>!? zaN$hr^ar)COu>#9`y?^8n9Y};?2q3mzk#B{O#G=wTkvq&_3%x)3a_kf4eD*PG|diN z-N;IFW2#xde5)gFihR4PM-OnElEzG?IFBez#$(pM@r=wI4q6>a>w;P^=S2Z6M?n{u z*hh)LCc}hY$<<`-o6rxrhm3x}Kd6o}&T#$SmlhCDXrnM->pXyUkMM8;8iEuft?UMe zMQ4I_130&3xU;!k_a!?A^evlD$yv z;!xP4rR@4AHlhBib9H`XX;^)Ss;x4-AR=}4?5OCura^NUd){HMur8JV-PUHeWHz>c zv$(}NDI!AN&VFbhi<}Ziy5O8~xn%nB9y0qTEs@>>X6wl&!+qSM3ajN={m~$h(f(*M z^o;kfuHk+b1!}VL#PSSwqgU36gO~5}SZ}}e8U^cV_xYXISXiY$aW0=d^mOljF~OZgKI^Q7g9+?fZ?i7r1ms`+~3d;+inpSG4%Nppkc}e(NJI^V-qK$TmZp zp*`}HuJFzqybBdxA zv*DBG84YYaTb9y%zA-$Eg2y1QS$VEKBz?uEXdP36#?;~malWf+HU-8lJUl(zxVCq% zUn!z`{N(#W?AwRFE$l5z4v9|m4SisNT|6GtcR0(8IIxuk_QEZ5_O9Ky@uEp3X0dus z?xaZ(W>fB=$@(b^|G2CqtK+wB3;7^ck3irAC_;?Pa7rtCj@q5niu~o`;FRI4Rv%oS z}Zv_KVRFl6K>f10$0p zkC8kWwOA_@|H2?&E5c~qbXnx|-jOKIR~C*+Z+KJ|5c!Jnm?XL-EWW_82(Py%7L}#L z1I(vg3&sef+&zLic%Ctgv=J5t;T)O9_&Psfwy~`==4Z(`wwZ<=EmEG4Zvk}zx1pRh zQwVQxqHH0*A>x=gW5_y1vQYYWBl>4MXaC${`-EM5&?Up4rI*`Xx-s?g6W&X*Yo4{2 z?q(8$|RmJS9JVNl0TIy7gno=GW#mEpqL-R!8RbdA6pIkWK!eF6a`^Y78VW5Pm9K}V z@bMWnnll2Yc;xS~QbHfv;dm36Nk8YZ;Lt7}OY$N5q8BS%9*;}h`3zm0bjY36P{~=POVw-`i9-Mt*J(Yb}Vl6Poaf+1iAiB*svTG^w|K_Zn#*^+k)hp6T* z?HzU2x;y;ts3C;PzqiVdu&Gv-MR;8e-f=zf3ftXCrlWF7_CMlorFBTHI^lvUsz6g< z9?p7XKH+ym)NtmbUgH5ueRROsTLG*odvRzdA6c-++P%E&$Pq6ZYX^%Mw=>7XC?=2J zo`Y5?I?ezKSqRUUJuZxLqWHBJ$63spyhgHln9zoPo+zG8>G^`Q?3%(zjoaSzH0c#y zHa8uE2H=kRBY!faq=}*mNvH6dPiiZ43-3{dirr3unDh%umN7=Vpe+S1+Zhk*BJ;yR z55?lWF{31T=oCW%ma)S`E3-QWGlG0^6ZK}SM&Y$*(?^*Bz4vjnUC_Nt>=wwJQOK4f zxXxv8Z3efw_J3183e3~7Jy)?mrG)zXD7(TVMA`+ORjL!^zA;Gf7ylWFSU|opeD;de z5yEYj7@9}8K+71}D#z_MnIOcIb&uX)Cym`&GW5Dv;#F|- zlC%m?sYwSPR(HH%LLOGR_KxfQkW1Yf${62erN`@`Yf&o{UFuS*CYqhkxV5Vsuf1z_ zX;?!KdF>SV+y?mLDX%QzygYUs4!g)L=3EC4%;!PC?wJ`rx5-kfcYkbwrDN{Uh&-PF>AhJw==Xs~=(eZ)ar)!PUYF(mNdUhG9$!1M+=?;+4QNB9C zCjk30*>QcjHFh|iEpxeWxM|Q$&#!fGMlOzg?q%5lN~O zS9)4MeZkwAD>pA&08K?cJT^lwH!^?dnWa}$GUEZ;JnJSRDi}|VXQI%?>qe!=li%6G zbyZi6yh~lNj0zkh@i9RppbW!t1m1=p#(@FX!^_^FxMeI96wWsmiu=f6`-2OLYq$?q zf#K-r=nxMu#2GGG>DV|>j*|IOmc2nk5qdO6E-97jSLlGIK~K?ffdw&8T7IrK}`s{2FY8Y{c~>SA;AV*~HkT1MW4;2)hw0i!05@Rw4vn9uFQV?FMDjNgUZiDKG~b8i@;> zU~jJ1HHX!!eyf(B^avdGmQOi*cm)cN#Xd(#9lywO=8#7Sv9~14Z2j0J3G9aOC>_9T zqO33Q^m@yb!h?O!k}V|{Q*M05l=I0X;G^uO#4J;GQ%)lutpu+8@B1lvfb;)tPo*!$ z_kY`0$y#aDeQ;LJ72-?4o054T1*_aI$~{1^-+qq#14h4B{C`Of0`|N3#Sk6|$Crsw zz_GHk2RZa8+6nmPY(XERD>YGON&?Z2r=R68!i?USbj#;(H2I+tL)RTyby1!h+%>#l3z$2<4oox5G{D12OuP`I~Z9c03P z#1{4+_!vks7%TY4jFR!iQQ|xkz7SV2Jz_e+h{=om1=b~T6|G0CRGh@V78SW#@Ge!e z9mC9vZ_*aWNy?;SBNjlXSdf)S0E1hI`wjM2m@HgezmG$(5AZ46z)vPj0MG`6H!v`oN1sN!iVw7$Z=+LTr7jKKRdR)L|Py}(A^=ZRn=Sr_$%5yyyBeO zuB;=$OE+^Pv?6sa^N9goXdfNvk)Tq~O=mn?12%%WB9Pc4pfDV6H9Fm0rH3iQhf<6D zj7YPQ#C&g!1jf_qMsfYwz!lk-GKGA!Ic{#BbvL|Ab7CKl$Hd-=w#Rq4*y+0?C>Yv2 zey=>^k;s6NcD9rPMrDUFSvY>#9%I)aj&W@+9}nqwF1>2pmg8qeAXElvSnDG`5}=Hb z@35BD4h}+xgVeYVJ>i*%MyJei?+zut5eSOM2rGPpG`{~}JZE`qw4~EQh+FV|mTrCX z0LF?ui{r*=MBDr4IA+}80aV#Yr^af3iY7`to@^!KS{T_EibF`prcjX|^MKsLuDHwH z0r2(R!WnTRqg)S^&)2k@g27lko!f?Ad{%kd8d;RXnGG*N5f7f=?Hug%A`0|TM;?SpJG)l}wi6oRjq@V#dYXh2h zmqS_gYngXx?wShYw^DxUoql&_&Un!(vMi+*n8QVmfk%Ws_G@-IVZecm?~nYakD28U zNGE~sQ(VAL;Z#m=b1_*v?zK3X?{~Of#MQ$8p>M}fXcA7+A)ch12U{h~AnKs3CQ6oD zIulmnCO(*;XpgFE<1*i_n(uigtV7w+JpKn}tB%lSPl?t%$hs2bBeCXXI3jlXBE26g z8FN-F-g$fcSK`sRDG`np@!@tH-}!)Ms9tnj&=83OWGx|i@_+afKT6hpd~EmluYi5Z zRc+(ha9x?I9c)Z)YN9U6nQKzsDi^Vus^^bNkSj1}xASi-M?6W`N9qT|2FeB-?mE%* z1oACkiyX5`MnLY>bLH_xhRYFLA-7dci#9sTnAMEG2@4%IdrV$ZZk&`b$C$Rv7B$C| zzAQ0vVM*EA*y7T)fa)-$^{vR3OFo^^$!J;pm^`x|45yLh<^ITSKsk81^hhO72}C_J zKyyKl$os3b`cu}hOvbpbh+DSDrDOT2%A{cg=A;{J%ppyaTXev&0%T97s=SS8+W z!3?<_Jw1V*MsN=~e0DhK(^bDKPy`3_aS~Ee)`zRuHAxNjp!8OKfNyM1V?abhNsLYV zhn%V~A7B4`eVU*6qdKcV9}{8=?Q1h<%$=?lKP|2gjnU{-T3;*r@*sPQU5CD4Mw09- zA=CIDG*1WJYr9t^{$MVZhqV8JNGSp}8JLQjcQksa`>6e+BCu5Um|x{q%1$~2X(r7lPeinE$bYH>$RfEXBKH3ddQh`U0} z{<`KOtsyHk*c=d?pKOiMM(3_C)<%SBG%@jhAP`lSe^{uWCLq)pM5hg23+S!_-uNy^ zeU5_;^i%?CTVWv@ zG@XY1v^*p(BqcP*G24_mZ>m~KP`_AK6BrW^7VK+An|bh@O=6V_RqD?|m4EU^l&sP# zQDQ_EIiuGUx-YwAOeh)Oj5X6y7JhEcFVeKG#@qTNZlv`S@hc z*Nn^F%mjbul`I(bzz5^_Wm%hFJV%1&^0OpkCQgt5$VK!Ha}L~^%!Xt)W5?PK~eknrD^40RI z;*`3ostDHX_jr)eSY2jZy-(*8AH1={SXE&RPH3vv`4}Nuh{6Y~PJBn~#ke8L6{im1 zqy$TdK7Z11A3TlPsejv(b-y z^aD02hn*i(MCUEgK`1z`0bzG^psnlpw*(e$nSE7Ya#h=pZ6)#XhaS(UQ-_D9w9ZP- zD2Y#aJSwXBk-VdqU3N6@u99MN-0au78*9TSO|n0betUTtkAJ!pZIvKDB%SvT9UvkY z3l(=QBKcGXQgonI8#bT=ceGK1Enc%~+1j`J7TOlY#)z|*7@Hy^ef*7cKUjHu-h%sE z#82*&H$VE}qJa>N-_2Li;WDbwczLI#^Y+dgfuD9DDOfxR3$!01#PXn-8W8zwYJaf) zLH2sot!#O;xOr$#wAep%FR*Ztvq#)2enWDeZ-@y9#8DN%sOTsEU~OVQG+iw%IdfE6 zVm6;Sinq_h+od=I2wa1t;BcHAjlZTmKXx8_T3*6p!d^@`ZnTU9;1LE!Y67XU?ag-7r6?xu*Ycwn{QU1K-C_8Q* z`h&FU%z!uvWtRw>V4->qa;8PdKuv_moCt$*$|rn>HXY934z}l%`5>=Wk}XM}6HLRX z#u+Sc4-~E{j*KkoEgY~HMn>fpAW>I%K%hEM)M~Af(SL1dut)17@U-cUnRCl4D$3{1 zyraCl4gksDYJK#YcvZA2=NqF;>zNHJXr;il@@c&kKR$7;X(1 zS6Oe-lx8u@XiupqZxK`4GL|&?ntUso#oWP8mC?6(DaLH8um+gf3hl*$Dm_jWQnEs- z$9==@k3Z->XXs$4DL+(Oo-^(n7V0{B$cB@LPIx>6>aC#2L`G+p5zZkAg6jEYb6D_s z>!;Pm^6T#|{_11o=6zq!*+D=-pm+cs6l-hz)*5Oi#{FG~7&<{=y-J_I1sl1D9*IQ58mZOL$>_xG1 zPR*cD?Bvj6AqF|??R!Db57xhPbIeUQ#jtudO@3IuANM5rUHL7@u{b-A@86+0phUrA zZ_UW28dBes-86XjOZg{Zp7SB1O9_jh0r8_0CyLgmLbkX@{0-K32wxMORB(9INd?){ zl#>elMxRtbr)?`I6(FNAix#)B5^9fT(LSzAme5SVFFySqzi?fW|FWM=5}sq*c^SaC zpU&`@#7`^7d}oGXoe$`t^Q69XpC|RD$9Yn#oF~{y$)9|9p%4lam<31n&|z^f%RGs5 zaZJJKrmFl1i@Ay2_)^`)(<2+ddAZ?uvpM%T(YfAvl7&jayfmc9OlIfdw>W^jY;5VE z@uiELH?dz!eze+>_DW};GL`G-QpwMK_Nm@^GrI&3;w{o#NrOG*dTE}?b-w9x=Z)-- zm~X_lf5|yyZ=Lt-bP||RHfKEL-=V@c1XK$9>HNIVMr;Q2hF!o9T zANVKYV)#!GDsYYd7X}~WY@91J#41<=TgCRVlk73}BINOp*x$uyF&*c9?GsOmZ%g4) znzUJZSb9Y|E&br5_KEVD;`6Z2o4#t_9N$^Kt9|$QKJ5F3?`hwEt0ItOwMMl_b&={0 z)%$9Vx=1}ky;gmJ`eyYr>OZUhrO|4lG-;Z0O}%EW<_gVAnt%8u`L+0+=l6!+8UJAa zbpIOv7XNGgpZ5P$8>Ow)c4!Z1AJl%J{VpIlAUU8cpgrJdwfwqe`N-M*S-4v*@_!+0nhxyP}Uo zKN$V*nDUsOm@8vW#hi&vi=7<1Blh0d({cK^+PLL$$Ksxf`#e4=eop+!__q@*32g}% zB>X1fYh!}3!MNM_pz$-4+0j8;Jpl zD-&-_!r5g>bCWJedN}C=n~yEpmSLM|8?;?%d)W4>?LC__*_d3N+?Bj7`O4%wlAla| zC;6KcT}pCFUCQ>9<0-#S`7t#mwJ~*j>aSAYO^ZrvPP-)SiL`%DnmTF2q(hTlob;FU z==75G!Sp-RzsRs;^kqDh@qK1`=G@F{Gat$PJWG|8o3%RYS6T06`)5~W@63KFCn%>X zXLHUyIbYbr?4|Y&`!4&f_TSq7maEH6&z+UKDfjl=zvs=!+m`p&{H*+e{5$hM$sckg zJBl22j&8@G<66i4jyD~DEeId{-da%Xm-(H(Je)96@60l zZP8G%e{n={N^wc?jN;|R7Z+bsd~ZooNny$KlG!D@OOBWPu2fYTUD{K6W9e(9AC>u* zm6gpY+f(*r*&oVH<@3sqls{Si&x*8)s){)k8!L8K9I5!E(zmj#a$)7B$}1}Gu6(xg z^~y6os8xD-|9VvxKR*mg2fm+yD#JeZs?d zw@dgy(6XzA2l4$N&cY4?|K1_|TA0Rm3F-K51@bfsxYyun!UZWosK>Pl*DbiJaLu6i zg?9xbp1W{u!*!5dDIAdw3iBZk8O3U$4JUSP5*PD(8&=mgu^gZKvETLgxP}BZJA>aI z5!xgbe(S-tMc6D_T=xR}_M=e3-WP5XX9^o&%X?f(guQV{2t!@>vF`*MOBU?xe4HVb zECizcqvHAKuZm@{kA+3-BcUGfEWv#ddsgURDMBK9S%_p`VpsQru-QH6Jj(9D^D{yd z+OK6_;QAWxpGN&33JVebTFdSb@|i=}jNf|LDd9@-dEpQ{g5~~{uo7piq_A3HG1`6% zcP-jKpX2^W{Lj572({=CBfg% z$AQMc<5I?e#zDCNTg&hm&^UNpz{3Fh3hFS8gXcx#@SdQj@t}TF`(y9C??eZL121<@ zpWmPy`p;>Fa71vP<4&|p^fciebWXG;UH}>)nj<_@U&q~@p9>E;-yi-S^McbR%?;2e z%@3kcwGjgN(`kPufBZO|C~(mTy*KCfs_(|Ee)Hq9@Z z;~sa=0jF;oXQFGOEpZ!g@il0S;3D|m7q$bgCd`+saNWmF3jYya5x&54DZ36Z9)q@b zF?{D)!W?(oWADRsM07xO=m{Iq+74m2&j36ukHDAvh;X;?8}N)O%*!fxI`V};_Motr zeJ;#oKM9ZEbh%p8e++iCPF(W^!P$*@d;-^D*L6GY58}EC*R{Cva4p0Yipw8Y0B4)#Vy09Ea_UUPT^68bg;O_v|p;JEn!cy3H zJpMr{l-Qq`9$LNtxo)=e??N5jfs2JgJah&8gL>iqr^W;7RQ}DXYoCEn#vh+?wb9FV z8wEPi7%%+*O+pZie8r`KLh5v|=;`8D=Xko{23*W{6 z%cwU-8e@${-a;X7VZgX!R0|;FSyrdKQ*8QRbiBTpzjK2 za4FAB$igS(Srh_57s|7Qxm@6S_7Te1g|25`VLf}^^{f(#MAA{I&Ol}q*Snr|Laubk z^&BijOE0^gLj<$*sW4esEvykX3H>-7bh*%tY}7{h=a&d6xaR-tZ_}hS1jA&&we(lHiRHO1s8|qkxZ#&Qq)!l_p1brXuOGZd@s{s?e zJ<=ztwV%J&h5LFuEycU7C`IrQygjI|7jL!Ww@%!r2pjQRKia70brWW4aZ#H+fGQj1 z2|GDLF;1qbL%A7v8egMQU-~)g8(;G5uoy={(*~#sM?L6!AE5Vyt_c`1B09z4f;bCs zcH_MPj@v$9!~K2+-l1Q6(aV*nk=|K`Qq<#4^fUvt(3OW>f}6|8}WWOf42qrsK@65`68ux}oU+zB*9fD*WxlUxIT3J`)^7)6{MyvVqX^0M3&(;`;&o zw+7Fd_-`E`A-Y_H@7AG38nacnug15_@p~i6*Z)st#*c=Zg1pi4X!^m*;rt%g9TW>R z{vTE^T8~6<4j-%}DoA1)SbzP&#R3ppqJu9lSO`G`m>z3RIDA3|_+O$BI}!uWQyl6{ z03J+&8P-xO@~tMp_K^$@lZt5KN#HIS=yw+ADF<|w3+l=T9TtG^6oD2?5QkkRlw$>} z1aFy)lU$|%LsOw+)k1cx1Fjk{^BQ4unJF}bhFUQj+b|nvBeHLa0#0XvvI{Yoh{zc(s=#;Mrzk_t}C8+leNUN_4_h2Ny6%Gh*!CUo5 zjOE{iuZ4?*6&UH2m|LqroyRfWYe54vX9qzE>p??*1;^P8?s^`q%Uht2-T?diHt3%_ zg|CEfgh!dge3&m&F*VabN0gBm$e(Fpop-{-6v%Wq=$f%$7Q#YtLUb4m{SgS2h-6VL zn#BnJ68_C%SsaUJ3CxIy0yDEPD@(+|0MHd#3QJ{akOtp|Up5{7jZA2Y*(`_Iv6ANr z9}Ax#r&XS>-2@OtcJ z7qW|Bi@TUz!uGRE*=6i^gRo9a9hX^<-sLW~nQCJC^jX?n8t$zpE-c`@7b6sXF*gUAcPs z>b|a(>JH_uoxG%{f5~9)vQ=FhwM#~x{U%3U=@sj-XSv{Od_(Jmi(_MbXjf&cR1 z$AGCzR`>RHD8L3R_xPZlHd0pGJ@V``t+S)wryGA%wF5n?mUgLn_)T5w>Pe5QC$&mX zdKA>vx?t{cp>Fy}joK9>&jEEFAOx)R_@JuqSTZ=!rCP;r0reg~1+4P;psH7}u}Znk zP)hYFrDk}%7|`eOK{Z2py^r6dDSgYOuD<2!MpvI!yZY3q^l3G}1vYjM_AT$|AM9P# zF*p#o+VhjDS!uUlX}8&>!wW>oi z;CfKCD#Zu*&8L+{Xn;m&mNG(v$_UMJ^=8o3n^{V42Kmi*R)0_5a^FGv8#v3eFM)%e zpVYHlBRS|A$@US*v>QC0=XgAC8hKXDRr$;Wa)g#XVEglFCSm*hn)$_xE#|KsW^8OA?^bN|bomZ;bz;Ax-OMANd zyVmur^V{HlB8HJYrLs!7S7j;p$$84X+M$}GRJ4iTly7SaT=&9&&0YPg*A1@e>hD?I zAFyooVE@R6p7mYs588D-8{Ng$=GdFCx2{lvASYiczZSvBK2H5mC4YB2J-UW3tZ zwHl0ktJPrS%fz?;{U>go!k9N)`^iuK?euZIJm>HJ{@PF8a{bLWU32q4+_dECt3E#M z+MBLn!urP>M?TK2b<8!vf9m&Z!rEEae(LHQuDWq#znLGu>J!)Abi=jR-BMdw`}T>@ zCE@Gr4^!R8u66qQ>N$Pfjm^5@s#|W7TTKjG+Eb2Zy9rl+{F5J#&HC82pSUSp!LIFDJGS+c z&AEo7#ARphQIe@m@;5Hi`LASMpA{=VU(1(n7cuXU!F)-+^kw9e0ME38jxuf z+UIufL?B!IM%fk5S@|C4>m5`~N zEkk*W+~hoY$=hTd7s)u@AL6$NJuW`i`f);R+BrL7@d+Oay&GRNaoU95iPI*YIBD&q z%`4uwV#bR19X@wT!h6TE2dA!DxNcEwNom@OMJpFiTs(2ni;I${zZgC(ojc>1rE?dr zT)JxM9ZNnl^Y&#k=G?G+)sn~Ot~m0xWw$L{wQ$#>vzP5Ys%g=O7SCJsl=sl-mBsTG z&s#og;i@HfExvB)bxSKt?mBwTvdfRzwY+o5HV?M^(EJzYZ&`88iLn#!T5;2fKVSCX z*n3H7;kqTI`a7JxR+m_)#n^kvXX@|es}_9c)Ekzm#prwY!d=UD*WZhtdgJ6be$d~) z4RslNFS)D!Uf#KI)$&efzAa$kt*~z4uJMq#Kei~g=WxEf=qLqt2G#=_XuZ~66 z=)GIvpW&&1MK3OTc~Mfoym)%0hB>D{7Rs@G>iaI8yL{FN!ub}jTzuUK^!|1G;f}?h zIpeE(_A^>@2rQei?DFN>7c8}8+XzBS!;x!e2}itRX(enqiqIFk^;K=p<()V(W5sDJ z&cc@Z-)mOfwBoiiC!d+{-gVabXV1g4qiYHb_sPtp!r8`0;r|W(5lx&G7k8Z(aop5-y#3M+bHKA8SK?^%@bmu!~b(*otS<;mAor{HHCy6 z`6Suyt#t7c?^V7( z8q|M7`ftd6sb&3F(tjoWSJHna{a4a|CH+@2*E|qwf*-;C@BlmrKZb|kC-77F8T=d` zHe!CvasSol$KeV1CHxAWgr}VQX?O;H4KG;sBCLg%oNt|Sz4B${2IWTOCgm&2&9DU$ zunm&116rZYHfd;w4D^Ui{pR6g(NKH>OoYjBcvOl{i3ZrU6rZM?uAHHqshp*pW1G2f zBrJ#q~NuSmGWY^)aTFI{&VnoxDCDlx5F3VUi;o>nzVV^Kct{0d9vc!X38#CVUIN4R^uaa1Y#P z|0ehm+z$`HgYaW`$oikaPvK|qb9mUi(Ib58qde7P&ik*HJq}O6FX314Bs}lDFF3{; z<%`PSDAy`qvThx$hnHakY=lkl3T(E`7D)KK4U(_}TA>Y6&Y4#3RJJR3DKpBfvWK7V zH7C}ue#IzDDP>A2Q%adq%9K)M%_5}~S+qzgMOH0RN|9xYlv1XYGNqJRave(+SaKap z7O0{~6-AaTu;e?!8J%6g5KB-K%Hzy1%icclO5qMyo#^?a@Qc zdZ<|sHS3{fJ=Cm+n)OgKJ>}^sPfvMz%F|Pxp7QjRr>8-B8lqI$KI-C(_w*v4ZW3EEl7T2`~{R!{P1_n4+AjoTi+voS~el zoTZ!tbKyuhir(hI(QphL3&+9nZ~`oV)8I|82o}Q-(BClC2NrhGUQP_m(_Wg^+G97`?z6W09DE*bgD=4C@I|=S z_K(`;d7sz7Z=fhwnokEO!E(PiI}h2Cj^r z)`F+C;OY4F;TCqZT z7M!h>Z;h(rQku@vbe5*Gv?pO#X|0vkI%%zw*3z`rNo#3Z>!h`;47WmWU87mr2lUnl zwfb-L?TwUvvmX0&l+jZyda6ZFwdko9J=LP8TJ%&4-SyI4FWvRhT`%4B(p@jz_0nCM z?$UIZrn@xVrRgqBcWJsy(_NbG(sY-myENUs)pdiZv^Q7px6)oe?WJiiO?zqDOVeJO z_R_T1MSESe*F}3>v^PY1!D216mu9sV+Do%s3+<(8ub1}HwAV{}Y1-?hy)^Ch(q5YO z(zKVRy)^BmX)jHCY1&KEUN7yn(q1p^wbEWM?X}WgFYUF`-f6UV6z$EUy-rL?yIwMd z{yOQelm0sCuao|I=`T%xz4Vu+zh3%F(_b(BrRlFkf1UJKqQ7DK%hKO4{blKInEtZ# zH%xz7BZP|4L4^*x=&*|pyXdfs4!h{Eiw=kAa0o-Iv{=B>Dm@l3wMvr(Y;B>*G{&~j zWSS;>X);Zd!!(&Sf~XvjZKkohg)Y-{nWoDjx*WppBz7mUdkuE4!R|HKoubi9{OeI` z{2Oq$@At??{|>wTUd*ROumaA4^D+Da48KshN*OY$i&CcljO)g@Zj9^0xIT>Q!?-?->%+J{jO)X=9*pb3xE_q_!MGlby8zq5XeW#% zdN8dA(|Rzi2h(~mt>>Vz#Ix%09K7I|FTz@Q$+_3rcD?dtx?DJ z*id5eKGyDI?QYiYVc{~*TjqJoJZ~TC_ONab>y}uz#JX*)+s2~1S+j*TTg-MDsq#l# zSu)L%!55`jGR+s|Su??!3D!)oW`h6O&i`y@(FFgqomCV3&vyPN$^WETcpLwdWZ|TE z-_FV{{7=e=v5Vi?%I|FDcee67Tlt->{LWT>XDb$@u^^2FX)H)%K^hCvSdhko1QsN) zAb|x5EJ$EM0t*sYkidcj79_ABfdvUHI2!}<{LOYONMJz%3ldn6z=8x8B(Pu`f3uCh z*~Z^&<8NB9poPELiU|q+W-B%%_?xX5k-&&FMkFvIjS&fqNMl3-Bhna=z=#A!Brqa@ z5ebY)U_=5V5*U%@Ys?Tr271hv^t+2J7H#KGw(}?3`IGI~kj91tHl(p3femSFNMJ)6 z8xs7k{v^+zB>9s(f0E=+^887XKS}c^X$;!NpKRk#w(%$1_>*n? z$u|BZi9s!VNs1py@gXTbWGhA`_>iqwmB6YrRwek5JRg$eL(&+Q#IPiWB{3|)hit{N z1ePVRtOd(jYV$I`j!lbxjZp&_HGokA7&RbjQdyK<|d}dl-V#9 zVovm1c|jsJmj_%R=A2O*RpiC~0?maSdywWrjy=eO?xVNCT3&r)v_lNvMN6%;)JjXO zwA4yVt+doiORaw(KOUr)L3$aamqB_Nq?ZrS%T8Juq?JKh8Kjj#S{bC3L7Hf7z*xRJNCSg3Fh~P~G%&~`?&A&j@r16RLy!9>`el4Y@o9=2aT?5k zS#XwKKN~OwCtDl2W-Cq(;^SZ=r)mZjW87-Q$&z7YP~uI3JmI^bOK{o?*vxlVyYPz|S z#c!08-)q~~A3q*EJ6WFrJM_$C7#D^yVHgjFS;#O08D<~rGmj(Vzk_EUQ|h)8c0pFl z!t7$0Sq!s^VMcMJmzU%5nGnWXb^Zs>^F*!p8ncBw%?>@cL(jG9xmLZ^p{MrLB6|_f zll*WyKitj_xAVj8B72zmYUX8Z{erg z_~|y0eK%j77TGh6$e!ellDtupH%jtGN!}>Q8zuSkcK*DbKX2#H+xhc${=A((Z)b^S zk-b@DZx-2`MfPTqy;)>$7TJ?LRg$Ml@>EHlD#=rw%To=C?5%W>WUS zDk-wJi0myQdyB~4B0i+Whcqviq?cxqJ;`FtB72h6n#GNFmP?8q?W~s+KiXL^DTcJO zVv<*D7TKFc_9U;CL2vDD$*Z2T4Zk(*;_^SR*}6`>}hA= zr1;a$%1JS(ou!lFP&;cUMfO&ay;Wpy71@g-yJvnXk5L}0JWhGM@&x6Hta~yTL5l1x zB72L--XgNMi0mz5Rhu}K7TGf*dq!l>&}0&Wnnm^`7B!1s?L28xWG{;BDRC@ZTWAx% z+QhCl>}nR-leC%SVUyxmS`16O);Y-><1{#x{)|&%Z&bbs7J~6g>~!T~SOQC787v2p zGj^u(Eae|7&oNW{W|{K2(aSvVt2F!^M)t+tZrug6S|2^+Vt>gK{}sFw-UTvTOdXk@ z&0%VopY6lcGL~ksG>4_FSenAn4(#jl`|?ukOYl$dW%vqw6}|>vhi|~0@J-u(3%(6^ z!QF5Vd`CUM3*Uq9!@cVI1Ka=5IbVN-lEdH}2Inw1hrzkn!}j?X_ys%y^*lAq@#e5O zhs`-`&S7&7n{(Kl!{!_|=dd}4%^k7T&i$Nn{}D?U7U!_I3yX7D+=azCEbhYMTY}Dxe75bvJo6FCFxUJBWteZC@9MybBHT&Jla;3!H7&6Hsmjxo zZ&bcXxlp-CdAf43@(kq?<Pm@v&rw(hzx*6kjf}v$C@RM{Z>FZKNcSp5r9`_| zsVXJny-Har$_k^h994x3@j1%s;Jcrrt_~UEdKqH)f1V*{S&3;^^0U)vWh0%`=ex~m zYsW@y*r*=$IqbLjJTh;6Du3TDo6OoPX|F!&D#>fI6qc0NgxQ~VzPg>SZs)7p`RaDQ zx}C3X$Lu6O+0I9{^N;Pdd|*EPp9D+w;&SDga2B6(HoUp!TiW@Rb}dh8bxDg$S{ts# zw5wH8>yoZTzFX!s3>DZ1zlW;2w(=wyo}_~($?zl@o+QJQbnqk@o+P6!Y2GBmn`C&C z3~!R*O*(j!3~$oGn`FeZo!a{tkCM^mf7j;i+MLtoXSBJKXUXy`8J;D}vt-4)EYFhR zSu#9JhG)sBVTNbPh=Ca~Fw3)Kc$O^Bk`V*b4eyd|#K4poxQmC`B?j(%-E900b^J%i z_!9gRd>Ot1Uxly1*Wnv*Cw$Yk--2($U2r$t1K+XkyYM~uKHRHaKT!S z55R-)V|WOD0zZYH!O!7g`}_<10v>@!_0MCDR>&5fnUS3+PvEK z&nfF8gDk#;kwF$`!pI;irgrc~S>C9FH_Gxx9lTMNH|pSxvb<4-H_Gxx8Qv(%8)bN- zEN_(Ijk3H^hBwOcMj75H%Nu2QqbzUK!5ek(MjgCS2XB<&jWWDZhBwOaMj75H!y9FI zqYQ79;f*r9Q9o}q#2aOJqfC89Pg#Z`*aO3`7b;MNeegT@Jw$jOgE&lp!(bvzg2`|= z^-iIBv%Wl1mPhK~k+M8e2alBHkup3|hDXZqNEsd}!y{$H`ki8ZI)1eB80E3b*Hk;@2;o{%7-?l`IgGTja)b^ZEh|UZDMv`t_hSvuw!Pumwl_T6 z_J(K6(tH?|WqG$O?LWi2?V|r@c(+~df;Ya4&1Q)spgs!A@&Fwao}=E!DYut$_fYP3 z%H2%4x!8H~`jx(4$%}l}wx5H~!)@>dxE;O-_uBq>J`-i)h5qH6_DD>z!g&kAl<@Up@hS)A-;kxe)m z=2JG|S_RLlc(#ut&fNp7pZKrpCO=rrNy9hm4G_fUDrcaI3M+ zQ6kO^vurcG{hreG>XZE<<2-kntaSbQ?biII>k{vDPvN_iSNKiFm43tVL!TcuGrQVv zK{|cj4Lv>&#in}V*vaB@_+3cYA}sv})*oj5VZ1J2z%XtP;`SgW^x^fe$W|5As-jv| zRI7?;RS~U<9i1XtRYa?bXjKudDw8^g3QOdG?ZPgV4(iau4*rz-kXMW3qZQx$!xqEA)ysbb6q zQKgDCBiB8L>1mjrhI#BNZ(Zf7tGslThpzI@Ri3%Z3s-sID(_q6d8@o`mB+2}wpC2( zD8B0m8M)aGf$-qYT$4=SOR?YAxpEF=sF4Y`~no zn6rT=+sBLTK4-Cq)bls}`tl7aD%`7p*3e7b8Dl3%eGw=T^^y&TWv{|&5yRBkV*>9!{O8~o6)rSmMEWxH4|#Uc6>t@N7;c3-onxY&@jEkh{R{25f(2%(>qE7= zhI)>#-+^^guhHX7P}?nf=qN{AslE@#=CE5oyA}95_XISK*ye~yTZGx1A*~Jl)vC3D z_w77hsL9D}9k^3xSjH9|`XJmh5_r(3o^ve;Jba7Dv=Z0DRrp8EX}?YFr}2ctu{r8~ zgz|i6xPV12RIXCKgOx5;Uh4ae(M#q{!;E!K4x5w1=H#$BIc!c2o0G%l{sw4ykMUfVJ)ol{bkq)ufS%@wm`z?ZIFZ=&+QbG=Q{}(uiM6u%y;|F(wZGQdCarDK+VCsA%Vq3) zFn^Jjhih6*THd7POF5MHfd#(RyJv6lU6oq<-JF6%Hfe2>Z1vw{sGCIk`?a`9Yn!yT38U9w^V3@WyjDN2rE6VD zd?Ee~2zP%@!i+LT3&Ih819N{b5q#CwHIvN%)HZ0!lm$iQ=P97pgI`&w6bpJWq z)X&lG9Kj2<*6ekKzNj;+3!B_~Xv;oZcBxI66&SYlHd`n3$Ub`%^vFQN4~9rS;5=!+ z=ACNmxzUsQuC-ymt+otX>}J2!?6;aa!`;>4o`aLLK4BcanL1Zfc;q3RhFy zFZFM@?*B*n_cV%o*|>5q)vczw)l|2dUEB0`%J^=bvE91(Vpt(Q|FJ8qdV}gZ*&!?az%~bd+I7Nyrw?Wz)c=Nj{~Vzv$bbqjxy^OYXl|U}?y5 z&w+ETc?k{DPGwcs7mQ$vMleMq zm~i)Wi&0F`D5huxQ#67p8o?BeV2XOW#V97+Ro!AFQ#6w4)#JVDp4a2yzV!mz?_hhs zONZOw3vfGp5$>?xKicn0@K5k%_zHX#z6M{1Z@``KP1}A8z72PQds$hnh1Gglt(Vn$ zS*;hJ3Pv>HPU#&uwF9Sin442L-t0H#NEv?p2@m7-L%DcTzi zdG|)$(Qx$d(JPkp`P9wt9`c2gqc8gn+cO)5erUWz_1AcbH(oNGn7vwGW23M|x7zg{ zxSm%TeW`gl8gSMD%xt_Yt9VyOzK@mS+vrQ2*8b72wGZLDUKrkgY5m*&$BU{X$J&4S zq4qp*nSC4Q{g3S{+ZcUC{d&4HYKfZbeHd0mu8WPeest5?2RTM8dcYoAqQ`<|q9>#K zz56^HD!hB_yWLo{zHMs!z9PJr>?YW#W&E1`KiAmOcfhim<>fYE-wrmcI#a)LT>pnX z#xrQ-2>ik5i%w&87LDy0`pi)eI#$>z%FB^PU(tQhz0q3F!+Jp$Tzf@3qhEMB*3;&u zV$mAwHbg(u8$S*!$DgFqMX*{>V0I3{q&`F!FIKN zitenP{gu!M*c{q6TIX?xJ2XRr^@c`zVEopv_gP-`Uw#E1I_Le6mwne>^`5O+vMl$H z9h#B#ZLNJOd>Ucrn7v2VAG)k5Xpby7XnfuN+u-%{bzgg+jTdVyj&5dwraj=G{&#FtKStd;QLCB_MQP)UnDN>leEs*&J8}wq80HH)oOh&WCXKAKtb6}x7QWg3 zKG^M=)wq}X_W`X~caSn_Itu3~@m>{v=CN_R#vH3Fc;(vq!T}l_Zg??%GIEDHZ}N1* z!}2##A-XiWB)XVoOH`@%4u0*Q4cM}#4f`Gtr;YJq(QWnpM_O>ezTKksznC$Njm5IY z_G>KroLMZdk!XLwz6E-F(#*#}9>V;1Ec#OLC}Xd>?xJ6WB^cdP^TJ`fT8taFU9-Lm zcVmxx)!QXjR`pJ3Q|Q-P{xY_ax*TMqacdt5pM#eD-5z3T@D~Ta%sY&G)ihR(e#E{5 zK~4XeS3P40j8bdkk=i@>`_VX4KN_~~iFP#nMI(|l`YKqZ8YTFhg7a(d{+=Qn%idcW zF|5)0hHrl;99;$(*qg3r5QnP$s6xWZ31`60Z$KzHf9^MmbEtskW;az{OgX<68{`aoe5#!$Tv|(Q39a<3Hv04jG z(u(ko!NSJ-bnQC5c7$-00RO*XKTL2XXM$ci%rOtdMEx`#lbolH6O{X7vhRoM&nbGe zj`_86Y@hnRQ`K$+;e6rAG$WX<|HngxT{{l&ym2i$6lSs2Y;6qIUObAh=MlB`gmZ;s zhGQK33VV+r^v^t7*N=8OULNN<^#bgy{~g;qJcICm?sYr`*Yz>R*RfAWtNqchak69g ztH)7#KPW%E>t($0t^PeMt3PKkW;W5k_0!t%uPMIFWV4ydz`~JN=!cmw1&-INbFFv- z99d)D$X16cryXkH=&~{O9EE>l?~yjtTQc%@f;QFP!RL)AConFiX5-&=<%GXuuh4># zcWC9@#`{Q{geOZ*8HN9f>G)#^jILv*a(_(FPva5l@>+<$=DOqTGluc!4xh)bJ52wN zM`+(f771|8=a87pR^dNn1#6!$ir9Yb4aW?}IQSLz9zp1%(1-P-9f_CIX=gTe*8kS` z4qTn)s?q=4E8IU4dT$y9U;G-+usY28T5P!bs!v`UJMub@%!(a%!_8OUK)+$lM1OQ3Cu(}W@YvHM zJuC7M%N%cl9^|1tN%GTL5Of#L6Y4S-Lc|ZXsmFl8%9y8g{=Zn<6DmLI>>rDNOymsv zPOfcNe*)L!_+`G;k5E6}1m~DO{%KU69eHQtDU6`rFU)879Zo8Wnwp9nqp{{iN0pC)fS_`UbpidiFWSE_w-nD_Dv@_%zDrp*^)rT)Jv#)0fI+=zp&dW17V)SNHe*bH*P5 z%kFC#lM7b$ZCb-WU|smU3HQeh_N`hp^U9%2#tt6C_y1h8di~JNFE1Qq?5c|x^X*%+ zZqb^hnoD-$d$ea-Cb1I0X_Zc4_FBg5CY!9a+q7$zw+(FyZw>zke_cua$LiILv%m9~ z`BLct+{d`ZZsS>9c{BLSAEJi}#-x4HAr{GE8B4NgEp~C)ZFby;&cvm)Xl?X`R6dwq zn|?j6LE|7@nYEeMXVhkhPxs)9`{<|go=WxQo_jD2Hs5iPG*>n-3rk}*j1jD{Bv>&{ zau&CTnoXHJKd-=+YsOfiv0R&M)y8mb9$sv@1#)nx*=|YDNcx>C4Poi|87bNR`l8~+ zwWZsZh3V4^vT|bm^tQaY4TY_78GXihHbdR*JJ;{`o-V&TVe6I9(z;KmRwr^^9e0@V=ko_muoA`aRttriP z8!*}8_*U8~J;uUW0&vMVz|d&T1$G;LYpp}-tQ-8B5 z#g;v1@$i=XtmoqwG%u3so7Sf#v=vo=o(_SYLR5M(flmHbo!3C*gm0!gcJVFJr?hK= zfWcU9A)pE>IDmX1TQ4_+WX0DNm>W7O`M#%{cg%^J@x||3kF+OjJ&M+jA07L+Mf#Fj z6WCeY7K$lq0=T8XesWCfPscUp>`uO(e=0q}4Cu%Ld}yt9tKDojYi<0~3#MeJu83K= zJZ8m|+?4aVV`Jq2H9e8}8{=i)O?8w4RjjL?Z(Wke+b@9S^TmN=>O;_aw%9nc{oV%A`_!xUU zT)K*B7&F;zvc;tR_`lWHw4VQ{WVmp6g;cl{_tfB?nHVz^@a8335(2ngC3zq}UK?*u zDv)$#RgIm|J_Eg{3NpIC;7vxQH-NJR{Dpy3qjyR4!Om)X^%FG}Z*0Z;%N(VLsdlN=h?9@Y`L+V(>R*oP%ymwyku!%=k~6s{D?Vs&)9$7?193Hm8A`J z4QA!Xq@J)aT~TrGf+DHam}05zO`Fzw&cUJ8TZeY%M+bN-F9qv#i94n*o@&p-ye@Zq zCFX^5!DNruax1sLY2=qiD(BVn?LJax?YiO9W+@?&ICQn+8)-Y>3}JCBo$x@LE`|pi zWJ`k4E*La83V5=GcnZJ`0bjP!2IUV8^mjGek^xBd+d%nr9yD)m zLfSyyZ0Tsj_N8GV6}3f`x$!)zF)TN^XXo&B1ASIwP)BvIlsK&@HZ?GyDQ`9~)((ty z0}?Y!Qr80<*OH*pj2&wOq?L0Se7S-HS6CpehTn0kF7lBJ>#NKWjW?egeNOdBufS{O zuPvGr6R@Ffnchn}`doJLqYoOrYXaA-Njw-D-nU!%Zf2NIY1U=a8bUB;7AXEb{xI+$ zaAniV*r!{uPp`$rn^&(^9>9*3918aS*RK2MoW)+!N(;L;b>qIB|NSq24z~gG%bCCA z$3Lds#{GFnQht);r~I0CEA#n{{JO)(I{sY!98t#>cCM7lw>Zbmj}P(2wT0iUbn?4- zeqG(eU?7}bgWd|&-ZFT;H*VtpLT@)J^UoY^f3Et^9q4I4@ov%*=*Z9rq%wJScW7f>9zFD~{ye&d1X_(QLpKXngE~~4k$*whcm4y%2 z3_(zm*bIkVenUFVN?DVj4l_vDAmJ3J-C_l2vIpS+mp~ODVLK5@vRIms;CQ=ML$~12 zBxp>z_5zdoU2v$heg0l+V@^|h@pS!~jw$*2VBdm2+73(&kIJo2FqvcPPCW8Tu8F5# zhcj z6?;Xt$zi+e)_8OrTdgihUc_* z^PJCT*QR4na=|;+i?g12t7K2CLMxbvKy(EM?dSZiYs$qlt6ReY+x9Jut0}2$tu%Z0 z>VALEk@kTg@6v$os(m-qR_nbhz}B(5@aqyl?T4Mt;w>f{@gl833c`}5Vb-|?yzKL1 zZ_n?`i)>wcIJUIritUF>`lS07uDp0_Wq%nD-@mtN_|<8Ej(S=xdSW)gAZ-v4eewnWJV|=qwd8M2)qk~oBX65r5Mv|5)NNk!>dpCr0$>DGd;>QFsoozX-LZ6^pc>wWdRR#&eT2q z%yliZ!?eXAMRQBnD0=yC)ynO}5Vb9Y28wxbNs7uKlFfjSu4he^U4d3wI1|S ze%qO;JAft+NX^5o(wgDhq#0~@^^Y}cw=$*q2+IE zt(sE!?wXdmq@sW3eYvCWvrqTG=%mo~fI!Dgsy3q1sKzReM$jl_+?F?|D|Dx6Ry;MCJjQg^?JP-QWBk8Gvi&F)>%(Aw5;qOA28 zx91jLT6aY|)~5ZL9l^?1Tvmpq`)(`DR9+hd<_m$xcHj{@7|97C!7<>b;I1xdDN_+F|@A`k|e78}0-4?bv4^WSdMUFjzd^ zX&&9t(Gj$|ZFR)vB`^A|Y#Y=anBLsM-&11OtvHaA%3o2Ercf{UW3-d%XpqG$GDu14 zZBrgN;@c)?fPz{DxpH<4tn^Xb2Wmy{V83*6i%GUT(i$7V{im5CxTZ~ceYffRy=ZcU z)IWS!T7~At!@s9-u!E#4&>r*(wu>!f@#7ZIi1(~_rzxMV>6r6D4-W&IQr_ipw1s%A z@*bbfd#Ua1XuA__p_%(~phLDra%rdXR$Wv5^7g48q0x}?CeP%1lt+0D?oY=3OVzQ2 zJOyqCNz?w2ksk|FDmA>-s4NKOPiTP6#fl-Uwx53~xJ|fY55GnFx4=A@q>SssrvlFT z^*MpRlm1;b99@OJPXVAyrALXkBtiP%m$vWf@bQuE_kqTtI4HgznQH33qA z-5{Hi!Igs{(^v4n?8x8LQMNp})u8igGI)9CBp3X(e$lk#gxaZ*5xT3oZ{8ZDRURp9 zjgY5@_}XH_`NM`Kdsn7b#m57=tPbP&OE0h>u?xh}ggr}p0K@^YLdF;*TnMq8U(`~Z zoZgn6K5b6?@#dge-k(((WU5LlO`Do+x8?_X*InE(RK^v9 zcdWN&NpI1ppN7L(z@(Fsv(o6w8xXvh+NZqp2sU^@vRs!JZjctV+TW#gR`7O6J zntW4&a-ObU(Usg7(-{%2yL{%Y8x3CX59jv!Tm2LGLjg5?z!CN*SdIC+t#clSw>As^tBhS zDyZJl+hARoR#bWn7>Rcz@Ry`FN&izZLP`k{tQIE-EJ5X*pPP`ZH%zIw2I}@0cP%Qb zy0*w@_X}&0-qd*&YYVGVtCY64r32Mzi@QNbL5>h9AFw8{3|2rGA)G=Atl;=X^kdgr zgeGLwsLU=I8W6#r$*q_}p5TJdbT8Otj57Gw4bIL?^1m{mH*oF3_}Jt)PTVJ!nT#4mDXmK=f^}Cd{6hx zOzp`P`YEh(k{8xXP(WxfEDUxPahNvPflV%#_@%|AA;rzbK{YuIMxAeK%gL4o-h&!{m7y&m{A)!o&6za| zn#6665Zp)7kiU8#2*e8M*m-w&`A}GI=HZZ*U~03vA-^;;Pr3yyIgKF20BUeP8v#ki z2FR@1{eZ2n^8OjG&hMC31Aykq&-_#Q`f~{Yv3mR}KpUszQh&1fX6c3DT(vg{x{A>G zNSRV+t`%yjIn-P(K|mbE3@NDsP5gn{=(aF(Tl4y+AaiV4c44^L+c$n@QgKOeaZ9nO zI;t)tL^jY{zP6<>DoVMJe?23{oE{q$ql?L@9hi0Iht{;#40C9f9q*j8k^zUXc8nd7 zmO_iA*k4>4T+&=@s*Q1t>>Euhv9eS7p*4ME6u&rH2kaBc3;pTT)0yliv`Y$1LW;md zp~TMkb;-uIJ1&dr?9a(*@8`qO@vdcM?~w*tNc}-r)VQ^m4CX zyuAvWS#bm`zo?>z#+d1tBE@42BP@@!OI+O5Vj9mi{!&>5w$V6XIo@3FJ0&RRsmc}I z)|Mz@8f`b+vMESAT*GtpQv}mkytlfiI66kfEx(C7NIC^YVr|KqCRYzN2hE)sTrfMP zn}6M06VztN3{b8kYO#UGd<1xYRubW_&tG4jctQD=1(gkE!<@~H$=l1<^t9BN`CW#h zDPds=X||d3g1n23dAU*M*z~N<0i!qihlIgzlrEx`frKH{!@LTzNrU)FiO@Wr+vc4& zufSMb9av>)NxZ~(NwI!Wrl!b{JFW7&sw=Oo`YD^>T!=Nc@UMwx2y3(vu&jc;Vqbvg zN^g#mj5$mYD@aD?Mlrlq(a#`?;p}28MFM&w`N%2wUfk>x`<#5@TLWO2LH2y&y!h-ULeFf|A+n~yVrCetI<%E;fG`2JG^hUzOu}pnav^h|E%5H~t=K1e-FXNWeNH+ z9A*;paul-v0^_R92uup6nf(!`--R2LRQ@_SUNF-2j=N#!t*6~xkjaG=glN^Qg&YH2 zHk7sian=8nhHzcvnvST7=sCet6VFT3+49fDMvAJ4OiC(AOio$4Qa)#su3CFAy);Qv zrRAH3&^wMYX})v|$pg?E2w&=Lu&-aB?#X~BtM|3?cIB~v z1ywD^7JWq9^tAdAX^xLE*c@4&R;|1pSQ%8s6RK^4eg0mU?GTHRviV=J*T5AL;k>cp zBq!r~0o*obZD=qlR>|t29n3FUnOUD#A03TfnJY8u^Bbb08}jQ9&Z(@NQ`r!Mw;3aU zZOB+bH>BX3$~lCs<(SX?uvFtz#%V}0Ieuv^Vp8Oq0-LbzH=ehyYwgGVpKl2`W(c_5 zczaT7(w)X%8@+fz4UbYj;b!H-n!xIsW5;T0jDY@LP~NbhJh8h2Eg`l*%e~F`!9lt2 zl(Gl+#5-0>3DQ26#tH={L4Kh)0m(cPD$Jm&B9@mak=2&=3gHxDFCCMdWEPEN>|fL1 z9~6~;UPquVHhbEXnyHbYi`KTLTvi+$X9?cCtgI?bxjZ?iBFr}}b;#c?*$riRrZ6A9 zE^KD=tkA-&vg~-hSGA$3DJ;g`Wi1U0%WK}G_f|GXMf)23wOx5Jp*naJB=)7WlK&(< z>!dwmo4CFVDG%KeTplW|oQofPca+^I-3kAK7CtSA*NKq2$gImq$bxWX&IJV~2>LTa z#>Tfi|LUthyy`0Dp7Ty^+xE!9^YU&y^6_E(=WCzXz59thO}czd z#)=$mp1$Sg7J_LHUj(jx1OZ)jihIa7vw znpcDvyy7$_|Ku3ovN?f%UVizu85-&G=%`eGV@sNkBvnOdvjaj6X~FySUO9S0M7Ysn zOihtBp*|Oe`+L=R%Slk-BI%}bU;EP*5` z!M%SW#?87~ky$$+XD4p=*BYcEiht!E#^kQ1c9Zg&bGh zR##eFI6Wu96sRkKpvu`k{whC$KH~5pm>dhLS_elE$=qqMOhbqg{n>K);c~OiD||(I zt}&=^j!sId_OCL;`UZu~)s?5sl>Sj}^$Cdx>GP2awJE-u$btxqQCmo+HyFXDVPAYo zc!LUI1_i)wJFR$LH6TcXB!?rD_=>P=RFFNplb$UK}G@_QcqmZ)wisK|U9d zaOn~i!akK=e!D#xJst!~Z-M8Xa0zY@4^0V*60S^saOZqpV5qyM;+j?0R!(iM=YQ$B zv~qZtbnfsj-pYmcv4nlYUf|0KRyqxqM6^YGvta|xqR^4SzXv5kJ`!$bp#a-)G6Ca+ zDJ?(VBb$2DB6a>r;VC+AQ?NB;ihqXP&wqxuWRnw3hB>+Dhy4lbcAgwcHUZ+K7Q6OO z=ajZpmUc=n)hmDeGK(nUAn)hD!mbTayhw!YG1(HQ1WQ*WCF_!6IvW>8#C6nto!SwSX6-ORI-{t9PKmpAV^RgJht^wt;W6qq zR9e;7&at~uW-B4t%@vUA;5l1MzE{#zQ)ZHg*3M;apa z&PfjUkVkcRMz;O*pJ&c2$p*fu_lumpL#cM+M)W?Byxm8zj;Hi7V<^{+BYT;hi;-3d zs!yc2ho7Z<4>RP~oozF`K@;CJZsL<{kTb83!-T}l4m*dWic=kiD)Wewp5!eOq{$Fs zNr19rH;;81)rOMOh_8UtsD7-^$ltpxTzZszMl$U*DN#O-cY@y#KlXL=ukaNQC!A7V z9_wY1kIyTde&z^S2uGYPYEMh$TSs~VEsg1Em+yzZ!*`GCDX?f>)tT!&^fX7l346jI z_?g{CLim`@vQDHds4G~YTr;k}@O}HHPCfJSm=2w@+$bN092qWj!~{rnV`NG9&ZQvp z61_P$P^w9eT;ylUHp&&l?~NNLu`toUpwynA&o4Rix3Qyn37ihd7h_!F|IjFiAJFOV zJ__#%DK~EqEjJH8H?HqY5)ID0JhoRAzj<;aFcL~KIP5bxsp<5_Auar2Fsa&Pm}%hi z1>YwF9AB*W@~@pA8sOz0rFzNQ`5w5*(j}u=m+Qxa%>~k7V{%|_Zn!ZuFf(j;p=&*d zv_YX<%G3sv=M}qK-X%Sx&Ly4#kD$6Fk!2PCFsO;oNqKfw6YrIR0+gqUxL1JkQ!y_I zP#%2b;aTYMp+@Pyb>B3?Eq5W`44${fks*=K49v|F?<5P9Dh!Wvqor{zpE91S23_UJ zwbtS7>&|OCL++gDY6B8gU)yRy|2QFt`eipi8DC4(Kh{|`Lj0=F%+&+YJ@r5*ntKnM ziR!-?*M*Df)h?V+Tp-^Fil_5irS~!2On1`z$#FfI1-*ab^5Cf+&(%)abECX5owYhC zPtlF*ZG`gN=Em0x?2t?@uw#>d3#2r_uQq}S^1KN=@K?nCr+Wn+Z1U%rzOt2WcFh?# ztM{G~^MyzN-cI{l#!-KnI?XGn!N}CmLd=Vwk`IVIMY_3jN0EH+Yu9vcqh>a-d;Uzj zhoI`hFZj@~HaJD#ONDAO&YvpG88Arjs?Qs$1L_*w{i^m$12471x61R|c&@v9^|Q7w zra9N`S^0XW3{ovixr#5x#- z41kr8-2G#2UOavn%k$uhLs7D(wT;IJb!vi9v)QgL88nr)QJk zO{$x)KFSP_Xmnes;a*SJ^m5L2ub@`pk8zyTht!2`4yg@M+B}Y#PE{tD^m199TZgen`1X-A3vUbi!ghp9r_693FE5I=n#h%Gi~fT4rSM=1iY99^aTYQPj`L&k zy`be=#yc}rI?kNv(scEDE6!Z>>d7-od})Gr^cm3ZL=UO7fJoQX=S}D{Vv;^p{xzZ7 z-72|y=y|D&T2(BlbV6=O7gzIyi(aCT;JQ#{U;;u^>KO2Zk=udnoq{Wqif6UM8Up2q zEH=Cs)2eTwSsM&Gp0}1mgtAe&P zoENc3dUMnA%+Sc>@S=?Dd4mS;692}MsCau?Q?4z;Qd!kL{Jj)7*bDj>-coo{X?H>p z81)2t@R!OU&$IeWE8&JctKU>gBOk3gY9VyrUo1VfoUQ0 z{6aDV=?g7D0*H_8h92M(!%ZwE;zFP&W0MU!$#af z8}Ws+VngNR%`m^3VT(%Ac;ikoMw6dFlT?tGk7HS*M(xu^rWy|)PkDRr!5)oVVJt9N zGNTL4b=77$J-Wn4t_x^xzA!)6E~OQhB^xRmG(P?f0av72z1!O<9&Qe-HWW{g0X!4W z(Ws$2E~^b`9>QX*TKz}j_bl44C#W48hRUXo4?HLzt8@fifS`jhVF(uBP(%lS^H6j^ z!q3JBkkCD8j6ehUj;A;Q{(E9K>R6Hy{N@*q1&%Z6SZl#;JdTx5OvX8uBoUX1rl?>i zmyuu+Q%w|3t!`}i!{1asbJ1i`5Gs#RqC5pdU2IoN4qk8$!gp=qiz!uKNyh9U@}up$%y14Txz&2SIYCtynOB4)ObmEa8XBPuyusDKr>291QgJ4GtP8ZO$w-`PZ1DYcunk zzDZm$Rp&dC@ePyr3VImV>qSHw6MKzTPjj_b+Gl~}t#s})VrLUU{y@W{EGX7DcZFr6&7B~W*A0BBjo6?ApaV~^= zINfRfGTI3MjQ}jaNGc7#4DLcFAr$vj1mz6pWO3~6> z$ox@ihJ)A#0>NTuxPnxy@SK?_PQ{FPDLykNu_mK28v!f1NsZ}k85Fe=uzW@EV0*v+ zl2s-Is;mrNn|9xke!~XSmMPQKD3+v%TYl}!_uRE1G4%L7I>0F+CIoLGjQ}(!dybpn zaUi}#Pr(y{`3$$ZXx+^(LU>U7|I}$u_S`oyDUWd(B_wlt=vbO3P61c%M4iy`M7IjE8weBC2d;dwUSyO`lS9*1%YYMzFY)c6kUVG#p18sR|* za*OiVt1@#0pdivib!Gw6{*FY6OV7imM^QStaHx^d9$wshQkrCul1Ti{OaYU8M{Y%c zq)*^MD9)20a1SFx`8~aXO&p_GjO}A@NbY0!LzLLTS)Q9 zxg@VEUdGJix%G0j6j^2Stxg*L0s=a?WzB)5iEP1#=+W%4@fT%~w@w54@lQiL_o1R4u-OZCN6g*7 z!Gt@dl_GtHVrBD0M6rdkBPqi}#2ZnznOkr%9~sjv!kBl|*CruKm_m!g+_WT3bSc3w zXC&JA`HF;|7@tlZg&DhPN@0xxCTZ(P;IW#ew;h%Y;lUY`Z$jy1BeFW}%t`WXB4P0G zlyf6Ts+Jx^8%sLu^)NbDCyh6zfEv#+$Km4K9wYFJxZ~+g-bi_d=fbZQP9FBjXCOQ6 z|DKbEa#X95$9Y&(yOJd0rq4i@3{yEzEE1ADL{3|s19=RfPP=}}jJoVzPjS?3r1yjN zXg=%Z^*_5Juxd@RBGti_A)aS~Fj|Zt;=d88d-fF}XS3%OsS2qK@ic?^y}eHO55WuZ zGwT5pmldIalT3j}9L`$UTs+s~H162Dx2sE?2jW5KRHTzYbZ65}8qj`GYEPYQR?Ac4 z)k}(Nhw#?h`{6_yqf@aRD7ysnp}a9rFuWZQ=gG1r1*v&s<&w!cm(l#OQ_l3UqFB2+ zk&!$yDT}hmcJAjtiCL)J@3e@}3MI`Ic(L;lR^Ty$UOHV+XIGjhkE56F`{zH0t0xVn z|6lz#HOBG&o1pz?^WP9Z--#JTknT9j&0RGWC|G3Dtbou1#)F0ygWYJ~J4tpxUtMWw z-SE90G6ZO)R%7R=K0}HHb@v(Oh;#P)an3nA&e>;Ojy|*`Js=Ke>@U>qG03F4eJ!1^ z9+mqABA!XjBZODQAA5z-nvb5VV<0~@daf$|fhoXeEei4z}owUN_4-VI_L%6vdQ?n{!Czm0`FB&KMC zIP&A#W1aAa*8vB!9gQMyC5h}~;(US}0ml&X3skEO2{dHPffS3-6AX-WbCJcui|gx> zBE4hg-oZ z$rJA6R&EoM230PlWQ?7Yd@C`jGc(7m2dWLcFV+M0sGp-Ol_^h3P_L^z+2g9DgC)~x zMc$kn;M3ADN)2{;wP~}sq8ThA^p}jL&cxVmRX^{aJU>?Uqr>*hzdfhPda3z4n5CM( zQ$}2jte6Nn{GT#-oSND%P2>qyg@gYwpNIDg!NG~Cli()?VS#dr=#+_S&9lpA#n|IK zuGZ$;Xd2j7BFXt@!Q1uPhZ?9ia<~d`%;$`wE32Krfum;KSbpbCF zh70@6|6xb+>&j--5BX*%Ire@|-Zd`O{uNd8 zaL>4xMZ6vHKC$h%z{$B5;Y)DG38i%dP2!r?h#uin|e=e)gPmu^GpSZ8qh1!FAO z@kB;aJUPxqXfI8|9B+@`63`jd6veCYt0SmweRHGoSYy*rCa;cE9^>Ef+D-VWQ+#=$ z@<;yN#*H{tX$F*ONYT&k`E*YBM^m3XWE}3X2iOB!f-W~6O!ky{SX0&9Ty+a29|BX5 zH27cTYhb-a?63!0D%OB+3|l-d0#Uh_f}3L8Vuao&MX}`TpBscotp{>-g0A+ z$YJ`#kteD{AX1N{eKp)f6=kv;7Gdbv%CH=t^ye!|dZgbBw+1(bk#K@lbNmf0Ga=m> zL3g69Ggd`yOa@3xLsc?hh^wF;_Jy>Dz_!s9%Rf`}=6cbMJcY7K1vVDSBxwT2f=|!pkm&BZDj>3r}iE0*aVejfdM{e~jTszFIti^!3t*~k%)h!k| z_maqPT@UHOmnwM??I1Nt&2XiNJQ_|-a!qj>13)p(JlAWTHh^~U)~m4_W$M99>{E8D zmGKeyB@Y`@FQe&YssS*rW(N2N`k{(#1sWX;(00TJ{z1BI7Z_T4`3~D-t)hU7H-}-%Di2QCX{_EZWp^&`AF3C zkSTjl%rhS7ihq$NXmj>WQv;e05WT#Q`_*h-^i22Dq>FI(0D2cUQf{vbbE?1}!3>RB zg;`3q*V;=)s)j&GR*Nw>VZK{nis*-QaH5~Pali6c${8k&y49IET!A}Ip?8C*M54{N z62-%%hms_}R&FXU2w&LIT79MYu@Y|N`UGB3#-}Uq&9$H7U}(rFv1Bnug1^LOffSMGDp=UIW#k!V<9gcdQ7{Bodm_)Yhy$C0qm z(QrrfLcEy#)~elSdG!2UOU5|h9rOlm8uSJ@z3J?5 zi`C>|Sg7@GU^-WJER5(u&4wmF%_vj|Y;gK8%O#ldw4QUK{{@Qnm=}HKqCQS1qNgy_#?n$y6j^3M zaWbCW?@Lynv0ls$ad1v_{5A^jh6**=U?PN1a*P#b(zw!3+|Jf+kD;ZbcA4S%p5jZ@ z`J~|NrTIXUp2Rad?mQkhx0}Ws%@gN%!tJ0|<7YpWZw4;4!q+0Wxi>iaWb>4&QcvV4 z*QTA!RIcg9-^dPRB?HVN2Iy`9;Xh>=oLDMU&IYAD%9YOitYf{d)Nw8OjV%K1*C z^7|sB&pB8TFA7q2F49LVy1>>nu-am-(4}SEwDiGybS@1XzAv*W(F3{Mri=^DU`ljE7n6P9^RC)9gIV(wSZlzizWP{s)vxBNN!OqAiuSFDV z0?$XOS+(>TMW9O?Mk+SFGP}3aS+nU094`FE(W*`Dvqjk^K3Dbb;7s9nif9a+hTu`! z0+G_K2IP#^Stt{(+>u%fsxud`f!k9hDUweB8%Zc8aMBSFN9swP0AqjGQ%NZjS>zWz zl$CLD32>n_18ZWbVk57OSVm98dUD zPY*?&fI*Uf2z!6U86xCOckHR>h8vJ~IS-3bIEBvweTeE=SYHuwd-nQSbhJ-eL+djV z&L*#;wOU-GtHLNjUr5l2ps!q|;NLbxQ1$ zPw^Zfz)PYE$mdvOvv&Qx&ufQ3Va@${zE#)FgZg--gSW67VU2 z%vmcffOBsVOBvxek{BDJ@8FK$Y$;ZkD$=BT?j1I^G4*Lw z#T@wwFOOeWQ^lB~HB`qYLmIQD-GPl(R}mWv)wH2?JOnnlOeQ`H9_?I55)m;Wlho++ zN*r}n>vJ;Gmt8gcRQqg^I6-iJpuL@Ytg9mxktX*i57l*qX7`(MC3ZMl2e?+CU+6Jp zu@R-~01_p--5{VTy&>pOZENi{#%oFmoyu^%@)vHc=Q3e+F1X|gU=?dNuFlV>!3&3w zR`aA2qJV+`d*n#XpU6GN-Nuo+KQ&eBsq)YIss@o=u4cDTb{t8K6GJ#XWVuMm6D?os zCgi)gXJ8F_%6d`b!`{TmDIQ1m94E$~nGmxe85xS80bZv{d%0rljR~| zwI(DDT}rBjhm@f`&@5chb-z7p?4FEnJ;v_oL>!d|Xr;ZXm)Esk{=$PWM!x{9PR!1F z*-f`tJYkXC^opU$)@TZ}3NuBTPEs3cyua7uyqZT;3yPicG{2ABlnY2q>O6lfyxGKB zTxCy?)f5s;3DlGiAo8a@%vzd~&}RXWlk*pS-uMI zv?Ax!rTKWmNy3Qsb=P=2NMAWMui?na=Drhp7mY%(G0ssYo9e4BJ?l%4Gpu*2TEkXP za{{k~=lpi?N>H44f!*wKV^ctzsGm+IE*#8mw4Th9LcJ=YD^y>4&$RiXp6bXX*LdlD zgJd6bv#{`16tv3?b9+i*bv?4EqDsg(FND~!mau#pp_o;HG za{q)Xu5u^|m-R^oZqnOrZJ;3E8+jMK%7_X~%Yp(pCF&3)HO~0mm7uE8>hneJULL1RcVX z4M;>D37#n8%$7`bW|_|)1to(*%Que!1v7$_C#iKXoEA_#>p;t?Rs!nK@=oY3%C7O% zXoZ>iJNJsTq96V_^cOYq7+r`SEEIltXiUktGn<6U>MR>~qpFXnP`JgjjDcbw#j|`q z0SfpYUT_1#1;Yd5VIZ^oI2dlFNV~6{Fx;;CT~!zkV{PGIbd#7|$dKkarKVdZKyp|} zxUaYYPCGQvK z^;6XJv7gQD_wxNv_Y3m-`R^*{H3FInWYNR{yJ{8r~%A-MfRyBP_#FB}G z8p7d>yu{j!=1j_^vDBxxWL>tZz2C5WW$0jMzhTL$kYZwaig9)DP};pm`u*3LHd=cR zyjpeFh9vXJyZn?bw{5V5AHUm25;;?_Ji&TLb=zf;>y5pAb_>lbWM_M3679R`WqH@x zH1Ay4@;-#U^%vNkC_03{Hd3FpF?7`2P#vcHk)W7d=^lQ8{6zhj8R^`VvmyM9st#x| z{T8k5E^QPrUp%Ub763xEwkvkmIIT~_Q6Rz(ka?=`nu}h?Re3!PD_7_*arDTTd=o^Mw=GmgHGl24L(UVgV{(rG_1Vq6pjs$v5ho zlbpih^A(A`Q7*xdTD>JLmh_0z5HS!qWX9B=;&)C6&lnS$ftiF$_0mmFNqIz0=HI#m zV#y`@(pb|SXQVDkRBlQNBm)IT%P%P5h~5m*Xak|)gd`;MTW*MIjV(ykmvsNTD%TiQ zn~>jMafpYbChomDxgtR4RiT%Zj|!8j%5j)EB}%FkMyEOQ(#DIEXQ)`xhZAKVBM%%l(A}HWn_I=RlRj)oNg&fX*pdj)(A7S2?iHCqgOeGHn?L zrtHMvvjR%=JPuBBQP^;egY{Eas^qxZ$IgnRYDIz>@-*Rh%lX-g1QUaeyj7w5tm#fm zCK_7aR=LI5bDyS+Ml0Q~#*(U%)_O0>|Dvol*s+K<-Lt*yV=WmEgRGPb#wLCFk6JRk z@Zi1aXBY)Jxr(9f8i`z|GnTx&wZKmxYN%$T4uS{E*3V?0J2fT#j|qETxqh;I^h_r+ zeSZ`K!@E5sr*ne~F9c^3;8b&YGXdu>%;t42;CL5j-NZF})2U5Obm!hN3Z}YHE=`a4 zhhAMH?-AXq2b_aX9aXFZ#~80ysX89<3xCi$)>tdFPs(mQgC%WqOKhYkVm#o=Yjll# z16B+X^AqimqdML<6Q;Oi6sXkEDQ)x&8}W9E1({&!9L>Yz4^3S2JKZ36Gc2xiO#u9S z75lf;$1^Z@s(c&2ih{s+231VOH(ot%-^l+w6Q+K%AJts*qs zW&Ab7CXvj*NbUIpzTvOYH;ykITiA7s>f?x~n55#HJ@0_OUV;{axi~4A- zC{nbcOSGf5+DFol1|GE^R@(<1u^$OKlF@Rim4Bjk@<}UylrVD_Th4Fe7t#FfsD6Ie zkIQ+C@;>PySpa>dcs`{13^MB5d1c|ba>sBT#kE@eU}o1jzLQJGJgc;t{M#mHwN^@4 z{H4z;wHMg2bJe0Rs88blAk!bB;)9d$EYlLc!lqo6kuW&TC$Np4W7;B~V;bz|W7%bi zj1P*3UipA1Wj$8M0knLh90&d`Vy&oh3m*SM1!tf&yCZ}*^!i2Q#H=^@>LPODT9Tp?!xN(t zBjmW5ahc1K!V-fjvzI1^4Wwi*3A1J_1zZPFfA>PvnI)gj*s`_UG`3_be|w}nt!Vc; zzZLDsmy?%(;5ZO59vUgiaXMXk$my;qj>#@~#IQRox+Pfe9kn7eEx?pFQ!h(hkpY@} ziW&mK0;UA7)X8?g92EVK*m2DBSD2@oUk4|l7XDMUP7N%S&NLEwY>Y5cVu0&&s*-h6 z%w68mgEMrYoz?ME42xr8;=B_w4YKquP-Lh!hOC(tn=-4@M|w2U7#^5W0QSk*&Dg6a z0YB|$yA85v1^+|9OQw^JH+oBNmbZN!@J1qXm{}6P=`@t~!;;5vw5b z3%NB|l!&%kuq<|yLi){sm$4w$D|Fog*_dVVGBotg_vg`(slL+w*}hUlRI-o6 zU#<2xmYVbyzkr@{oqxGrpQtz3)4QY6HJUJ;K1q91c%nuVs?)~;RH}viD!(2OMN$QG zQ?AI)qc9c~J7Sxt=%?y$h!+#-Nt&<9O-#`O?@~@RjB9YLyC2>ij)Y;a@!x zA+PpKgjkI(#|_+@y-Irswl%5(-K7>yzEmv&&6zLm2w`uNJWAYPTz&7S#uq()dt8}g zj3GHL=b`8!j;tI%SKS-J=;YPCPfSwWn2JVA-kY+S?H(fb)GYz=!C2z--JPNHy z8=Z77-8;!vGJ4)gk(g}~W-E45(l6La!Q*#QivQy1Sal~InQS9*mgu+wdeOG zeM=I!-k^MH@Z~0h^3BGIhEVSw-DA<^*+pf`b_RME2h3?JOD`*r*x~P0Miq?T;w{o& zq>Wf5#HXV6i+E}@o^JvXA<%+q9M+Jx{#b3lwxOoJA+IK_N~+Dx{r>wOc-l)ZDX+bI z`t-ZRG5b+9sSuDSkkleVTgXj^U{v&$Pfu`#PA}>Z#PSeJ|7Lw+>4G2o?2(aMo=L1N znAs4QoEH)PbWw24Z54<1?>|&=G&`rdsOE{B3s)znpU63spH~DpcVdhN*a*ZEJP=cC zM2MaGYm%2`JiShYQg7hSv$D-oiz&^>&#v)GvhkUVO}vypYA-+*mPB+^yZz) z`S-s&us+mh|K?D=Us+I`vN5LXz|;$gll9L+k53l*Yd<`CTzm+owedC;z$2(Mej*KvAw z*17C2c*;XGb`75K9UpQozvC~p^lZ{~j!n`@*_R;33X+otAg|l9L-#@34_o%|Ew#fx z$(?6b!|EZkKDJrv;V;5VC2G2p28aWTo&kd2A;ECDp<Ep z@-?sz`3+PrF00*w&znE2Ei2xAlkN4dt4j+vUYUyrBVQkOLETW@wP8Ezh5+$e7Al$f z7dYV{=s2IZ%(1+ZS@{j`P-gLybn%mm2V1YMJ*XsM$`hLkWh8wU5jqI?9p ze~_qF##kAM0;PaY%%Rkw;K`DYs4*M%v()b|9b3O&edx2O-@kKg{eF7pvs%BOv-R9p zTEbgsT-s~vg=W}7njyaNn(g+D&ltGSuI&My&d0PAWz)q(7&C}+LV2r&+7DY+{`Zre7MJq^F`>n&UzE_M_9j+gQ#zLf9bC-_7BX?~jjo&OuLgh^7Hbb)ju{7e2|yi4Wd@&odp zRgXjsLM4w!r#XdLqJmd47Z<24D?_u9R_`c=)y)H->tLxWY zth-D1o?oC}ieInad44DS9`t+7?>~B3AEocnFVx?lKZSp%{h7bbf2sfF{wMr@H2528 z4Z96D8SXLs%kX_bXh2Rtcfg*2D+3-4_*=jyMt@_hvDLWTc%AWuz?i_cz;%Jw1U?b? zT~I>M{Gbbi{v7m~$!N+q%`vSrU1Yk^^r-36;JDza!8?QR5B@$RE2Jr8Z^(TiZ-?qb z%R=Xb?hAd^>}9SnZ!hcOv3vty3Oyb>$N7RIiKy&?9wI2LD% z>yJAe_k6rhd}{oH`2F#xCUhrUmGIkyuPhmsi!6Um%uQUH_;}*iNi9ihlTIeR zoUBRCOrDm!Jb8Qajmb|Zzh~80qpT^`R_iM3LF>KN=dJHqf0*JwC3#Bel-W}@Ou2T- zvs3<+5}s0#vNq-Fls}|=mzt0|KlR$w(`jC5J(>1ix-mU7y)XTO^xvj`k&&LU zB;(!;C9^1Vedh7Z_p_v|%&fMotyvFc{g|DY-JQKJ`wuw*IkR&1=RBRubBl5Za`)%n zoqIa>TU&&!$Tr8e)pnEZ54Ioj%JL59J)fVKzcv4f{BH{~3K|O57F!j2=}^aD1Pec<(D3o^>dAzZ};V zT-Wd;Y(MgAW=N?lOsZn-c$U!`X+BlDg0?p4~5(v11aR{LKHuZs(t~WFE}I`R(i!4;F9?Vaymw z!^3d8_M&YazlzNf?_XfEc|MEhud*Qgy_&s1m*X~==c?HotX|f#YW^jz&v4&YECBCk z@=|>MHM8+@wicfk^53(I;X~XD9GUQb89$Eki&!@=WOw7aO=mFw?E?4rFfY8n9# zAzaJR$G!Y@7BAh3=eO-*NBK-VGwm_){Z{e$K|J>>oBQG3B|HpI-3nv-P$SKV&uLNy zo;GzmTOylzA^!d+-UDmJyI9vQwo+P#tB;+_uVH3^bHe+$3%CuZbr5Sn>)^a-4csrO zpLLC_0j-1kmCbhGbDdZRS_|hz>mVhuRw>p*MZcByONS_{yW zH|rQ#16l{S3wXE(pG(C$&|0`IT89sqKdlGNo5mjhD&|gfKsfO5O7tmN(GK$$uoHd= z&YyWDS|)m$^c8eYv?gt1J%Z*4-$Zv4ULBvX7ae~Se}54)M-m8VQ|t}UC+!cSQT5gF zK7R)NYVi3Um<9~2me!2$=JEAYRz>SbxE%i~&tl8vST<9leFj=rUmYK~J_F`LLI0Dz zz6LriXG>{+@+*LgzhazfHkW9F*5_wmyKz766MLHW742zSPuJe2{Y87+?GmmRo{^9R`{>|ORY-skf>uy^i&&m8_}^flcz_W0Kk zIwCqCI&_DPXswH_@~VfIf~gx4sk5TKE46hLFaWGuQ$7W&cgdHT)wy@TtT?JaYf=v#HGhYykY?I|66$N z$F&nz53XIfh)oK48;4`anb`-Gp z;Ys-rV+XT1Zem{GbF-iYiSx;8m2xf|mi0J?9`l;b1}J`N^ar+h8Is)rXi7}lC(U$x z&RXb|P37}YDHmB5(Dg@eC;5@&M)A|rGNT=z;=X;#ImRl!D~_=%=u7@J^alnjBb|73 zK{J8XMHa1t0pS6BUI6*i8~1Euzv4NFiY(`id>g-S~jwQ+0WHplIa`&E2Gd~$-6ph*Zw2ug@Zh)GCGXiQj; zuqf$I-#+&3Qw|44ibLGOov_*#@haYo5q^}yq~A+#VuT$dBYYY2eVi#SEG{Z8PK;0_ zMi`3QF=m87w-E+hBfy*Wq~mvv#~qJ3PB|WN-0G-uq$t~!)x-PWf8qVx-oN?%gYWNn zfARYZ-)nlW{=K^QYTv7RukgL>_pI-pdH08Rzk2udyK~;{eP`P{Ti;p#&boJ2ytDM3 zIqy`ylk!gTTTkj<)IBF~hDrSY_wx{U?7rJ;KMmlEOcJb;7qne=2ABFC(USP2zL!AH zq0aZHk<1gE@4eU*(2RPIH`~bfINxi)6I^Zmd7R|B-@x+ZYE}aZUIR z*T%u7-;a!qIF<`<17)jbh<7=NTa1I;vl+jua7RDvI|FPHcJ(s6i^Kb6_+5>^ti-=X z;;wb*kN&ED*Mm_O;`1QJj6<72{5=l4XozhPJq_aBdi-TITa4dr7$pv)tj4$N@OSD_ z{boA)SdYK$GUOXDslJdoT%4z;=VP@GtmoO`FO%2 zt>#4NJkMb%+7kxr1$0CqgyY5N{Tz%$c#U)3p<-+i=0NL3tGhw0GR-ay_b(Oqc4O|X z_}l@?qkG+ZZbeW1;;+<0I==IS8^TW<;CDebc3c-UeZWm0`df+L3-O!aJO`f%4x&FA zw+hldy&poIs5tz62>;gLeHQ+$2P8y8Yw)-A7?IXzC0MYADW>FcuCT5sBR6 zX!IG2xx~XpZh_@B308h9_H+v3Ytw+y49p-4bdm##u(3Q)LjmZf5c|9sv{TB;SUFDJ zN??Y#LoKVrEE`xO)~p%S-->!HN0}`lOW1!Q^}o(uWv^j9 z{>}b_sI28!trge{D?wq$ux4wqj_4*tb9u`S?cTiJQAc0a^!gg&y3?Z8R@ zDf^85mdo6Wdvguf!k0G86zv27#_>xcsx(w7M{qHP@Ue&r|=Y>%G217>~8iOUd!uvJ#WBy-GuYB1rN$?V?W`9_>g_X z+j$4?d={V0=kU3F9-q$_@IJnf_p?X%0G>s?m@i@fU>~!S zus1E^%lQhvlCR=}d^J1;YuTIZJ@ytfwZB6u{0lVa>)|0-&xiO1zLB59H}TDU3*XAm z<>x_m*pB-C_p%4rgY0Q`A0)kJ*!k>9b|G}%-?PWqIHlk-woT=h5RDE zm+#{j^Go=Ceks3-ZslJ->k;=0~&}2A5@LS7mFfR`vC-TRo`lQ(rYz3)d~$xJc6{UbI!Km#iLK zv_jjbzWUYlFI(5YVb$W5i#GZ7kG|K{46GjN>+fGQIHczo5Fat>Ih4!B6X=;}sV>lTf?)z&$|Sfsvc>eL<=i5I_yQ9%5bjK0@3jC7z|GV)g6 z(7$@ssy-E1{SvnievPAT{g#ft_i9|&x6W%RercM9maQCEq**3jv`x;LEOXAJNu9|u z6?IKcn3p+G*F4&z-}2G-`W813^efyxXj=RFHw-P(tQ0T$R=2P8E8RY5T2*YURA1WF zR)cD*cDEb#gKi%*?dt7=;zh0-Tp}+TT%zr8&S|xCP95r;R*M(^j-?w0m-MaMuxe%B zh9Upe?w>SW>bUFFal71x(yw#-py^V_U8lZutF6|H7r*XNy!fpjeeW}^f6>6Ql`H#v zhMaFS)70ie;>Bwkt;Go8`Kr*an5Fgb2dHdY&M7&@1Awb2A6nmpx^#I?sM_q z;QmS5<6OxN&Xt@o3Yp(IZtr{D-ftd#ubHLJaf^7-%^D#^-Imd}|6gl&0wz~g?F+mr z-RaB(LYPrz2y=jh5FjMMpf~{nGRtUGkiiFd<=v0Z_n1*pk@4byGS31*Q4kP<$RH$< zF`e{SJynmXPE~hxS6AP9zkRBDNC-jSce}oSuR2xd?6db?YyJ1y>+ExCVW>rMhjWJC zj$3$C^wGF;7DsZ@v6o$V&Sl>zzQ1JT{p1ryb@1fNMsJ)rdgJm@8x<#i`_gkb`VWfY z9X^$7J-{yYQTghK`%^y>l*IeDQ^gzjb-^ zWwdo^=#sEG^;}-}-NjB{{Cd;U_V5lB8w-@EL4u}!|a_|l8Rs)gvt zsBGU?#AlRB8c$9Xsg3nNF4Fn`iMp;bR$dduOV=AQZxq4&SiE$T_~>WGzMI82w}_a+ z7=`N$=uZ)Yo5i|WZ_KNuFHPOapX4lJNHyPnuqu6MT zNGmPQ%EtOd4TB;YKSwFn87Ib>B(|9v-%L!ig?MHgPYK*X{IZMKWe;)7-r|-0#VR3E zIaq{pnAl{#xa4!9j^jier-bp_2t8_ij{0#-Y~q)u$Kqqo4ZR!Rr~K$KZRJOo|Ht?p z$M1LKnG+s{wUT)`?a5$F}HDk`TVEmo%ESw7R=mX*M%MP>UKP7m*4I2=pKJQvTa7ijE9fR z%vieM+L6~0r_Gvn#A(G>IQu?N%{_kB1)&xruX$G#UkeZ3r+MGMEjV-Jwf`~uU%6me z@pbUh{U4oq^vvc14i9x1dCfbi_*&R;(9R1xocYWES7%w-gWnsvdf z`;Rzn!LlLDdTVxhct88#*;kH+y52bZ_u75@?4;g15Uzlw0s3;=Ip3Lc$05(p`E$UW znnP|nPji zwjG)I+?Jnve9?b;-L&YIMgR5rbB~_I*0zkiFyv9D@WiR+Na2_8KFcq6F{_zuK6AF2 zP{>|{eB?!DHkWuEZ7y(y8P1hnUor={(@f_sQS5o*&Fy1X^MSdsX4bxlryLVMkC%iv zc_$I?5BbK=+54{I(L2QT|K+u}`Ow(H^4LTOzYDZ`p)a-zzk$1z{gU!thF2W>D!c}-+xJcQ2fPE-Pz&|Y0BKp&an>SCfJra~b|_TE zcP#YBcOrKtcY)nt57-m-hJ9iGLTh|xp(lPo;hp$_g>?KN(%m8Pc`#o&pL6^o`yFGy zW9@ew`8D!*@&xkh_B+Kf`XhcCc{+JkVMYAh!V0tC357bV9AAm;QplSp&Nc(w*1TxT z*wclSdEG8%aMR7)(XMC*lw_Up)1>{}E~2xe3Ip!-Y>j;Zj)pJ#{>wi5N+B2fDjehev2dJPeGRlNb^>`K z`E~N7LNA^7dNy1;y?4`lir%xH2GbWiQzrN-@@lvSu7&I1dbj~@RHq-2KZc*cP4H9r z8T=e>hF`!faI1Z9gWKT_xD)Pz_3h-h_Whmu-lKl^!hLW*JOB^EL+~&>0*}ID@Hjl7 zt-psS;VF2U{Vvg#XMFbu_#-?Ee}d=WdF}lRyZ|r4OWOQb=Y5%cMIDyf=T-7=6&)$l$+wk->-eA%h?9N6u9CfrV^*Rv{nf2l0c+ zIi#z&@wwz-aJYKSBaa~GtLFl8q3t7`ZxI};3_ifOQ*rhm|GMu^B2R`>m3=zhhZVZL zu>~yWY&et8u8i$l=)#pfG3UUMz3vt77}1uR?iQk+8-@vI?Der2y2Cjwc z;Ci?LZdAsta2wnXcfg%+7u=()d*ME~A0B`Q;URb!9)U;UF?bxFkmr0-E1!}tEpkO!&Nz4mBUpzx?MrHDY{)jw<)?^LANRVl%d}ge#+2s3O{A& zIfb7xbe*E>6kVt2Iz`thx=zt`imp>QC=;uJTBw71NI(NLLYu5@hq`vj@}~83hOXp~ zaYq_&q;W}dsiO0lODKb~9YU@ztDW$f@) znXPiI*p+qf%bVw5-?@dgytBpXU2%zMtkp^ir$WgEs|F>emAy3Tb7B ztt`Km)z_+Bu<~Htfmwn@*RtkXG2U2qH4!H3$7#;CGcMWH`+dndg*G)viNCU}y;n`@ zJuP7k2C8DSS(cwSCg+XG`Pfa2hN2b76#%s7Y5_MfZLt(&O%N6F45D|;^Xqz)WTb_Ow=lAmbUY_5}^Ls~W zwH^bcX|^5%q-nPv1EeuPF9yh9fL;uc!2rD&AcFyVF+c_bq%lAm17t8j1_NX;Kn4S3 zFhDO0>A?WKtfU76^s8cy6*jQK23FX>3L98q11oG`g$;bWH5xOXR`x5lUxn8o?HqxR zcTlUHV1G3`01F)i#zJFp##o%uLk)VTfjJ@yqo$t1r6Ln~P4gc-pzg>Ev zmH&3}-!A^!r}cyUH^F}s{5QdW6UO;LKHSKM+l8s4Vz$17Ggq%L%@m;L8cVoZ!m|zMR;=jH3@j_t9hx zUrx|w4PQ>sXboRZ@Z~PPoZ!n{d^y3FyZCZ~FL&|f1Yb_@~%Z+@wi!V3wMWzgY-_U)Cg+fckj7}%Tf@H-EVzb$C-`?4|4x)5{GLvKUBkx{d_2L&`}lYt3tz>;SMl+FR{ka*?`P?6vh+7udKDjU;NvxXyoS~Hv-%EJ zzgBK$ir9No+S#3T?*#|KELg|lW%EU<$GwzI%?7TC@L+gV^c3v6eB?JO|K0+TE-$pVusFv$YH%mSx~ zBlly08P=C%eM#1rWPM52mt=iO*0;t;vc^cV#z?ZpNRnZF8J5@1>e^XcJB#aJaY+`} z!QzrEu7kxTSzHH;OR~6j7T3<=k}NLC;*u;b$>NeMu7kyOv$zfx*UjQOSX?)Y>tJ!+ z<`HGA?od{@C###u+9tBD4%U@qT^+0|$+|jNSCVygu&yLaS%dx8u#`0{WerPN!&25@ z|1?XSJjlb4mr%gW?sW%9Bzd0CmftV~{3CNC?K zmzBx0!dg~X%L;2*VJ$1HWrek}GI`m%yzE_G_AW2KUmp7{d5=2Y3-`hO@Blmr55dFm z2s{dp!Q)Wm$BC?SE7sYGAM06YB@3-&p_MGOl7&{X&`K6s#X_rCXcY^sVxbKzv;jXh zvC>NX*u+vR@naKftz@mWthJK0*0R=0)>_M2D_LtTYps-x$+Or>*_b@5t(1+)v)oGA zm^|yPl#R)=;7Zw;JS%pUf~+E|9bXIe&;U(7Z-G__dA)Wr0pZDrH;pxVB!l zC690GWn1z%w+-iZiJxk4ZkPC}2IqE(pK5S!m-wj$=QiQoCfSz2yH&C+c^*|I+mh#1 zRkAI4o>e8=lILAjvMqTYR>i~W;s=N*4#b5Ak+XTx9GDA-DerJ~nnxZ%&R53; z(m5CT{8-0-4Nd@djfb0fVTV$o@;^{0e>zzk$1z^{_G?fk)vncpRRA zKfoX1S@;t?2QMlAWhjoy`O>JIFOACi(x@CPELc~ttYB5aqVmyb97f_W3LAk-qiVi1 zs^&|hYQ8k8=EZT#X)Ys{TTXi!+Dp+~iq=vzmZGf`O{K(nH8j;F)_a+z+QfS=mqx|B z7;iaEWW;$jw9zHjtD%uD@m>wBbkRnhHuB=WmuaI-?DsNlw3)XpHD_BYwwo-w}0kia$#eiA5 z%hFvI+hwDO?Mi*JF*dtf8TZ)tUbqkLhX>$6cnBVbN8nL-3?7FktO9!y;}lt^nNG8G znx)e$oo4AYOQ#{v8<-_qVwP-)S+ZCqi&3)JB#TM1SR{)cr)23S z%TvmDNtto0(zsPAT3IPlSt(LkS&CGGE4N_F7}FgjHK*_Uf>XO@4jc z*}#Wvpu^FS(7Q7A1U}RREW*=$xk!Bxh_K}We)L}LqX3}96ZPv^_((EJ6 zKGN(X18{;Y$wD%VWykGz-hLV#=KcR z{~~`M;OhhYe1JWLS#E}}r`c1QuUGQ(O7_&wp4!>dhwSM?_Vgip>Ja(%(rQ|MVpHRu zD{Cd~YghZrbRkjc(fLrj2ge z=%9^m+UTZ@ZrbRkjc(fL=BepO3n9<(hV8fDZCC~)8tA5hZW`#Ofo>Y;rhx$w=>QE3 z(7=G+@7DX>dcRxmcMtdW0hsY12t8Zu)$XWALoc3Wzmwq<-=79&81udX=ktXhveI`; zkz-vca!jljIVLs|IVMVxW1Wzo3qQ*Kt-Dpf~i2V8tp8E|bMvZl%#yU}Bov5)+)L18KtP?fX89NjIM%0)PH6}!j z2~lH0)R+)8()e(cSdFi%@pU!6uEy8Z__`WjSL5p{TCbw@Dq63i^(uV*d3-$qUvJF< zx@UZOQG(?a3YGeRhUjMQgjm4A=|yf&E~n zXss9xHkYEoX3=1?XwZ5D-ydG6#zl3!rds@wz(-Z0!ET&XF9r$M)*Hkg4dRXloK%gI z>UdNYkE$v~gUzLAu-SU;v4yuqgKrx_vb?ENR9MfOI%6|nPuR=$-sC>8AM6h^;Q%<$ zcL$NP$l0XK7YoiyEG*|01SL-xa>oiyEG*|01SL-xa>oixZ=XLeGuAbM`^SXLo zS8uMC5ZNX~wh57K;N2I^)jC~8UxR;Jcw!4rY~hJ5JkbhkcnBWWjz{28cnltgCmi#8 zcoLq1r!mSB@)_U#0saWj!k^$dcwU?T0x!Ue@RBzFRiD00zM_3go#$2ZZ{%y_-^th2 z`3=XuNxnt?gM6EOhg?Q3SN9e6`zQG>`5yVc&p#kPBtIfol9l8tay3~+Ry)2%zt@s= zWIdT68^}ho$$rh+(n2Q5RNA{CBa)8W} zgXDjc1y?*{G8A!g3|U5&lViyWavYBsFY=o}P9!IhlgTOMCgfE6ZEC;G$Z6!}K6UW)TS<-Yn8s!OK^RHeNK72-mY-j3SQNqKXi8%ppVMF_%0H4)=t!?iy1Zhi2c_P?hsIqj&@hAMS= zPd#$#kaPZ=b5%J{l{-<)ys=Ck%QTnb)P_>&8F6ZhGpxcAt-QCH_crt1X5QP(dz*Q0 zGw*HYX{%UyGYfBK-OVAkbH%YtO&ZjsK}|AhvPw->>CIL>*{T;?^;W@iPuL6ghJ9dP zk<@JV91sdL$+YXBxX!v zM)yR+v2YxG4UV_p31pEOlbEp)GbS-(3ua7U#zxH8f*G5lnB*#-T@Ba3wQwC=4>!P# zj{6b(7=8jb!B635@N>8segU_@t#BLM4tKzva2NbiyM6_~hTp*5+VxwX{|+|Jj4hb4 z1v9o_#um)jf*F&TF^L(Im@$bNlbA7y8Cx)83ubJ=j4hb41v9o_#um)jf*D&dV+&?% z!i+7Lv5CzjO3aujF=L{{j7iMcf*F&Tu>~_GF=Gp6Ok&0s%ouX8ffV2bhDmIg#D+<1m}H$vY?x%BNo<&8rAcgBsOfphDmIg#D+<1n8b!jY?#D`&DgLJ8#ZIZ zMr_!O4I8mxGd67Ge=lIeBp-YM8z!+~Gd66&hRxWp1sgVF!xn7Vj160`VKX*t!G_J) zu!Y~Q#)gf2cPTb(;=fBH|DEmo;KL#I34UCRe-b4&OqAF#i49w@VKX*t4D;J$IV+<|%!p!c-ey+UhCf>ILz?fu!SB2HeOTL6 z&F|mk_o>)?HWP9K#q|bNIIxwUw(`?fe%i`UTlr}#KW*hx@3QBxRxYfQYh@#8{r`r( ze?vcpbwTgyzjyUtO5dgQTMGY$by}_Z<_-N4)?J1*m)2YQ>=gT+24@@j&Vz5m5B25k zzPl4Q-i5u-)w(qHPDg!Xb%|E>V#6E;%tb9bkemgsA!%g;hRbPbot7rG@;xnV)xt*c zUS7NxRzT)3R40a7i=hTERHxRr>+dERkuGeM!!kK6lfyDOER(}BIV_XIGC3@h!!kK6 zlhY&b(N9=`(aGC8#XC73o#V|po}A;2IdMuakIacvdU<6|oYKoPbK;cVs0YUxt0urC zm;zh42DTM!1KU9uVRrO+7-d{(X5l&3onzTKR-I$fIo6z`fh0>_OAGI@0< zorBTnv&efa&NA21LXu^ACIWc^d5V4Y32nT`5<6Wr={7d6b-k?H_`H@@JnM!AvT{p3 zG|;Js8})3ho^8;Z{d%xd4<@X+3E85SXz!dod+gb5&n|nm8^@>Ev(KJw?72s7X`;Q? z%B+{mvX6B)=|l)wuJCJgJIlAtcMWNQ`$&&+r^J_i`W4>rRXE1`W687JM|!sPO24!H zgzeu$(PPHB|8J7}45zprHHGJlFJ&~xi6X|k6SSDw?Dbur_c_QzSaCKzwnzLdPj@&M zeyB#FcGJ{ubMH4V)owero2q7IYBo;ID%7k(%_`KaLd`1FY>JiM6Vezlkmr&=^!XNQ zH${0zW9W;^-8bt?<;7!hE?WTn&i$tJsfbacYp(`V^~fQ{N8tt%^pO;`mx)?{(ML6ze@j{Wt8HMV1QX z=e2v1UJO@i=9TI`y;S!-)nqGmpB~lyY#e-^UcKEhlO6f5u=ZF-Oj5fRSAIei64o%y zcl-i`=iAc6}?yv@7qCVTwdB;0%V5|wHsHBVby2E+#-c;=h_rlEO3-guwRcsZq z{3(nSRv4e{sPjC}%c{Z17W2|E&J=noFyPi0a0d*yHIAN&0e8fJ zQ$L}Pi|qG9rECThSXX%V!H{OQQPOlJZKkA&O4>$A6E{{;RG&?hGTDBi|3iH?DU}lH zvyD>rP|DUDD+LRe>DzGhhAktiwUUc5V^}eo=Ud_al=pS)o2zA3h_RBr)nj7B62ZRuSwufwr`0^C<{5j3_^+qb^H-RqK0$9I*CeMX zXXKjX-bSe6wd5({*Uze7h)d?UHd&nCRvA@3a*o%WqfgCN8c9|chjk-^Te$gxA#_V4*;U|pV#6~l}q+<{iSA{lb1eOlA3H3=FCV^SjG z=zoQ=#3|USci%*$gmtgz z?TFcShMB%Qkd+?p`y*fhEb_U2^z_W~_z7^L&xWq<@jCaOjCXZ!nX7xtMAqZPzvJU) zn|q$){kh(s=l!?geD?!hppO@ddDhVGc$$5OR+ou&*3jedi%ZbGF_*NG9hmdUD$+Q#rn{ zMCN6QtjlvUE=y!v-j!kbKvv}iy|qNoERmI1g4O`q>nvd4zX4}LMS zA|d#G_>J7aD@BhE(Mp(OrtFoCJX%y|ukNV4aQ6Am{#j=atJ6Zfx33y(s|F$7+gc5Z z@!m$ubHv!F%)n@Qn*Q`yEW}_TCJ7mtz<)#0VTbyzA05^zJEJCH^>wwrsEx+vEWQe@ z3#=CI*9~*+uudY3VSU;a;<0c&HTcn{+7d?ktP}&Sn!6dH&|@2(oeC($ofWG-jKBoSyq@^=F~An24QRn zE$yMPaA!%Lt|nmJVhle{kFMl_U8TsQpV#H|NmvsUbiK7c`HUl5^-EZ{^BKDS43BW{ zq}9)1HFH?WTwL|ruCI!-gEdO+F6k-UrL$IDf?ZXsONdh3$r9Ps+S1759%Xxne8|ZB zq?ik7P~$eS;OKeMC(VyW=0*((w3~Yyss^* z^wV_2jq<>a^1zMqz>V_2jbdh3kDV#x*O|lnlvKMW#7j3c^jj|UZS03)+YZOO^{CAVFYWGW;T~4EzXM_AdRVm{R;*jC?y5wG+-ry2Ylqxx zM||iGxm`pGyTKl?C+rRG?lCI}R|-~Z)oQub4y_1x%Y{sT$nuBQtk#;TDL$myQ} zS{tCX9IfSOEk|oPTFcQ|j@EKf-~H=%@Nf8zgiS+_4_+R^I}`y(-(lcCd>PayQrm_JqA*UkI!4X2HR52pncMFb{&R z!`adhWB3W&1V4qJ!O!7l_yybox7znMxE<~Qk%cQ6)vjc$zeYMo zo0)a4@4RlmH{l=f4lMWmKjA(206v0BSPj*_uZ4POfF_@{Kr41?Cp%#cbVCnhp&tfd z5DFrnIF!Ly7$*Y4mprqYXI9IcW@s}*n;F{dqRlSa?4r#s+We$7(|x=($6Lc4gT?Dm z^OY4=uOCC3$HDPXycU(?xjCy`cjaHZVRfscXtak$duX(WM(b#_hems7w1-A}Xtak$ zduX(dMtf+qjz)V*8eL1HSsLw+R{33}+^gXlxE8L1>){5t(Q!X=+>hZWa1;C#eg;2> zo8cF53*2ho+u(M%1MY-yhwU%LD!+nX!*8ItLa&ELJNRb@|LowObu?N>qjfY|N25J7 z+C!r~G}=R>Jv7=wqdhcQN27H#T1TUGG}=R>Jv2IwMtf+qhems7)Jj*QRu7qlei(p3 zD2TA)PzGaRoYi2Sr9!K9v|2~2J+#_GtKpuq^|iW|kFMpTYx(F}KDw5VuH~cs@vuTI z+^b;3;-4M-v#zAoep>CP)$qiDj%dYMm^F`?9Omb-$&XHbOMJ6)ELO0Rr;shYTj(v+ z7d#)q`%Iy$fOiTX6y7hqS4jD+(+ITDKP?>oQ5%@AR=Z#;LGh zBV@&W>-`xqN`HlpP@kc#^(EdI{&UW(y_0Gmo)HrL`6OG&ZLBWFj?!OY&^$r^3~xKK zxUGcYy@tLWE!Qo-Frdcy=;h9sk@AX1tiL_FoRRm+D3;)9Cf=>rm!DjQh<*4^KcwlT zrm(uuMnl@Ag(;tT9`45eTx*CGo?#O!3QP1}FDrSjVCA^2@apney{o^`AJ5vrU-1lL zfS}veqjyk)aHmk|PYnk`pKs`|sKL-4b+@9~acyd!U0)Lz^b`MZQ0dRnLAQNjGnBwm zJvS!wD_waF?e}r1{iAAFc)IXJ;jO|Og*W9MqCd5I!Pe{M7cuf3p7oc)Q-x4(^=a*i``wXg;v%Xbem`OecICC-MhS?o5t3R z_7D3s`Zn^ra8}Q74^MG_-v7TA{n_s!zl8-V#mce5pS9+F`0J3ai#7GlC|{tDel=+< zH0!65pA~y~XzvZla5nAtbQi5!x}iNj{jyE`a-QneHD6X zbnPQcEZk$y{=)LmyM<~q>yn*}J}$i9Si2lOsP{@twmq6nKW*Pn`o5^?!td2{ zjf_O}S8S`cg}B3?z8bcm;vO6NUwA3nw?6vc|7mQoehJ3kaGrPkPlf-Z{|c+Tq8g0W zLfB*7ZS(dRi~5KEErpl;A7%{i|6B-nu*4$k&W*IkcF3*{|3xE975g2;fiDh!9KBIO zSnnI-Bf+cGxcJ9f!d-2{e^D8$qB4?&zYc%=u{TD~Q5>;eeMgOyA3N~h`k>ef7Alj& z^H+uX|LX<(PuSSHXA4{$7)3p@(R0(snia=H8{vPf5T3C!@)xejgjd9GEYcMR9JMY> zcGJb0$Zx}JXT87C782qCWjv!F8i#DXxI0a>VZ^|%A+A~1_XkFoVUK2b3tN1I0VAG} z*$H-aN#UZxca_v*oYTwe{;gvl$x&w*>xhy*itH1PEAB1J6D!;iZHxMG&}bV=I=Ag; zB&cBTorPzE2kISBL@0p_F~Hxwzgc`{HpsIg&L66o7MI2mpOmqWfx@fNIfpH~xM$>* zzYZD;v0xzo=0q3dP(V`z_})F+)HgAI@SMV49O{HdtEK@X|*jt{fg zPyGvC?^qi0f3=LlC;W|$cSd$8jW2)HOKS>$8~Oa-c~^`%gU@Nrhx)uvpV066wWqx- zZ;VEjb?wW(Q7@IssC0Y}%h1ms>(flcJP}iTELMp06rv3p`DbJiVYay*V-B@!gb#;4 zA;-v~g)4M1Iq~q++^Oa)V`PNGwb5O@#(Cb&3|_mJjN~NG%s9kV|3kgDF?*XQ3%AI1 z?d@GfJ;lnj)4XQ7hVu>C&hS*vgQ6#S&hiA!J6(CX%iQZLp6~yZUo2SSsh;OXPxbtc zr+V%Xd)rey=f*sn($%Tv@NCamDtfkOMf4=w@#-};{!=-+p}&!LJFA14%Lf0ZtLwUd z#b0v>JQUho{6&ZGF8t2R$S*s@8)7wD-WX%-@x0gH}KiWN860N9reyH%aqu%ENVljy*q}~e&`ii64r}^*VO39 z&FFOKwWX`DTb5p-1>qHoTCkH=gjWpqEWP&DuDyM-*)ZacAB{1t)s3-!rA(RYqg+3Y z##rYmVtaC3RM;M;KZ`4-!m6nqqW2@m6px*tc0&l~3(t-o!X)cQMnk3L&jV)Yi#<1p zP3UT>HU@3)GmLQLW>I^>xk8ztjF10?qlXasXiIw+OWT`WZtGbIyRy#W|B<7^uY~;1 z{cXpCi~ccUuOsiaQu}p&>uS`Aw^^qiTj>4Z`QcTR@zPdtJA79BC6pM?iP2W@gpt3X zxo~}CijOAH-i}^7=#S73Q(!!7r&p)>esh=}S>DL;AAjf9kvH-;;yqiizmeBa8;UI% z`aedSim$+V!E3@RSX{8P(XS!jnG&@iv?3O@VCeIh)=VqCrfc(b=N>f9@}=xhp;~ zej*<}KDOcK%!@vG(U@4-dFNcVI5z!T9%~=l_QFffyO0NmZ{*4J-O%_Ew^gCuGyR6m zlGxwl<-Q4fh2J*y?E2zw#2CvQ7yTBE-=G<_$9}G~Ug%eE{N~okFTD6YmkoTTyfOL^ zNBgyxEA>q9yl|dSmuc{Dv>l_nVAa7cV}42J|HR^cMdmxs{@wU@jh*4x@SE$!W8>Bq zoNB9B!ce`px6*Oc6XX59%Ppl}f{91En(P;e7R1hso$YztSH%8r_!XPs634K>iP3M- cT<%<>evd}2%0fGx`9HnJ_)VMe%WARz2PVGQp#T5? literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Light.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fbba05db835f2a014c5073bf8a0f884c50c9dda0 GIT binary patch literal 57600 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

UZeaj`TRZD zyU2R(X_A9kZMbAFFtUkA9T?df8${Zd`0?T4Wat}f=`*)kGDY-U?`n|&Mk4+qlkF^s zEUIekmm2>?>Bv-b^q}-@9eqZ$Es{qTH|*NMj={UoqVx{5!oO;9VA`08nz}(5XFRgU zXd%Duvo`y2)&^YJiGmUsCWS?_ei#+qs!5^;o$U&$4 zPCBedBD%-b-HFI_(-$uY=7w#ZoyXH!@W^+gyfaa3Pqd^rPpPqyYTueS+_P_rT=eMs z;S$e|Z-d2EQZwuzySEyr*w-()j|TL6WeGp7_4*Ih_oMcz`G-Aw)zlJ?j_>G`>V5h5 z+>%`#w|nM@tBZkaZFqoimZr`0W&F8Jv-c#y7yF=eJ4JbUBXtvky(#Y@iDR55R@04G z5=6!s9$Ybgu2fu~Tv?gmjLXdo=2@we_UhVum~+z2A^4K)=pMGWiE}N0J@7Y*@=P!%Tpb*NA=Fa;p!Vk z&2hX*VRSqaQ{S#KVOVp;2^#ql5g|#ZRtkuZ{f&%%gU_u9CU>f+$+;dZdn=LDDYE|Y zf#+9NiXD)wo(Tul2dk2L*i+%4|6xyta|YxLIvy_7&}tATc%(nD8q~8f@b~rEBL1t> zF@%c$;e^b3Ams0zl6g?z!Hbo;c1x|mgL;Y+-u1tAj#C8NH=N=uXFjm>x6X6Q!7A%GJXG;4L=THYg*iOj-rmtkwPM2zgN@ z*g6VF%8lB1Sl<5^*-<5yjlL+08*-4V-iyE38$ST2!juv6xiub^J{T#Z8{`yhK$L@( zp1&Y`B;?_v-NQ*Vd6=@X0?^Cc`B<^H0#uX%P9}?yum+2>5eD0n3m*%dYLSc!E-hBPwH|jdw|d6>XpJI5iL$xEkLxv-0mpmIG<RF(H|+ zynA$MTxm)`(c~}63qoVYB{^r6T)~qlH7Cy31_j9Z0h03XiWGYpgovhtT?dT`o5{gC z81&LX3fT2(28My!mq`kl7eP{4-(|2)7&T=0hZ8b{+@_dDZ{b<^eBPAh!;D^>f&*OSFN+`< zIoMY-@-%rmZ?x$5-9w-l#+&0e7!3EWXGn$tAiQt4u?w8QW4EzE%ekQLcZQxW!ma(A z9dYtr^5uk%ux=o3p|xkdITkC7p-i z$9?AMW$Y!$6F~$eP8kht+zn$@&Gwr|$T%00rIwUYLKBGwUe^<$! zcY4`nBtU)oX-Drbl0U93!nNSf(8ZaF?2%#&^r}4|X@K;R#O?Wz=htrM9xA{+F zD6E?;<;(cFV$6ss=>B6VISrv`(34K2?czy7YL*_2^%5j?RgYFZh9?WrAI6a4`cWQ* zXH(G*nsm=3H5YXl0*xqLMY3!#`E%{LRPI`sQ^<{I8uY-b)zS2zD*dx~Y!yAKibuaw z*imRJjE#;ei+;85;Z;(1W;Q*us`p&=DOO41$yLffwFg+`v}I)Ecs|SuBSl6>_KC<& z$FzKoB9Wszha;}2V@>Q&el6))PBnYobI4ey%%hBTmC!@X_~l>7iwF9!B0b$lA}`x$ zk#Y^Q8j0M5F64j{S@YCqWg)jRMo62)$l~szqVD2*V=H6LWpUD5_4WU3XxQg)Y_=l- z0P>6?Ctoiz)geO9fcaAihbG*3YhR)}{$XEgJKT}VkFXQCgJdL~FvGR#gN57)Lh~<; ziB0!=;2d47xphGz9$w@~%a?k>yzkC#4xP8mPtNe|B8oKw>XU#vT&&!L{wD~DJT&y! z0)0dt4zcO>Rr|$8brj{UEGmo24wADL$z9nNv-F>7UV#hpOAgFv(o31T9Ubdbn>nES z0?<)B59kH(*<)W=TCiC9IDgC^0p9>W%;z#cmA8iDL7R*TN) zfOjo|o)ct`eLo^9|MUDvQ_iOB*z9#Zc%V$AL5`am7w;2N)^=J+gs<8BqAfizDC2SH zkv=}*ly!A9dihg~4^AaRo_HdVI3nJ+7fFtw82T(cZp3&-t>hOUm18f-SyfyflNIQd zu8#?eiSy&5%!QKoRN2otzu@NPi9T|s{<4Gs*^yUF^X|Hsx!4Elyq9sZm5wy;7kf@S z`Pi;vFS54;y^-bB>U@!M5Wb})Vx(Ed701ywt?OY@79Jm%rf~kCyoAV?3D|zc{lKqN zB$N4{@@2j`Qo2k)XaO(t#uz}k#Cbd@_aA+fJHL-`Ii3@B3HuMO2MIWbr`vOf(rw;A zvLz0BG5a0k5>)H_3##2y?HlK&+MGZ^wONVgJBJc2Jqhj-_9Gx8o~+Sq3eoI!8p&cO zhh7!*s!^=tloT5?9L0X{R|E@sitZa5DAsfeirq9E#g2*>6k9qh!D7y0p_?hvHFPEl ztCLJ+^c*1_sqPWu2PoC`MDIa{Gy!+ipA0b^G$J4!j6HlqLV18^O z`7vcjLgsm}K0D=-g)Ry52D^yzU2vUBvPCo_#> z?k>CX{PV9YyCL7^$eR3U-ubIj<7Xu;xz6d#0<3w+De)idrG?K0%bA`WrX`giCV>u- z$eVIL{p?!{QQ?^?48(jph0^7PUVaTR=v^_slV*3 z$N>M`aI><(JpGE6i_wo0gE}Eysz!6#@FY1r&e0;rJ8xNeGk+`kQeK%UE$rQwDb4PE zSIpTw>`i|lEzX;KmOvZXANV<+m5t-a$6q72oV-dvW{XpK{ur2af|HTwafSCQsrd(Zobpm`>j0d$CZ%b`ADJ`wA0pFE?WsHkAZty%`z}}{K#j;7D5!$Mq$m%tNv9w34L?10Z=yXk%)cT(W=~Rn zC^EF$hkV0>tD*uZYkOn>(zf5@`2n+1>H3C$FNt^@U?1CR68TiD@EF;gl|R?ym2A1( z@yh4bc}3^lXvf3ht_t5-u(9BZ@Ervk1_MqtHy-V5DW>~)pmeTg_Dvh!aqvhzz1cx2~yxc0LnvhY%!>Pe^94fmwe zo7nSmDDedC5vP*+z|*tUN1PVW^G*|Zn0DvG$11C4Ve;^-r0aPU)(l_+UllPE;#oo3#5-pN4d#?`cS*T-S1k9Q-$)(D2|0PiSa8Ky$#xfb#?14frZBK5%kiXW;392Lqo8JQjE|C?=>es5R*H zpv!}92znyuwV-c<^}+eUi-R8sJ{IB?k{r?yvL)oEkat5)hL(o5hHebKCiKbBBcWe~ zu`p9udDzOZYrz*;A4dg7)kUq0+75Rf+#hJe+tm@y8^eq|r$QNli&BlJ+JYOgfq@C1)g0PTr7wQ}Vy8vNhkj z$hyb+LP|hNLCW-$Z7J8Mypi&2YG!I%>XoT)q#4qtq@ADk3|@bvN2Hgex1?`Qzc2l} zjGzoh#=MM6GoH=p%}ma0&fJ>$&&&_9bXmz+W3m=zot<@K*3(%ZWy{%#*^{z&W`CR$ zl(Qh`j+`HJt+_LEyK^tky*2mY+&6MR%srVGndi)F$Xk~b7%Jm>h) zDI>qfLg!h|%bfQ+KX)nx@dfn-tpyhp94h#|a8%*M!fl0D6#k>|wZiuce=aI5YAd?3 z=#iqgi~dt=EKVzS7SAj0D&ADQv-qmwM~dGm{;K$ol8lnsSU9wXINSE@rUeOef=hm3 z{_>Z!oc?veYVy6ZBY7cKms$DRD+6{*20H_-Jo@`at@s4g@1y*OweV%ER?1<~C}UB~ z(w!`W9cH!cBy*so@atI-zAt1)STcVM^6eE?$9Lnp9F~r<3Z)LE0wo2d3dMmk5rwYF zV6VbX@FTP1eKATUN)vyQCCjhly2&g`TFhD`Gb@vJpiV&vL|M#Ar0Wsi{4L;%VPTRD z^+&8luEuZIq3pr$leBsv>KJB|f>@xml}(WpY$5xU$^2)G!IzEa{{Srh%nlovo!8*HUchU_xs=zbxL)FKqyB(RLjU#jy%a32 zugAT1JX*M(zs9opEIh6+5V-jO^$Fy&dK?yx4`Hcz9?yQ54IAPI824<^e~rNX|Dl~6 zwg_bs3gKlGJH{sS@1YTVif4%IU}by*D+F9w_^p~g0#{yvoLKJ#yTg}grCrR>HwQEio+SrkqR%uBo`vRNI@-+#u7LC5ikyn?F%M!6Xdbiz{6B+v zNJ0HB%4bp>=FB|@G!LF7hqZ~%mXbLp0Wll3wj!<2AzxX+{J=W`vS)=W1O#`K8E@j>d#UC8*>nVTA?*TbcuE0 zi_b4fd4L1-N$UeN=FsXy=%6j^XVCqpjPpe1FXoK!M(byA9l^$nc_UoX{CU*!0ahZ< z!S`5ap!G3YZPDsDT6;wQBh|!l#M;3636ZFv94%M zi+OafZLBY`#y#sCmgJsiqHCfp>2g*o#^r{W;K7>3n)(l|E48qx;0vMrQFcE*e}wWf z)|ScL_uyL4Q4{Eg=zwtMhAo8o3m7-C8m|?wy1$Oy>#N|Qud#gI4(s@0tlt(EgKI2U zqeZB@VFj;~E5L74Sr$qiV=h|Xktm~3Qc>u0EJ_s0XcYR*hC;u^qgYVrni!N66#AX` zdaQICn~gdHB@e|ZzRSU!5nst+-YCRFW}y%ta+fi9UqCd*ZbQEhF{^Ys#_(Ek<`Q90X7uu zjYRFmFGM{TcYEWSGuRzG7f&iJ<74?5{9^8sMoG_0AIOJdx5wTddr$1MvG2tG9Q(UD z+#GF=H7A&p%{k^GbB%e0dA)g;`HuL6_~ZmBL6;Dm5S9>~5Sx&mFg9UsLPyezzdru! z)7YaB9M`eCcs?)Wm3%yU_(O`6o|E214_o?r_$l^;*l4>gt|whjxE^;s>UzX=i>uO=s%%!ede8s(m5*=z_{NVf`gqI73qGEAY}~QB zW3|U>j#VBjIF@tF`q9ace*fs_k6!<%^`jX_&p5jA=&GaLN0%O5bhPzo#nIHG$^ZA1 z->ZHv37laN|Ns3x$X(m-@j9P6@MrWyaP9?L38;$Zjox$Y3QlV8@pJ{ApuLx|W^%Om zULMzYvo(B)_PvfJf)}do1ah=zS>jle=Nd>0&F`diZ%3 zLq}M|dN7A6tR30g%q)-P;8h534ZX|7%gpBCS~Kh$?Rd4Z`SAZN$DM8XZa!)=tHL+S z@ahm(b)!A{R{gCRz0AYsPV{NUJ)QX8%vRx=)uN?Nyjz8Dy4V8zKLNd%(MuP8?Z)@i zqWa4;w6O}`wxJ(ty91vH`cC+8%xns-S}v~c9}~6OEw1Z8y$0{*oWA$4IE?%tmLs`)(kDF1zw}#VOmn#$@FMv8rq?8ECzg? z=)tq4CO~aQu4kv#I&??OMHhOf@pl4Z_w`x0hJIZRXqKWyx@H0Hq7lr)JY}I3Dt0^} zj%IA=7>7bO6@3v#&ERs>8_@t^aRJ_~6{9BHt5;Az?dZ1?*Ao`azzoeJjm?bf7vUY< zJq{x`vx%TBy4JI0!fbyF8Tf5D%n)|WfZh$+z<%A(v;i}1XpiP*9{#7k*Wxq5K@>*) zR^t3Pz3*W~sA)!f096rkYiDB&?SOkRJ`?3-p-@{{7<)J7JR9)WVI2R zq$PCkQSh?Hpv^dpI3D&@3*!Bfz&ET|+o_1`O~*bZ6XVPl>pBm#k`Ib;fVK*--ittA zC5T%oW95(>l~~i&kb$+p#TeK&#M@P+xcuS+sU40A7b}( z4J7a{@NE6c4zN4f3+#Dz7v{H}T?k5h3A20{ez8~Czu3!=%wK^{--M>|I=dTq{efM? z-iDXv2xjdY_8r^BmH^*Nv0j#e4zI(^uEcE9I$Vu8Uju6Snyq6Sz|}Ug)7d8WAluJ2 zLsD*GXF~J*o;}QE?!~>ij_bJ(>tzb}<$l~ByAT&lJAs@YAVB$S770}tm$oWwNo zNFD{d&M0<*{mw`87#_>xxS7ZE1a9GpJPC0dRu0XFr}1?52YZKS@Jx6Zvw05Wa~`)r zg4)@~@J2fztqUMci+C|F;iZt=<-7v2wTf4>d)PmC4X=gmXbj}}ILO<2-oPiYKOsRr zWuNgzK9M)^NqjP&!l&|PJT|?BPvLCW=GkTyqmA$J$yA^!`Je4@C|I> z8~G-FI&_Q8>|S;sdw?Be&#-?&w|tguWlyoQ+3oB(_BeZjJ<7Mh-nEr)<7e^hd}GZWyOdqV9)fmp3BMFJ zvpsw-o?y0*U%{{BSK*nk*XUPwF3!oR%+XgaZ)@-F>eRQXwXSkrcgLCzU7M)%m0b(F zIy;u?+tk{>x_xnX`|9NjmUXQ2Z|{HaS3SS0r>(ucqqE1az3;8Aro9bK>*lLf4f<*8 z(bsAnc4!^esvUNS%CENXZoiJcxB6NQj1INd)v7Iah{}IVKOp`K```PG>1)7mVc*+; zG3{N;m$#|F1}yaW;6JwiUjIe?@4d#(YwPw}g#UEodKNF6-=SM9D*ZTZB#X6?j8jLl zSVi494d%rf>c;oC=)a`@eL%ej2mwnyKIj_S+E@2<=$45ppuyv(fMp&ZbPXytmZ?>v zdRM1t& zx&sz;t?ussuy{>}`-A_g#p~Sf16P3$b@qMgSiEpikNZ+a}W*0G>R{3t$k6H4e~@I0)#r5)&A{W(PY+;>4BebM3mIY@l!`;k;Ch-vIi zgT?L+51kNy^dwi#_lfT~zVU-@RKcX0x`wGNXjxlNCv+>Z9mk!ttA-BNzGBr17PPdZ zyOUxR#GRsT{I27|0)X#)Q2d~&dEtN4p{W zE`)w_F*GKUfqS4a?Spi@5_0is=uFqLC!s$*3vKBIXh|u2a$zaduUPv|x-XfiT%9X)g$f9N*BJQO+&o_z>yW)w7-cxW$4 z&|Fdx=a~s@C0A%FlmxvPx=A_ol4@ujP0%=|ll+E+_K?p4j}r59D2z+93A;Sa%TM~& z%g-wV{wj0s?i?j|w|>0ug?R1B{+I7-DfubSWd->?keZghBz;L>Q(8p2c$ZZWI4!Fn zeNWbstj9BV2OZBIANp|4%*^KubBzyY-(@|JGB5Sp9LcmSwIRJH_1n~M(@N6kruU@x zA7-BwePPbKnLmtrJoVdHb8J@bRk5wHALbs2J)Zrq{#RB| zN`6+5`XV?IK2JEF@?83otb+bm=5F;h(0%TbRgja>SI}qr zp7aOZ1=zoIKzTgq@F+1(h;&~iie`0TTCX6C$0GnM&+yU<9*NT?@j5iQV_eFeAx z_A=Bvakm00smhJa-Hrd};{U6159B_Ymz;MPueWVu?XjRUlURWaJEcIZ!eH!=bYeH; zhkZ~vc1|_em84=f(T*L>a=gZ1SI~u>%{sisVGpngJDe?8TlH972XWOyd^Fn%`Y&Xk zgVJlTN*dv>^%pvFJha_2ur4kDy(fa+FU9)UgI5Z4(#v7j9K*a_|6+b9$*vPD4J8jH zAI0f<3(s>u!3tgPBR=1@jGhIKkR@6K3`z0usqFjcu2W2nHK9nm^ zu0**Cmj zP*2Bo7#E+3dKT(Au9x{d*!{7ab$!gjTu&lS@Mm^5MsO!M@7>t%-UANt57$rFnI*e^ z0p5-SZ^wbRPaY*@!b^EQ&Bggo`y0VEzLkZ({&Pf z?Pask=1!DL(B7pem!a%I*^9CdWk0StfO0*`4JbFF+=Oy7$}MR3R+QUNZb!KT)I zMbs~${uk<(QNM!vHIz3{-a>gBDMqpb?GRfYEx@!KSnDJWC%c^bZNLBYI$CVH`MEB;?=cOE5KRp$vj zva+a!s-mcp9h60+1!QwWENK{foNl@m+!axz^-SAthjV7;kDfU_oMEl*ndxb@o8~Yx zDlV*o0-``GBBFqTf>c&zQIVMunGuysRYYZGL}p}Gz6{@delH@bGHVg->4@{qoAKhk z`|iEp?{B&Hy?m*MSHYj=PEC9L_wrGHJz2x`IIb(W9{1F>8h*!dTfyse?ppg@2iL<5 za3kCV8)@q<``r!qz_;LDxQ{3J4zF;(`22wJ`mSvc!S~?%@Gv|IPpIQb_!&Io^Dp2z z_!Ye1+%H0p-?zY4*am$tpnXLcf->xIzPf%)xjwQY9XHP7#(3QLjvLcyV>)e2r;X`! z*GajhU8msbjmGiK@D|vR_I6ze7u)~s_W6L{Kj`-l!4>NMVs8C!b{efstfa|G=8f7; zmNL&$=2=R`=oO9LfYB=&y+Kw|WhGUkSY#ztBRRlIsz!5!m5jHoq{&L=b033i)qNdY z4>!P#a1(4yf5C#9ENGqu&9k6+7BtU-=2_4@3#zc73Ja>Rpb87Bu%HSHs$iywnIdM2 zm?>hWh?&!|as*b!Sx^--Ma&d2Q^ZUWGeyi4S7Fkmhn?-C6U~>SQMQj$aS;S@$n?=?%kI_LEHILOn zRyB`VIh3-j+#$cKSa;iHy{+!8O;%T-piLB1q@W_pn`e3RV&nzsB)@xB+7Oj0J~c$6Ask0k z8Pd0g2vHFoDm?!XuRp}&S9tXy9(~A)p_oC14K-BSHB5r ze>>VyYDebDKHxKNm_`2&)Bfc=$45l*EBwE^$O1m*`)k#A9b6ALz>RPdgs1x(?f3`h z{YSVN{t0e@Tj6W=`8s?9z6rO(9dIWcIFh}Yhg`)Lk7kQwY;nhLiDp%{SY?Ym+@Wl82byO9c;4Rj(T-A8Bwp^j(YWW)Z4)(cd*GF zT}S%vDEl0(JVtq}@;K%3$`h24F-5j?D*HVRUJGZy>)>oSSEdtL(wo$EK3o7B(mY$u zQ(~U2=GkhUt?ugjH_EpwBa6DsG4Fx*!Tas=0oWTYC$bFcDu2=SN%#~!cJZFw*1lKs zX=~Gaa)*nI>y+zdmZ$PFNNEAq~Yyt8;3z*B;! z0X!u*N^lV#VgMHj|C#U<6<(s!^-+=eV{lb^4^HmE$vs`4_W5Q$_m;H4dz5ky$aE{% zc?LU0>^y^=ExA|nyRU**!>RV_Ha*Ny^wNh~#CA z6-4qfPckf$kMJV1yhwu=ndL=hd66k>mU36~m4BUiloD1;SS?|-gw+yOOIR(uOm1Ap zb{X4cY?rZJ#&#LoWo#F)UBGq$+XZYFupJ&{IgfG-k21ugl(AmGdI9SNtQW9ezcCK8YjskTQsG~p~ z1?nhJM}ayDS*|=_93x*YDkEneQbyifR_<`MtilWKat*EKTy>mGxrZi~mU)yik5cAQ z%I!S5(9WX^?L4~B)yks_qWl<-Qf_;cSsrDWN15eOhIy1(9%YzEndMQ2d6R@U8R1Pv zc#{#{WP~>v;Y~((lLl`x%bQH`CR4o06qS~!v`nQXDlND3?E-Hy%bN`IBn_UV!ILzo zw@key>Mc-jL5!Q_NoJ|HNWDeseTI6Uq26bxx776+-s%g=FTyQy(OX5OPgCz!Dy@op z6$-70d68pQDKlncRmz;C$jB=@@obV3w^QOU6_zP*lmcV+RTZ-;Vpc`Ws)$(?F{>hG zMSfVNqAC?tsi;atRVsQ*dtUfTDr!(rm4d1iRHdLQ1yw1iN8TQ6D{TxEn?{-lJd@Fjzo8kC*X_>z8% z^(RT zvG@WjTW>XbZ%ZGev?i4`sVr7zn$$E!Nn?~$rJ_*^NhlSWB{V6aiTP2?k779Th9-t1cW7cb z@`omdBZp{Wwu#v$W}BF8Vz!Cd1hWZd6U-(UOfcBQVB`)>3`YLY#9-tQO{_IB*2Gp5 zQ%y6Gr!h5U&h#|4rmU#VSy7v_qBdtmZO)3?oE5b>D{3W-RplU$VQo|%@)&j^-)Lf| zX}0n-cBaf&N*Jn|v6Qe>HDf7Zs>&ZUG1QccJcgxF`N(6K8nwdqLn~}QbRWh_zF=*- zndjal@7SDM&l{hL%g74PPq($R!in};OM_pS!dQbRpTk&#FNnM$FK5`!)(dimf}Eis zXDG-S3UY>moS_dp6WD2Br-7XYb{g1eu-nVpGm5or_a$sKu+_j;16vJjHL%rSp9QvA zV3!4KH89n{QUgN`HaNuwr!dvPR0C5DOf@hS^T0V?d5%Y(CZ5<(M1B8s-GAyNTD`BxY_F zGdGKwn|a{8n7N&ewDRz6M!aUkw;A!BX2{`@t46(K)E{9ZvqpY98`*5+cge>S`FKC? zJj-TgurPy#87$0TVFn8`yz%bbRlLmSjl{L;x(=>~8{kH`2{!V`Us31R)bn-t27D84 zhdba-xJzAk!#(gVxECHUkNU3iA^0AAA0CEB;R*Hr#Bon5f2#bM@+svrzWW6{2fuRshtZl>EHmprq=Re%+ z;w)T6v?D=l5&v)%lVPqh#dr zGK`YZ%gZoIG+h=G#$*@+;=+))P?TX*#D-F~?r|mCxz@R^gX`f2xDjrGjWUqG(T0Ce z$3Mc&@K10H+zMY~D_@6iz&GJ`xC8ElyPW@SxCg!k_rl%`V_Jq$!cHDLdF6GcW#Z z$7mj-d5q>Un#X7!qj`+F*9!XeqX2_Yf>wrcteHrx=$B*}C0RyEmQfO;%Gl0}QDuzh z#i%mY^I}vP^LbfDNtRKPWt7@kMp?{?ETb%LMV3)+XBlO&YfRi4lVuFZG6rNB1G0<( zS;l}YV?fL*idUt5);30{X^>5hu*pGjtjsR+?JT1#j*W?7Me(aBb`>dYke!aO(>%51 z#jldsRkD_`n!+yT$*#iwDpvU{tBf_t0!u4U@Us;BECm-RxInefQfh%x3+8I48l|(0 z?D^`rfalr3!rvwfxX|jywZ6L!u7?}oMz{$!^1NTM&l7%s5`G5tbh|T6JJYl?MPwf3 zfyQ~DaUN)#2a0)D+1X=VzN`fieMeo1y3EzSS(t-)_)V1B)suS-b)QBNf1rFVoDPwn zpQ(HuoTZItE6)KVoI4L9cYlL2^7l6>-wfxc_sX=2`uA&@)>eJ&)yE&`;}-rZpL>V? z{5vuEkKs??5~KQOw!IVH1((8Q@NReyyw^VOQ@&sM0p$nbL(bQ-%E;ZfM% zx{JBT?f+xve?lKyE1NwmJXSV)Sa_^#4zln*7Cy+r`&jrO3-4p$gDku+_q=0YQ2tu^ zqH>e6N4Z(KMcJ#|s(eYgO_^8rDfgXUY`1+_TSk*j??did~DL^ zn$LB*no>^t+)&OaXO+8^bIL?HuWTxRqfA+6&K#gixkTBmT&g@oxlGxb&-AtDGkxv( zOdn4Z^O?S`we~yQe(RL$m9J19p*&J~l=5ihG0J0=$0?6jo}fH2y_e@1WOMiOK7+F6 zV&;L^P3DEzP3DQ%P3Dc*P3Do#QifML$4vNK<$383c&8$p{Q;ZZ!b=s|?H2Q)BHP_! zPE=&SJ-k({#P;x3u@W0|qCVa#uAKC<>w9^uL7DefUTZ++y_M%0ka=(Ay#{!%SefnN zz4~~sKKB0u9<0a*{D2qpml$0)TYtWVces@&iciaZn)7MS-PWtE8>}_b>tMb7?-bsy zl^=%ZdYWZVul+0#b#X(P1T z=xjAITaC=9Q5iKNqgg%`xm3(IF163Q;k^)f)Q9c+5pZ64Q@^~azv~(~*3G=&E$K^o z)bH+zLqz&RVU3nYwtJT7{AN8kpYOOpWPhuuzCqt3?=u~+aKBfW7s$Eubbx{sl`W`4IQnF>($39n)xhqAN(?R)i0AL zEOQtAGIydcb*K4KacF7oH?A}vk#k2nRbFF7rCUqZ`YVA}?aQ@oxh<<~S)pxfwQafc zFVD{XpDDLSxp9SInsS@Co}kxD4`8l(Oh@n=T-nGt_x#Ge`QXNE?m z#hyg$NyMH+>`BC)MC?h#o}i%g9hOZ2?gU}Uv)J8^og!u`80p8zR*cND z&^jjK`s1u4#;IhDnXYvydzb9_f;~&@dp9Nju_LPX9?4zp`v?3l@JDx7xb?8dvYv<2wFR_eHKzTzo3*5_bO=icdqds1#bFK}1cxxUXbC`MOjH@ZT_{qAS4(RDn){l9;J62z6 z`f*CTA1m7ZI8Hy}o}E>Z;rlJ}-ndrR>iw)ERYG&GwBE!#^}Y5My*{au^&k4Mp;?kqyBY#$e1VvQqD@s~vx8LRL*;TP7~ z+HLE4TaQ=6v1&Lr`?gyf*6ca!5}%IBw#T)}rQWVkih!%SZh>31C+c6RrWNshcK((6 z*fc7`R1za|o_-#wSG(Knt~M&K%$SXP=4P^fUu=GG74^lvJno%IZx?}Xr^F|5GS0K~ z*z=b>OJv7Aj(CC=b~(rMj;cA&-MPO?|2gvn53qu`3oh<}JI9PStS&4r?rgi%=XZnE z@ywFK%U|gl-^bItSQOZfsVOYEXe8n)?~tP>GObPfChpXTnOCeO z?KZNZ-3qNu;A9Km%x{5q#?_qmyviBx`p|yrq*4p!M?OmsASy?yDbc=EE zKUpTsOsZxk6QX}Z%2c@GE#hJ6?nyzi)x9unqcPK--Hj1Z5aj$0+Q83haUjsKFF8*uV-I!J)7k z4ui;67T#HRl6igH1$Hj0c)dHzFSbu)Aph1jxj@%@;C=8x+dl-C+sBjedt3S{^cDdU)eub?k^eoqvumxWxH?7jGC*DYO?JcSc{P z+EFQ1PD6t+kDuUer}ZMPx(}&4{Ab*cbBQQ%Ie&SD&l??iA76IAF?FAeJsbAi+ut$m ztf;f!5xd)-e9%!zHeRn{1*2N=oU8T`;o{EHN9^^Wv6!~k&&^WfK8Q!GH{Izx?=Uup zIoE6S_$Au9gJ!;Lj4q^+Gic;2GqkT8r`0rZhgs7@W=hY|#2scncbVnQt!8g$}1w~$Jt}FYhqSp zBB#(y>}l24-g$fX8ub~Y-pN9C+k3*w|4L)L-dMfbUYGEjmzyzMVGeb*tZ}2KjNC>& z-;{CQ&Y#|ERpCB=-})Uka6b({VBa6>{ZAdgLxilzDs~yuns_p0^nb(8u1+7v(epTp zjK3EzL&kKx?H}Da)Yf`yb-$Ahw6qzTkDR=fPi@t{xE5B^zPN%?!O2P^v0g-aHHB?V zAJ@8*v}~2*;$GfYw7tqYoNN@!?h_B=KAP55(b(f~?Tt8ppn6)KaR0ixwdWaaiP_h- z>|Vf_M?@C4LB`gK$#EA+Xl#~}PGwhd$J>Q$_gcSS2iL<5a3kCV8;$;b+R;+}O1brr z+L*tr)l?#ugo zz5N1jda(QR;-0vl!?W;9=%?to$1Uz}i+kI~a9!u$1oY9nPSrGnKD{v*8>#7tRCMhRwgGjcCCfY}y>m6PU8>J60TOMmE+-$M8Ca z*D<_~;dKnJVL@X?y=aa#ZH_f z1?&{CQ*dQ>()!+{^}R{!d;Z?rIlpTEC)EEW{0yFUo}a_B@Jo2!_rHcsuo-&cCCEd+ zItwreCD?A;2#jgVPGuFwVG`=BeOfsKyCH!lq~b;wbi*OATnt$Wt6&YRwQU`|0*<7J zqv2RM9^Aj>>h7egyOUj~!JV0kusVd*8dhsqtzoscfYrD!JMPJj`>{({En&5U)zZtbI)v3BtomDc z*vo3nyyx~|b?NWO>JV0kusVd*p?z4bVYP)f!f7Sgm2ThSjMBtj2xU zanJP-R%=+D!s--Or?49LNViyBvicD|FSq8(!>?-8Bf*qoO$>}&Bp zMxoP=2Ejy^EeQr6^@A2YobL?Qx%UDdOqv=a&4?mc_d>$5Uz4-WpzM_s`Ed8>P z-IU%TQ_a!R{qbA+jqF{ef#5Ow{BSkg#XglL_ui85MIBJ(s%$^e2+Lqpy-t5^? zKl1)+d&^Mzu=h{Xucu$LB9QZ3sXL6@O!|yD_kvf9;NBPBJ9f1n@4gEb_OP~C87=$j z)MSK4w6Oy1r&PAS(YHyX7R+vgOcNbt#2)GPbW1w4w@v9I=|i4{^{^*mJ=(5e7vHhj zvyq?le$f%%OJ9&n=BT8-M^+EE7P62|(UEIN3;aexo5A1QLQ8C&WB;G&x7AlSGe6*K z@kktSmt6Q97L6V4_~F8R__HcsIKNj*Vf*&m>tz;j(b9{j^?RkivgcgdmyN?B&F!nI zh38xNyK6B~&!&aje!t%r^ZWZ9yKwLDw-k1ppS#j;E&65(d$on*6MHV)WB=dN2V$GN zDtDcmuU9&M^n^DjBzU^7KU;Iv&efw_f zeE!$rJv1I%ruS#(+mgkLl2!QJ!TfNx-yX~8w8s96{LJ3%|9`((k;#cz!Ak3#Yt2Ao z#d*)G&E1*p4QE*OkpI{}eB4~>4o{=_&wF-{Z}@kOlk zv?jtUceLnS2k{$O526>3J8E0{z1CT+9C)RlO+S-!F1+lEb{4cc9q9P#R-9dY zxI0^N=_fkdI_iwiS~{{Ya`It2)4S9Ad^6J7Kie;}ys*FYN(eTZ3nQq{!;ALcsecby zt;$(1S?~%EY1^;iFFKnS#s}Mr*&f-*XxjvvWxUKwM<&+`4_)hUMc;4RA6MX>@;+@ zcobXJ^DMipS$1-!MZUUS&m&nq?soOAhcY@EZq?APr>Y*BY$;{&nc8vijyOx|@1^LX z6y9oY)LdB8L4NnY+su~_@$I4B@ic{X{!%-hEq4ejKGo{PX;x}hu<6%Z>4^VLe1zx6 zz13Brc!JzC#o z?|E_$dhWs}vga=RrROf3n0wB%M=r?yGM>KR84RAjkekS!zOXEN&PY6U<&dtwv%=bW z?fvZ(Z8)W~d7tu#>`5*QH@2R&morm~KDVB?7r(8v)86Oq<*d8rjD-INzTnk*4qrTl z&%fodZg+xrjMGWpCtHO*-AJ{bzn3#wx$GHy3l2ZPug4r<+ulvb?)`PaZ=UVR`?lWE z@^~-Fdf@6!_HI2F!@8~a+U&@6IPJWTvdS3$H7wrIgLvn%9-OQf@y@~N?f04b6@Go) z9&|Z=A(mK^UE(@k{72}0vD7#%#39bp!U@X7SmyI``JZcAkG(0 z_UT}i@m~my7OMiUH5R8I5QpJvtv&|ZuiJw-a$VM+I9Jpeb?pC&qdSN(I?CRy+RmiQ z<8tv_#@5pr7iu(~;rOrjI-Ui$>?2yxdhPw~I4wV}vw5HLRmOVn>lo~GLA<-OpG(@G zTAyQE*v&GBEQb~Q^dhXm^@_}P4mA#^c%N(pLTQJ=N;r|8j&|%TAp754%7edF9sDcb z9J%LPPln#}j%PNt`mp$C$7Z@6)vXV$_X_)-oY_Ff7EaLC&O3S#@8GqwEj+_v`p|mE zfBinfxlh=GF5fQ1N&4NwVamm5UAK>G_bo(QT8O)b7Gp{FIlh1OJ~+zfz36t1g;@CA zQsci6F@UZPW>}_22f}h(tiMQ!p78mX z&i>i1&x)LJ?6N&A=yJ8;a-Ui?wCeMJ65Y44;Avi-z4@i~Q#!lw5znLj!`#KWD|1(Q vUeaIX{#!g@bWe@`XPtXz;yI!J$+;FhD^#nxqn}#!U%Z!i-spd@CHMaT71tbX literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-LightItalic.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3783f8dfde5632c725559fad897ab2afdee4658c GIT binary patch literal 64560 zcmcG%2Yg%A^#^|Md$wd-!$Y#=ZOcpEOSUBMZO4vB_Fj%NiIX^q9mpO)!X6>4Kp=zw zNyAFnd$wg3N=u;y8p3F4ODVer;-~-j+$Y(xEhqH%|NoQEv(|g}o_p@O=bn8TXN-li zolItZEsaghESw);?AA~4ZB)youBlz`C9cHh(~QkI+%k1~ea1!6EsXtmh%tUe*VKaI zm3z0=GIo_7_b=*M-QAaYpZ$A$?#1s%mUnOH!}no${(Za#E$`j5tnP*6zvDgHyWr~; zOS_i@-2L)Pj9okd-#J#`i=fH!Rg7Kv89t}2Slxf#*NOY<@%v83G%I@7_H+l``B^k$ zd(furSlxYIAODz5VeG;$aewlf?$t|I-gx2VjP1ic0So%pZs@<`t;K5?yY4*3g1h_H zFYQ~Qx$Hvxj^~+{Nvs)gTBRp3dM#s4lU>$2?b`EJSN1QrR9Q~)50uoCOP1iiH~63V zCg~CNKAwu3aPbC*y{sP>|MLeQe1N+EskB$RiN&!b#?n)9kGPz6C+@~G;?kyS?ev3G zwLZ_4cNebphV_NG3S0$u;S!&IQFvG3qx7%j#ga$xujIuSU&N5vBKJkod^wyYvrJY9 z*ez%^Dv4_|Y}!N~Y1X8s*wCxZ8D%l$^U@NBsU*WD+lw8tIm+TpP0{cZ2{{FMwtR!G z)Ul|ge0#4xHaj&#Mhr2sFU-80|#TutIpXX z^=$|*3=ZUx(dFemYZRv~-K2askGH3#M|{)4SRlLA{gdR7o@Y8xR6NUKrGPL+tBEw* zi>m>R%q?7Y*o!00S|d-fWt6bgl+qHX`i;g`lA2<~80^JP2hS=qhh!$DoA2hca+RYw zDXS(2MYJt3>3DJRA4xv6$xdFv*&kTyl7VU+Sr~s106RkX#b`AC*S z-i$k{+ZRvWmT~Tuj)%_6cI3=EXK>Zpw^No)UL|!;IjQCd>K?NJz*beSufB@=+=_b#yM-;m954$;Tu`*2e%GgXel`1&uj85YJ;tbAZT#N& zrOQPv;}5$`eS#K`3#$_Ak+U5450X)OR#0Vo?OC9Di$YHUQn?(v04f^(7j;m`&TcTdoHh? z(Qv8q+2q=bcq)1Wcab8bYncY~;k3)CCheD>J8r1j^MVw9!Qd*XbrtSu#62^mTUjI^ zc9dkKri5~pvNhU3tJdmF=TFbAZ)lsApjkTSu?2J8jL$YGbM)NEm-Md657!jMU)8#K z!fzeLAJMocVhocoh7^1#4)d<38eZ*Ou_Zh>s32~B`wCtx&8{iR3k@uYqrSS_ZYf9FPct9r zv^u$+d-)XaOH`iI@y15wiNTVpl4<&BiF{`P|ErRG>Qt$i`3dg-N*nNOEWs)Gj~7HR zn^0~uVdz>1-+BDD{wWI*!`2+zw#7OB+Yj&8T^$=DoP`cTn|Wh zVBVuxDsf~6AhF^Sx!EWS?v~F>91ap9ck;-az@O$&L(${t(ciYWz&(x!~&?W>|9s~bw|?P(Y9Z?V|BCMedz zlvqbkPMB$C8~<>2wKYH7>`cv@2mBF_n*#cYVK#MUz;RPkXl}q>fkKF%S&mEyDzueVaA064=`Ap5$mIc}Ifu4b4<+-v6kKY{@=!p0x zqcEjBCb4__Z?Bs@G1|O1F1P{x(t72x^74j@)Fjfo$eVXeMW7gQz%8s@wBHG!(lsWlK`SUC+Ez8p-o63R#%9^s3hQfUxo(lIxZQHoB@hX2u4$ zap{fRjF!zc4{fW7s;J0n3d<|xdC{%P2Nhu{1NW2{&q!)|;+^RYZWinaam`s*-P-iu zHwPCw%Xoa~wyoJovkCiPBa#U_nU;0{un$wJ4XZ}B%W=GCyQL~f`J#tUc;!C^>5;+K zXP%LEDg*pdT04{RTpyk@0Naq5fDy5Dz(;a;98V>|1hy3P>^P5&Rga;Of&1|~* zU|Wkm&>ltOCipJ~{5sM<7_8KrMO#~Ku4iHf6;5ANWWg-(gUmspKIB3L>3`VaPf22X4>C@(c|y+Qf5k#7HsLwOf>_X7tv0SED39B^WxUK{`g6825RWG`lwFPjt->dG>{a9Sfqgg;8@R?7QtEL*N&s%Kh;kIGz=F zU{;eA`=ed9;^H5*DR;M39jb2Q)9}LUm8UT~&-3cRR?moe0iMFHZ^zw}4^`hr1cLUo z?#K8{wLLBq>rVyYJ57A%o~YEw>?t7)dFBgo>l5>8Ld;HHFk7njV(@A_1zp4{YXuav znVI8XwMW{Fr?w7W0NNVBY~6<0GO%cDDpAFP|74_qk4L7F zI8#!M>5F`@`9NuFSKC$giPQPNW*mHb$<%|({qUIt*%v0BP^0TdS`&T^X{?2VC!} z8UUQc6^JL0cn%(b|E9p9W%csR>3tI>S9d&I1Hx)_R^8fqc-k`Qk%`m$c7-Yb;6~+Z z>5;<~Mam2Pz zt$X@9J7T2sBBpfaV7PT_cSQsiM=YA2XDhC*U9rKWMf(QWI?*#95kitp(G8huxY3{#t+H}*p>UFUjm%grBQ?)ka()k@z z`QMeOH7l>k%YrhRNWu_%6un`kP;Ve_Fh`SJ>Zw*vTxP5eE(8^|3XEW|uTDc&W4l&vy(yfPSETNLS%`aHKd1 z>nK&nQ@Q-#CI4{HeL3xwm@ucX((6ZZ70|mHYT)+z%EltyFsw@)l%9$f3?B4g64)lBwYf49cQN z{*D&7oIm(ov~!LW0w%^;ihB<~CjC?39U8fe>x(D!J093!d|dix>0n?f?s*C~?vS1$ zE|U&vgzu<1za}I^dLRV9$?m=U66jgLB)II8ahS&0FigqQNPk(7H4E!$E+`_JE1+~Mo)bHh;L5TlRB||t0VWcCArCdQp zeYK#k0O>6j;n{1|t%{^VkVmy7dxTUWxbxj@uC&~a+?`n0>H}ucW>a@;?iwn7Q*6~e- zfWHprFK&$212b#)walosCZqlNfcHOq5VL^x9U}oHa|Of^jkDMRVOe{?nc2}C9Wb-& zU|rHV4VPbZwM#!~P0zIROBa& z8g8nr#qI%{P&MaUlQZ=CthU?;{T0SbS5%hVTxlrRM^BXA50(qGm8}J(O5G{xP-)T9 zDWD*;+awhOvnec(IS3ad$HO>K!|_MpM4L(sGu5V1nOp|6BjWG*+(si1-0!K*xqCxn zjfSSxbMvjb{rYax+9ipp>6bQLa%+9%g=_P-MNMjM&t2F4ua=7G6GHQgjG;-l@6ZQm zN)vJ?ZkKWkLc>d(ZM|RBPAqPAr6d@Gf3@>+N{%JW7{k5s%*12#B-&7`Ap?>M`2e@QnK=}^p^50W(jixy&5a% zQH&j{l=e;16dL<0`=^*HBlx$9URp6}5|i9V+$Np^9ukawL)-_s!3J^Jb9ZdjI`jO3 zBN6H|>n4;G6}Y6QJ3CdFB@1AN++Zgd$pirjR=W$JEpBK#m~|(HAjfodH^&A$-Ji zRQ8vf?G16x+>ofiz#>!83LvYp!qk>HF)B(5rMG-jS9Nld@(};FyD?60GR9jqIfmr= z#q*TYle4B2#YE>+;T=IqxElm4p4os*G-5UgD1K2{rMa@A!Zgv_dt`A_9A;z1G&egv zId`b51~D58z(Y7zN-#5{ZB^qZGouh8FwK!>KKtn9>yKO+IiuH6I<=P%-m(9;w_N)N zCI7@Wd)1@cR$@lO-APgapz`n`vd$0_!iunK2|X54>Q!z8o6Vl>&W-JW(NS?%c~o$o zsU#t3dR$yh!}2yu0avb=er&5T;P2AgJ^DOjhNCvws(ce#SA5R0IoMLz9CwCf0kmX| zq_rYsrX<>te7Oc0*50kDac!JfzS4SoMQcfY+=q1ov$H2>+KWuOkk%W2u_atHSj#J$ z;)reZ?rWZtpBrQJ;P)U#5+W!L=p;*<+&EAXv1o2+`GTYw{M(83rYd7mm~sWpM+x}M z$AIUoatQz9{PUV^d#g4rXsV6U&D%O9`+~~V)9WWh^Cyh8d2zAH+4h<9!vYJ#%FB{t zl5+Cf7aIc6J|uj8t8_VOBaklu4TkI#dFdfYU&Pf3!vrEIP8V!x_E#Gg z*fjR3|0zc17P!bi)~jFWMssNr=BZ^@<8(>L)eI;1(?6TK=qp<;U4oSUnl& z*CVrdMP+Qf`zqz|KTQaUc(dxWwL!0}77snFw9$k7pwfe9Nm_K{S;#9UJJ}R0Sj4H$ z%c|Rs)&G7@&4fD}-sIo@?sx9*UVH6F>gybLvVaNNlNTl@L6!1pjdDrV#yS8rO{ZMTL-oq>V15pNrnE%qFDW72mTb7Y`RmfZVHLt$kcCAH zRt;WgBUMJVCpaO@Ya!g?Z`22ci$X6iY}MBl>f}I!HfG`MkfugMM1Zl>QFGFCEUC>E zu-bY&x+uCh-0m)zUI!b!9{h_4uGWiG8W^BultG{K3jo@&l(~m*+ss zPQFq47r|m87*d_IM?{(})HRj@y%1Q!z~IdI>I|^(t0I0e3Yg^9k-(4yu#>$kW%CB? z*epE-0su^b*q+4BYSHk=60eO&afIutOB41-q?U&3DqpTo*V`TSY5HOZ)@`WU#r^?o zt5zf|S10E2QIA)KM=GiO19HotpM&mu!Mj^YuXjSL=ft}`5(fkhvYX(^j9c_^YdaH4 z5*LR}OWSSJ*x%Fx-;niL%x6l~PLs(-ENx{gW83;IRPZH6{|Z2R=m@d)aOI>Rg>jH>FZDHxKTm2sE3_KwX&Knzcb27X;iplmKWhT8UL*2N| z{Nld+=Imyx6@T*k@>{Z7l9Tc0`X!BxOPVKITXLH6*X1|o(6>1)`F(kK8`IR&)F?2u z3f&!t4I45U_C%7%@kg5~h6NmvFk-txf9Zz${%^a!+pE7bG~$HeL}sP!A;W_a0leD5 zt;z>HRXOR1=x`oA>g);w^pAq#z7-TF)^&Jlq&+{)V z84#=5KFLY~%Ni_SUTZOoTUZpdLI|hY3}#N`mTHNNU^Wfk-aN6eW=DItE-8OfM*XDN z@MQy&a;~V1OiVEkEUT=ug!Z^u_PKF#Ok7@Rb7+(_y{RlcUT2xsvd~gmP+pj<4{#W# z79_>RIH%ZLanVH+`*i_Mqw=^TIVx1ns3}Ye(HWuu>kra8{%`3858Z)-*m3<}Dl+Yk zC^AXwrr;lbJIsy%lg~mP2_^e{M2Rr@rjXf=1S}KyrDqf=WSVwbG>7+}+JDVQz1yGK zvGd7AHO0lXnXw_Vtu;2@)*{<@?I$-M{NyIS=Gnb_p4+QzYrnNaBj;<2*OzGXu(3$& zD&EI$lCFVlO6p%psumK2g+z!bi#7%5@krD)l0!>&T+k{^Sv|HsP3t0)Auw4JsY{Fv zsm*H%2q`L@r;%<-NXZEepOPCQNfQ#ZnTAMXruh=RCR1mKt}ujV*w z320s!^USJ4$j>Di+}N?TvvaGdq-3VU!T&?=+y7ZQv$S*u#BlhWShkeGKf&HZK06;D znARF;T`v4!&+})LI-c#?z1wx+g)fO+_DbOOS~-dKYmya1Jsu;mCTn=L#OLJ36@-RV zW_K-`x<~(-enSe}#&5<4Nk#hd32luZK!cs#_(b?I?pvs)-(V@~VeUj0S89qG`m9Bo&HpQXO0qAM3JXur{8=l_&R;; zw-E8{uLaqfJd!TSnlWWb<(0=OO8HCKtyw-&L&^`*+o#Y4y9Nlp3!X{BELN5kf((== zT>1Q(oeQ`_*Lk4iz~-AurnI*3_orU&7~CxF8QjdL@J@PqJyY0Ad^tf&o5OlbjYV0x z62I^&cM<;{lnF^T5Rxpg2ERFZpH-x3`R!9>)AUZAEj~Mhr{+eb8w(vF`l*`S0GlQ- zX0EUfyp9>%C`XZXfVgU^Q~UZxdxxWDhV;88<)y)5qKyN54L>67gG@u)bg?C#W54w* zS_`HIJcGQUwE3j7?oM->+F$hQf8~+JDnt84k3s!t3yd9 z=W4(HO8xGN-P2-=qZ0Lr2G8&YCy~!}aJoJJo!`%#S!@TEsrAjC){{rJ?vKQM`v}jC z%MTkx?J648ew3Ecq>uh~qrats_A{9i`29Kb?`N!MTN01?L&EsWWN_6e#9+=W?h<|; z)`o@rB~he|s4jgWf2l4w*fOveuZC-BLd&pksi4i{TY8OLOJ!vveM{1_@GZ&02NNkD z#5=)*h)W0icw+dn`(l5oyfxAvBOhFtGwbxVWHTIc%cw1_kPi>F1lk(W(q%#K1rI(j zs->vBg(au=`DtmUd^=W$5!xODCnAx2L}Sj|61!bhE0x2e+Dq88XU2@vACG9zGs*$^ z2E-IalTHUaxGGzEMN8kdrAW&%y{R-pYN%QgVlE7mYX(0Z)k{`Ih9S42JWZcnar&K+ zeFX@N&XM<`SK1L^vjzM@BJk~m&yOfJUt}&a557IB?UJeZclx!Ft*Y29kXs=cM+)yg z#64KU$P-9L2QWACo7v35KTQ68?B(mj0u42@BMrr>E3KOEfiKM-mtoU!b4;0Dl5P#p z3@<2(4mD3mA6)32$yu@5;4E!abZIbX4-_X~EIp=&KkOeg#};mB~Tdd>vpV}}qHRv-Tv-$Zo(-Doe` z5aoNFX+!N0-BUZXv-!5OgQ))dG3|KiepEY`%7;Mp!!$plsZ}1DKQgAZSV8rF9rp2g ze54*K^r68K4bJq?pb|c&#UU#60x0msdj!5nY6qW?q0&DHG&REmH-s4S(W&>oE_eam zD{x|$zXB?h3+QI==y9`p?=Qu;A+};yp|ws;?^B0+K0PorKs+JF#_yFc5i5+ecF+1E z6T=DbkRGAOoMJ7#Olygtnub4@!PXZ__FDK|$#y@+_e%Z%_+RV4Xl*vMw895lT(;CD ze6W?*gf;kL5ia_{Tp&~g`~Y6>(Vjkj8)oRuVISJCyH8BnV33a&ZOG{d%nCmu zW{~`d7>i@P_GL`2UvJ` zlhWk3*Amh!2W$NH$JqrePfFx33A+{<1wbVfoOk@rJ8gH}WfOn-OGl65UFK1IzJo9| z!F{FlnjDK=E1so87FSK5!lWRg;m`s+p^!r4y-lE=9`9cxqgI0a3U z)tR`9A5SO07{vVKXm_Vd$jM`!p59guV?1cppYN1-(-{BhJ0RV$K2&KX5w5q*+tDUj zkNiOC;bCK%y-}rAKP~rpDOJUSN+Z~Ny%fUz^uiYl;&7Rj1!EAR62?q_7!f{J!I{Z$ zYI7nO4k{7Zb@(g{yJg7RDwy<0kE_JGz~tsb9ta|QrVE`X)h1gY7r@esAS4)`jGQmo zQxLrV*yP*pOQ<|j8TX52sZl}EyB>KUHEs!4eo?+ndTc{g#yYJ!eVTPrz;yD zNSlJ&(#OjVP7EKER8kF3JKO{modMU^4L5Zcq*xZF4Xn&}MCj_W+GixrOU_=Bwz#p$ zw54oY>|*Kt^{Waj@foodd4&u6i~)s)$&E>AuB?UvdvRt{%k;r-CDYnDpm*U%g^!i| zsG#>Vds1akTp$EN*2F3>B~f()jIX!#%8HqpZPa!A6H^ zkaO9HGR}x39%gcx&kuK* zl(WF6ngs_hJR6?8ko-sBDUWp3vrs9_im=j)P)*^&6~5cEK$Do%ncOrpOjn+p6Oog9 z7EDR0@wP-~eQda?dTP2gI4(6Mm}sij{k=?Hvm8Wo)`B~bQITS>Qfy?l@I;QPjzraB zWr4ZV0()e-CJ^_M0h@dZnsl+!10DR~X=ObLx)l=_Bo*z+t+s^K?KTJNrU`?&oIgZ|*Z{q?KH9mI*K z9cVrf_H`u7P~1TzCPTy>h!7sg5siT9R$&iS@03Xvp*tIaOmU|$j(YA~E3h|GLz;Dc z_6%TXCZ6%I-Cxpkpdo5|jc4?uG^ABt2K9G(OdZRW;xY6z$^9QGA23;I4RG3xJz?{p zd*lmYGbR}_gA#?v&7>WQgN0F5%Gc#zy?RbN*Iu(Mxx-=!SbT2u;Tdn z;Kp{+?D5Fm#H>;T4Ca70belU>kgFCURL?5MRaT6lOGJOeng1y*;fpqcfL6Tp~BDkK8=9H==LA z!rfu3!`9`@*#FzmbHldSrl~P6`SA}us^hmjx-B>6#8VK|B{i}_@DD8CUL9VC7FYg+0NwCNoI?E#1Z9+Eiy2Z@|g zd4Id#VR$4=f1T0(DPmAOypJMgyu>jczL=Ne|J`qIDu=w#e{Yf+4I)-Cyqv@FAcQBM zn2$EV*n~Fh42Zr+iWKV^) zJUBsYg?GUO3VRg7$Ws65MZyEafh_9gu#KW@D4IpJL7yY9!#mYi08i)$n|6H&Pt*@S zHOipfke`40sS)OERqrZ=KlSJ7KIrEx^6R09E>vhw(-k=>|INyxTV)Fwq`god9+M#Tt!2x$<_(mP^| zMQ4@Tkt+(p1j(c%DwjCVGTuU27nVKMQj)Q^IxalmECZL449Q`ZX&0u)l$bzuac+lX zh80xU^{kXyCStzC{@@gz1W<)mhd2+(Bq!Cx+cntcamM#IBbiq&%Ge%98m2I$l#HtwxB@VqQgDVr(SyTwHf3K2}YvzKPUAjdxW1cEKysh5nL~* z>Wp)OAXOVe3&$G-x7?hzxT0>k|AE}SXV2`}>PVy{A=}ZeCK?OHY3u=fAf=X0&`Y(5|2^XFnrFY z;JVa**1@W>`ueiLV`DN8D9*4?J_oxQ`5Y;-)Ys=&CidaeW1M=G*oj{pb`s)g(vlO! zKKyem0O)623&3pJf&G~PmWn7TkGJ&z;3fHW)Sf#6`in>Gxr1XyabU!*i{ve@i_$Zm zOtI%CAk*P&wv$nN?zm&Sal~%xZ;+3V*kRS#IpCcguomChxfd);SvO`_?VX*c9~>Tx z*A8?))8<~VqmKd75T9>Zkp)|5>Py%u&jkuzN4wE94deVWfz#el`iA4dZo zl~l8xB!P3M4gnwCL7aEKyG>-rq*G3V*smblz@Y^9K2#>8#&}bEAoHpsh>SQrL@w~E z#@6i2<_>F(CsRhX!~|-S$_a`-kvH>jWl>Ae#7lRs5ot4X$QUC@u@j;R6#je4qVan8 z@AP=oJ$%b&VA4vJUn#cHgOcwghIJZ=n_l8l*GdlfFU<#RSZA@zsr-3dlKN0(&;Dkm z2+W!AC-QE=i!~H~4J}6a#lb8gOR2%Gs_|tw0e8M?4q7x`9@;zTwB`x&f=0Vg7Z z;QzD|`OQVsUFZMIv_0AU>giYh$J9NQ$36?KL`P9e*frpx6Rn2e)#6} z%OYlvI9?O}w8$4iFNcL_ygWd!e&aVCu+`JN->g8+g?b~g+305wJD#xRno5P7X7$Qy zVh9$i)4By^Ybp}?oW%0PsiBhx%3GB?TPp?<@P%?Gf@l$ty?b|=62NPfXZh(}yWq

v_2!luJ=xLMpY(2S^xIZleC1A%8yZ)9(%uQSbGW;C|}KLV~1l zf2i^GBsubzg}nxGY^G6?BL#|m=_@dvLml}s%n;^itXDxglwrYD$2yAJQvV}OD*}*r zeApv*f97_G`V(Qqt;n_k5WEshZewG{t<|?#8%R)jr7~q2gzLdpOGhk;CCD~?AJ3*B zD^<+hn5W4smy8xRRQ9I`W5;z7RS{@qdLsXqqK|D8t;ofcw<@qQ9lM^uHQ6``6FdU4 z!#HeYM!r>!{iWzTvSFdl)46kbMTRLN@y0|cbJ{2^UscTB) z(XN2(5R9>jUXUB6=FyVeLS3qtSE|DyQwtX2pt5lFAo(6u z1pW@D$>T>>a3R<4(*-8}55oJmKTdqYU43@d#!4ird8sRzBxcHAJ*6 zMry_6S^rE!%=ENPV*{pl;(qtvaKD;0jF#zsO2Vqd-92bs+($B;OY*iT|0WtFLY#-5;ElAK;6wC0yQHx# za?P}gwsv!02T#w-Y2>SvXAAS1l>0s7c}`%Iv|O^x`2a+-bJdkvLUr1vxRU3Q&^~~)^C^5%s z&Nb=B!>&z4Js~$3n=0)Z*!#5pGq3*%qV}JCefkR&(Nk&TIr)}Rx{$E{tMRDUtGdwO z4?cj(w+J<8F$i%OSQVpLSnEUkw8srQ0#>K00r>|vQB{BZLp+HTAmmcIQ5F$6#V#kn z1jQir57h{qu&AJV&Hzf_RNQKe%BwC5smn8!ZjIdUfwQBwxp5qQmL*e-|3KE?&^GBejI}L4A3cyKGz|OY z8NJ1{<&N;VE)tvR7xUV%@G{6w~ilE{IKti`?}xQ)R9)2KlzPORY#SM z9hpW2o!Y;5chn|5a)if6C_ZC-y?6WU-2oy7_jAv#sm9=fs|4a2HwIU7#GkM#S0_H0 zr0n)PP+k1`gub{9iKqYLcZ{kJdj+b^oY{v>?2P~!IXa#ge|NHSF#hhOu_H@L-JZ4$ z7wssk5qtG6{CgI%6$E;Ntq@*?gme5C85MQ&pZq zVfCTPp5=G$Y3#hj)xLTlEjlDOe{RF7M;-{N`l(V&y=Kd>q-X;jr5XHdLt&}%3(5lQ`h+rz4MUM?GqgMXctYhU0>3yn&VjoRB99P-(-&)z&>L1c>It%U+Ad}g;)ixw>T7q zvP%O)<)Pl4Ilb0XAnFy`!7V-|q9)E1HKI5Qm>`y2l`M~9j|rjOk=$nvwWfmz=^3u; z&@SA-L$w`LM=-4J*gdFnm5l5j#1xanV)9?V>Ta<4fB7q6MKX;1s=qQ;9{EA7H!%`A zQd51ZPBfAHFlW-9@JQ!=k#ID4WLO(SyO?V^0a8 z+<#vTs@sSUm=AmQj$ufJKLc%udR>_3Bw;Z-W5q7o@5im$^)H(4@hf+&RlR*wmE$|i z`OoZa+}a#36H$y`pJR>c{Zq$wJ9?w|n=_6rU9}aCJ3Qrg9zlNmA#U_&$~4A*U{-#9 zuj39=`Ozc!k3ZBNp$SmkwIWe>4N<}Va>OuqYHcD3+LzZ9>M70^%6Y(uSj>ot6QX@9 zvgy=HZ97+wNE7RjLPu6-EAZBBTfI{zgfly0Lq7tqqex{xv7u*%>Ftpql_P51r#Op2 zE!whv_9&1HBMY?@dP}%Wn-7pwYNvclji3n6x;!IcNGsIU88=R~I{7e(d&(cZV;@_y zPNG^gsG$6_D8lBE0LLpzv(B@S&qNSH61)oZKy~uqk@SOmvaDFi%clK)1ezla*F3LQ z)6?sHQvzqGrS%Y+z*#S5l`7xBa_pyNGJX%6ZDgv(0=ABD-?v6|WU3ia7>8=*Wb+Yo zIXSE)ZMaa5l`7}Z3?9VR(JN$f@MUOU!mp~1#UwR)d=oc#D*}4h=SSYUfU1WeOY9qz zAx^$jztwxBEa-pAbAD?02>tG^F@=0M+X%?kpk?S?WXBOD@>CO+=~e+x?cvZvEmh68 z7;dR0bSj^hDX()>v?r4kMPTv6z$&urhUy8`Q1yFJE=2f5Y3tEy9`?Xwa_XIlL$!qx zuQFU|9;z=irF1(L7}{Ps-91PdTmuh)-OMaGEx?jxFYR7`Mk=qF&Q(N z!=|yp9)Ec=YE&83lFRbxcR18>yy&uDjWL`lU;B+S^D(6jUNT;^nL7G&&XCW9*&360 zbeMDtKWRr-LbLG3<(*JvqjBT@(5~OOKaGgI@&~VUndur~=ctV;ZGc_#I!z2>rr;gySh69Ygj| z=r5oP#*h!1Q!2(#vNr1LQJ5FiBT4a>)g`4R&yUordE2*05piV(%GFlB9EF4sIUpt` zEM3jsZng%Qqf3yoJ*Xdz3#yH;Qtrnhri0+|n;$Z6G-=m}%#eP+r2CsO`5=Rr`J)Ju zCy5$fk%u$fylT%_GC)D=A=T^9=Or)62M{eBG;Ned%|A zZ5~x?u)y!ID68EeDzqY|#U~?h$gwRbTU6=>c@NcVjha6>$))<$XU^^!QMq;Da(!%z z@MTvzI;G}jZy8tOtqxIr4BXG_t%np;!x3RZ-t|!x*WkHtQG000Fr&^|%&6fd*9+f0 z4An_PYO!nMB6oK+749g!@B}(PjV=KhUF(gYa9#tk5 z?Oug;GayMAsg4cs;x+P6y;!I~)Xk{kZLba4j%&G34L3Dv9WCC2rN2c$DxzXkNQcrJ zqddN$)Zr9I6|@mmWxWx-9!s`QM6U{xPf%~24>%&OR|F=5=2SRT8iy^Ltn+qUIK{-1 zX<6vWQeQj_ik(u`w~hb>BZBBDt@O2k;-m#FC!HR3ZuvCmDavJ|tKAAS^B2AqZzZ)3 z9ds2@*L=Y6 zLUI3SD9A8B8j8Cq?Cx6+6t~0u>cz!D&>_`F7?zg2=#XZ4B&OTPKypyXwIBNcgZ8j9 z@E<{c8uB-I;^{;vmB0;Oph~C8H6yF_30+h9aHwP-XYpCe=iVC^iczCI0$~W3lc?&;WUa@g*up^*t zUQW3(d*LMbgJHFlmdS&VJR-592<>lZJMpRgK^m?0?Dan!nBI5KRs-ZKO#7F^bwC0| zHe>;Ojxy{M>F`Qd0ArvXirw>sqxh*jEc@MQ_%!XGgOp>wp}k|P5?77bb!6GTp#1dB zzA?UID-}zjV|F3hZ-70SA{wa@3v!nI)i9w|aHcvYb}X~8wM?!fD?osn^@x?FW<56k zf06e{;QYVIeN;Zc9RJS=kUT=H^#In28UR$gL#+V-Y4>MU0Vt51mfO!#2;gw=dm(2p z2Jl?TLIgbousUShBmlD}%wd|SVdp2`21Q?yW@E}g=ooU-DDQ@_H@n!@l+l)tlpAYH z#>D(9d#CoA{~EJtMz5)_-`q+JZZNzrY#?Xa{@)rlgq>@faqS;U9^IB7%hwu}#V5Aq z#-Dg1L{f9Apl8E6M^)ful3y**Th45Kd5^4UPmiNvx4tT0b|&rG4lfW{8GeRMiK0UI z+e7tUYb?Gd1?9H{#rTT#;A`X)T8)vBUQPKNVq~hWmuh+*PZxUiPQbi>Sm&$(gler= z=$u2^-3T?AbUS|)W0TP8n5wZa!OF<_MN+49t>DG9Thi9gFH(0`&*qMMj^dujJol)U z1t~%0(W?EAvw!348ZD%L+Wkk#_S`l?j+cC0`p{TUNsGA+QR1>{eLaQUM_Np~4tGiE z{7Xrdp2v}$`Qj1WN*XH;qlb&(`OgEMq3NrBe~UL};Pu9d=_N^?h=H`(@j;eJYPf)a zs~5gY(mL6Yt~;!Ao-i*QmE%4lAOq0HNo~>rj~qNC1@nJ+rCrG@*rIth(>)0M$=G99 zdN|d|Lt(*EM+HX~ccexe4!tEZC4-;1FTN_NDpOxRM0vS1A}<&mmA<_h(6bTI8EUYRWB(U%4DK46!Ol%;RITc@YygzxwagH941bxoV?p;!<0v=gWM58Y7Sr~zM|&FMoc7e= z7@jEb5mloiK0;M%h>r~EQZv9o5KiblBt#SgdT_KJrRF~p-!OpU@w`@Oo0R$Z6Q*>M zPtqf$=M%ROIgj3+Z@_H9GdFg)!#dr!zOx~+o0kp)RXiLgx5Ynf#N#2Wj_qMMN0UD~ zrVHgkAINX2|ZGUE3f_8DwIxATTxC| z;rLRt^8j0ggX1nG95_)+{ed4>@nq#g(nHEH#AV_{O7*le51S=cTZXgiPT;y1*Anp$ zn7Y~hlRWZF)Oyy5E>PH!Or}&vWz4y#LLGxgOr#MDZ$Iv$(@{mNviAq4_)2YrXOu++ zWtK$+-_KX(DA#AufvMpWmzYC1_nenHv5O8%r9)GBlJ~2^p)*vko|kAYm|-*L;tbWN z=nU2J;WJb}_nx8JJg;z3oT(tMy>IB7C%wn20%uewx<%gQ)f@vX4wECWOTd`m2LZ zGZexYA``w%a83(}E3n#U=wc7&BxlFwBxT3R+UV)lf^$-1=2&x=rxli-6I)Pn4q)1k zD!%8VW-WPdMwY{X%CzFpaC>sKQI@7BMFiegG&LeRG|SW*A{Xe&MP%?D80ArnlFpPA zu{6}&kcKX*)`-DsB0V(3OQ!_J_fFSYI&0%{^~Suk`lzhZ)U-5hrXwss`bA@?sc&|2 z&YTXdl&_s0){z*&6C#VMNxWvq`P=+3#(-6b{RnmXYxt{%S0av8-W4c)RMPUJ@$XTX ziE9ASoq#AB5EXi1(o)e7~@fIAi1*mrl|}CdTR`BIKk>ouSgGx9N<|>^ehemD!N4GfY)JDGt`g=(Kv% zy;(tF;Xy$mp_ve*CCu9&_>F+dLOvuD4z~1I=shb(odUAsB0h{3kXG|`lO?OutPj*r zD4C{f>4dsc(k+X69ypfc=UpR8tM<8EWC>E7cOxoax;+^9c3<*;i@NhmNij z{?6FK$ybanmCRY7dmlHU72t}_fAEs1m@$7BH=Y>s1eSh0C6D3L|W3w6?Nmt z1+~O?Jq5Y1;W2m$>&ZF(dU|5Kro~4AfWc0w}SxYKJ|HE2(e#}zpGtg2pMENYG5B|56WB^P= zVPYj&e$Gl-HF_mw8)zk&)6|tzd4`1quColX^G=+a3#*ja(;y)r9Moy|Nr{8?Rzn7I zusE<$szAouAL7OOoZ!$beSX$eOR8I=3>{ajP2+Jo|udY}yF+B+f(#6F;mlrkR{)(F} zzx<|(J4#9&`OzK63ojqYvd&FkameK&&+Z=d)PUNG;*=1?6o-lJ0J~oj&qrY=7^W#g zA0Z>8_;mH_M0*XLZHT|@9gmz`+#jvI_JU}= zuE?CMY)+naVCFu;3WDsUC}}@x;s;Y~cqyDFh|sl4QA+Jy>yG{*W$OC>0I9 zOBmSWUMy{vz9ji9Fg%t1qw-E_IRE<7>Q)4x-6GFCeN3L|be=v&clYD&2HXvvK=NxO zjzY#?YiTg==Wi(MxK8(;6yLm z__34XOy2?bM(HkDLl9#g$<2c!5eND%4*t4Y`DyVL{37Sz=knaseG-&;nJs3Uq-p#O z$cJeZ0ptW9fN|SGHK-!Z@VnWJTu#A;LABYP`2mP+ET(+}QO1d~CF;FRm8&W&Q5C(F zoAWE8q8<75^^tK=fo6?t)EM=_VedCIWLb0;Sq=}12#VTte9CNBdAV!$l;h5_x&of` zS#Y8uKSGmgj5BDBpM91Q;m~L^!xA)PwqUoqCrGifI7t=_(oqDkgogXXMe)tGO*7=| z_Vn6DTZUfF=*kS}nXD}daJER*8|G^ydtlRa%;9FX5O}&6S_sJw-nfb(TN6$U8C8Fg zKa_Z#Nu0*xNZ4-@r}31I`G$uMAJB9E@LRyW+5Jz{_0p5X4g5o%1NDo`=1j%s&7U+C zS6*?a{~CKyC_8(*l* z=6BJ>@7u7g>SovVO12Y)6D6E0Vu3x+`&7C(%Q+CVghMiKQ=h<7l^d$BcimjI4vz$| z^VwmkfqxC!CK~~u<%rV3LWj&|Nrj;jDG+vxBwd|$@4abX+?#Ucl_}LRa$=$!Bk{I7 z)PJ(f+hiFMD$bf?l!pVF1HE}-(1%lFNHJ4$VsP(!%I9o_Tj*KnL7R@iPm1xx80y?V zA-d)XtZL|sXF3ny`cdZr44pL{IPQ4>oNYz%l|J4?>xEX^R-r96k+z6m0+#svBD6*E z%VwU$-r!`dB3V$o*-~xcNh?+W)&{_eqj2#H$%)Xx=tQQ^y(cog>vJO0Lib_5Ne%&y zk>f?xg;SAstR8gmP_#~Vne(kprIzwbctcOyC6i*OefgV?L!Bvq1YAMxqdY|p6Hh{1 zE8uoI4jRlY)$v+%NWk!uYezqsdi*&j zbN%4c<~j2}S#U*G}%BwRQj41a5Jjr?bZXLT04i~Y!}`9!{gU&wFg zkMI}xoBVymlA3TQI)pmYI@v1s%17lVAk>Jv+fWs&8u<*R5%^d-^%jLDDb ziMb)>cd>@plvro%q}blrhhqO5mlD?=cV66saUaM16kis9PW*xR-zEemq$bQt*phH4 z;V+31i3<|1O#D-lE~z}JFX{HAx03^s%aePPZ%%&OsPF$KpswP{DveoD_zzcBrH`pFDkMs>#0j7u|a%Xm2By$r<`Z>zJ-v@Nk+ zZ2N`n4ck|lA(=^;&diCKOENcS-kAA7<{z_yva+&fXYI)PW!5{{LD^;5J=sUH-_ME4 znUHgS&O5n5xwhPyxdXY!a$n7p^2+l1^X|+0A-_IYpA@7PG!*m|Tv_l`!4HL% zh06-BD}1xaSTv*PV9}e!LB&%4d}Kl=qcyE5D@ty7FI?KUMxl`DYdSikOO`iaRSFt9Yg2-AcJKsd8fF zuFCzDC#x(~^;J`=HdftT^_!}%t8LZg)fZGhS$(=Dv1V$`-kMu$994y_@a7QE=$A3j+a zTKOH*$)C}3dhN;q#1k;~c5#@^y-fK$Uec)i_uYb2m1)?@f5nbiJidr>)B&&g)e5S+1<>=uVXp*ZaJ+4l_=g7+(MZNYUdc)~tJ+{}`4aM*J_o6LX2GYj$h6RwZhWT}ev zOMS>9IEl{zOe+Q8^+7fn9Cfm^4%fMCKuYzzI`G@Ktc<_Q4oZ{JP9l3$F2Sj3jD_-l zuzUEIEQ80f6pZ63yvpeRd}$7<+-qPN`WKtaKW8m`KU*l?zryD8BHa5XGxL8VGy7M_ z1N;^E{iAsQ25W=l*T}yR*8)5j&i~2ga3?&I_P_>1fc>GwEC?GTH?`*ZkV zX5%$%7B6NG@@mG>|4xDXhgm4zAH+2o7vW_UFJq7Lw^#;zcRxrMvcr5H+Ifi0#BbZh z=My+ntdJY=c{z_}SK_)H)%q>?oG)eL?5ca&dQ?-c!uPN9X|Ro+Vy)5ywp!}OHJ9z? zS3{B^ocp=t2o^{4Am)JP!E@0Z_+C;En>I8DG!MR4A-e#dCy05Vx$s;x50VY^VFs=U z=YB5fJ66lD#XQg)_+087&^)M@gnF|>bMOUQfcHZe@Ng5_t`hS=bK$*c9zFy;;FZQs z{f~YXV<$Qw9Qb)9`h-|Nm&PyPC;SkcXL%)BCVCq86?9ItChdZ)l4y?bO=BJN>i&%V z+Wo%wds-Jnn-Z-J&?l`AqEYqL{WtzRKK~n^9|F#UK?hhjgg3vhf5-QjN5bXkR~fV; zXR$dFtuxTN`s)6h_p?}gME|q~hhObOpWg)ySFm1MpZt8_;sdsk*Rmx<8#F&>eVwA- zC)PBrD_YYupWd}i>x^0GYqXbD<$I=@My{``_3>@Cq7R0Qht0&Vb?DNq(d~PyCxcaVDLl zo&5a^o<3Id3z8X~+=rXKh2Fqeve@xx*OPHkRTO&K%mO(4*lZEx&p_O>o!!lg5D{6; zC-CijA9qV}(r=^>=3(`m+&%P$J@}uk5aVs zYw2C|uyd$~uM_{9Y)Xz!j!#Y&J(P(a`jdB#=po#vhb7(~+#kE2cR%NT#{IPWN%s@( zqwYF)ma;=xJ9zm=zy0XgM|XU5^+!8DTK3W6Q>~|(Pc@xtJXLqfb*k``?ZeX_{_x>9 zAO7ycc^}R`x&7pplN(O1Ke_7Uij(tB)}G8dnepE9A#a4dDsYBD{QvjwQSQF*{(#G= z10AE2nRo!STy`3l`kup!eA@F~0-dLL-pi0%D8HHR4*>6>>LK(#5WMB6=e>p%LKaZJ zH}GVs)AQcQO5`=3_hBqn#L3dL;VfEy5;VP*^|4KmcUIz@%@wR4bC}6`U^`4^#qdTH zvNHI!>0J^2CzFi_f9r5Z59+eM3nk5*jN z(@MZngr^86#jJu&XA^OEC*F;1M{OlIxZeXb!?e*gCV*DjI&&6kggJ_ldt%HO?@B0zC zlZ@~C@xKr63-EsfAR&6|!*?6dBh6GVUf1H=<@mh|&$s`do*6p_UTUH7d)KTll?uy) z`y0mG$0-|m>_6;Aw7*E;3IX6D8c0?_*u_G?mGp@HFv3a{2L2EMOP(2iu_)|i(TI49 zWpT(ZOhB7S7{3+u$WmeHO$X1ifoEjl?13E2LLNq4AoxWwsHgkKd6le+ zRkIrGNOj;94UqeqfSDFH0rT9371fS)-wA9@0XFg?dzT*jzS`&1Va+ z3ol~bTw=H5{H_bxQ|vnS8Qa6IV3#6W@EGFhE@6MhPJRvhntj7AXVU{$dO?+kFwg5S_q0L>Kmi*;JO5zkL2B59Q^>bLf_RkO z#&%!_-pO{c&)FC3aW3-!9>_IZ%Y)b;Q+O~B;X1BoZkUV=I4>DVx;%`B^9XL@W|;G% zxP?da7#_>x*nim%Jf0_@hD;JqhF+J#Q+XOsM;(0|&*WJ=8xqBj>>ZxV^WelNfM2zU z7o$K>2``2G@-cTn3UFbUF6R}z68aMr`KZO7UC$fX{p)5-{y5EC__yMG=KSA2RiLd7y;I$aw8~M37 z({&Ty%(w8Zd>dqz9qgBg9(kBO0!{uw_7L=j-Rya`mmO!nW>2$c*pqxG-^F+H^Z5m^ zsO{l<`9=I{x^*sZtm-Q|^PuDa2KBQsE+WzjIo~3L0LwbhZY8rdG(X?iX z`qGGgy8E?Fo(`9KI&4xqTq<5dnueYZSvvGq+vEXbsrssEQd?XqUUV(PfasPFzYl2{ zY9M6!&|7^=&)U_iyH#NI%Y8oRCJaBTTQU4TV8Y_=^#LpJN7LHBvUkZ+%}Vj2ZS{;~ zrDr6q>PS|qsB87WywZcZw&50a=M2BsPxJvnzsl!>roFpopns{RSG?%keSXsS`h3u| ztJvsOUpm#N)~HW)`rN2r(!U3>QfuUi*D*LUUVCV-v>?W zS-NCpZ*O-{zvqo+n)-OZcnO$BGt^HrG+mvc0d%F2PLW3eRY7Fy~ganfmNspE8u1=-rs;=%%ca`;i`&3nTCnTWnS@r#U zRh>F#pS{;w|FzfNXP?s_8{L*^UmE>w!pF*%{8HJHmyFbG%9lrdzHHRze;N5a{_;{A z|1}bmFCTWr$^Sa?@yt+*(hgS-f1GgU`=U(~u3i?&DIdAt@#rr%jrubFlF#07HKKpHBrb^x9slJ>OuFRL*DkwZ*^SrUIO)rkPa$B;f8UvB zmE>8+m*m+emgG5$#$Q${=wBjH+IsHEWqHcfe_eLN@*BVO#bq~KyZnZ!pIQE;8%Dld z`#+aezD&9C+M6q%r`;$HT|fM7*|nej+)b5lQ?I}F`r(73vah}VGf~-7gsb7tH+^|| z<@2^`BHX8;*FBcq ze9d)Nf1z^Rv@c$L!?NqITlSfoq93DgHw2Z0uhTz;b)R46^rfHoEPo%~VOrR*tn%|7 z(YN6rLrSHaHs+lkjT$X1i(X^G*7!Zqwzw^mL7Uv|UwVYNhbWK_1_$H(WEOPWYdmZ^>N*UEtZr>yHM`pU0G`O-J_ zn77GbzAaz+uKeix`o7!cH+RUGLLYdSjOiY|<4^R9|0!qsuh_Hlrx#^Quga2E%aGQ| zj5fp)`s*6~c7q?5Dq zKYpML=1|$o;WC#a}0Xb|e~$DxCN}x~ z|75QDs-WHYysDXFI;&<@oi(9-!r+oMlfDRdOsV#MVsU=z>;=DAkU#CsX$wwxVbRTt zZa(qjC$3pk6+WFFn?7)QY*F9or=EV_srfxqi_hD;_Kb&5yLF!@_Mf?UA2>F3-2XoA%}|$-_oTe&>P< zXyDdScymGir1}N<6HYqq%`?ue;DjqqxFdW%;e~~hM?*dDUAR!YZ(jH*xF0%cabW;m z-ge@e6MGj`(F~k)`bqV4duljlG)|A5aZ?519E^Tg&puL+)M=rTy$+x|$m;7bP znkBVM{<3u8(({&Hy!3{p`7>Yhu03uiHL}fvT%|a~b&wQaKL=0F zk6(i$Axl0~zI!WX{D8;Lj&jl?_N_pdot7DU4PB9ld3XUy*Iwb&Xvz4*F&mj+^&nR&dtn2B9M-e$ia!H?lixC`!vd*I*g`xE#N_)qw$ z<5xIlCA{qSSK)P74Rz1}Noay>Y;1f&F&Cc%Q(zh#QrsMWZ*d@gC^?Hf3=W4Q;7FJU z$G~xB@{ccO;`58I#}^d4;wO+x9Dlas&hh*Ce*cKyFCafkUPxX6${3E#~97+X^gW+?2%%(G1>t}V^fXCrWqAZ^LS2%7 z{6n#?!q?#I@D2DTd<$+$nxD)PzyWt-Acfb7v zthnb7LsnD`#r|7;f2Mx-!q4Fs@JqN4eg*f#ui*iB5USxJZG9Mi1HXkwirZZ!$iyD? z+hg!JJONL_)9{S;{vQ4Se}olu@F(Y8Nj|F%&)MgB@&)om@+Iax+;&){=FOZ-68;L5uAvb!jEHl4)|AHnoxM zWCz(vc9Gp=51Ao*A?I_SWBSPfayvOl4v~4XK>md+S{oGO-*IvbIhL#<$C2a734DEG zu?^R{;*-fKnu(cY)&;ItL!aPa+qQCzGd;r@`s!wU|7E zT%w*!$*^AQEXSP#f!~4Kf!F*${xQFOoV)}s^ZO^*-aStKF2&)i;FCDJA$ANKE%NO& zG3az0S?mhpImLdw8^F7Myc@u)0i5bLlQh;`(pbFNfHxcPW&_@Az?%(tvjJ~5h{e`@9j}g3VA1t$LuX%GzcQFRT5c z7=IYx3j_RMfDa6az1`w&x0srBRer3Pnq{A@Y_pYJwzA0vHtA=R4Q$fS9s}ZSH{JKs z{RX-pp!)$aHXFap@t2c9e-rgCHMG4|H0u$STxBk9lJAX={l)dULyNDC9mu*5H z)hmAXMmAbNE`)Q~>Rd;@pZoxMo^2PvN8v)>FCs7Y+sDX{KU&R?y7|#+e$G<9;^oXXAc0?q}nEHtuKRe!Q%w-@u!|nSO2U7bS;eK>Z@+kXB~3vQdN_($Ypzawz^! zta2q>4WEKrMbA5n+v9f^>*Dtm8)A>hc|47~_)=_7KD!q=gO2{e=YwIk&m+8TmE)9n zdy=?AzxbQM-z@%S@HboLZx(;E_?yMwEdFNjH;cc0_&cJ(PdGkk@spzX7o6)BG5agd z_f_~Bd>y_4--K_$JM%h&*BQLd;B^MCGkBfB>kM9J@j8pwS-j5Tbr!GBE63@B@wyAI zvv{4w>nvVp@j8pwS-j5Tbst{$;dLKg_l>ev}RtXhxXnKHk#WqxPN{LYs7 zoyG4AerNDIi{DxN&f<3#zq5Y@zZc^7Vfg)Cc|?}iv_|nh#`0sJ3dTc;=h-sPvt^!V z%RJBGc^1#Jc%GF94B&d7JYWFd`{MhP2apGn2a&U34$Ot4;Al7&f`Yo$ z96OySFDB0*OZ?C3+XuvezQ}8X#|CfZ7d*CJJjjX%`W4%P$6g^;d=i4^UR8W4^4x34 z&%(8~|Ff~c?SA_q+zDa4avClV@Zy!cxR)2N*T84t zTHj^kT3U;jzpTY?;B6b;wi)TPX?Y#)cIb0EXrKjmJM_67 z#w7z)azf!_S1aG}o^kr$I6BR?)OUP4Qk7PpCl{o$$B;dw_m z+>gTyzC(O?}Ocj%ux^v@mo=MMdIhyJ-k|JlX#rO<1<-fZ~gN@c-)A`A?HfsaT1S{c$~!J zBpxU6cpDyX!{cpuybX{0Mdf~0ti$6ZOV;6Wk~Qn_IElv{`spMdcj%{+c-*0%PU3Ng zemaTANjy&CaT1S{c$~!JBpxU6xI=_b>ZdzI`J{fjL!>uHMmCe%Tp?{YZ_sJxAVarV z_UVo7slVQe$6N7uD;{sf;|~3G5|2Cd*GW9?&|fFxFoszc?;dh@NsSm&V@H@$~>+m~?-%0%L$M1d~zKMr#!tWto{xW_K@${E@ z`pZ1M4!@i5yAHqWczvGNr+9srE2`7X?d>Vb&f(oh!2(zaVRU^iUY17IXH zyTE1JgY4gFJ8| z51h*bLw1+IU==$EA5(n#ZMiT$;zV@whCHYvXZQ9@oa>vOKPh$7Olk zi9BvLk2{*Dx#lc8oG9K*A}5nm$f@Ksau0I0Y;6wAg`?nTI2Mih+P;gT=39)!W6hAIhr|=3KhPt9o-T1=ekd z9YM~8BjG6D=aEOlu^_s}j)(cMz;7pz3rTsX*w$svCCs-ZctnCnB*eBv6x%**j_v~7 z{wQ2%+ePHXBp(&qYQ?rD-m;mu)bW-&u`SJG8pXC|^DC|IlAAP`Un!VhDVSd=m|rQF zUn!VhDVSd=m|rQFUn!VhDe$}op4Y(h8hBm<&uid$4dz!0=2r^lR|@7=3g%bB+)6?` zOo)dG@h~ACCd9*pc$g3m6TC6O8xy=S!5b62@eJNLzC63tDIV7G$OMl}@W=#@Oz_AA zk4*5$%{+25kKD{7H}l9w9@!`!hP) zR0=#aVNRvMOB3c)3OqGoPNl$G6XsM3Jk}Khax+;&){=FOZ-68;L5uCJkcMs6oV1bc zxZgpByr+xomb3Pdy=><-)tLAZC&!Ru$tqIjFRs?{{s!Kk;QbA}Kf(JO zcz=TTH}L+1Ig^6eT4&CrAWy0@XHpPjo8(Gea-~`^wo9&5E5>%om1@Pz7~3Sq zHkmUiV9;iBCIu|oY|g~Ztt5ZOrp@L|3K+H7oJj$zHe*#CRyB&d&0=n|c-vggr4r>_ zDuHPYn3fQ4yW~=};%yVw)nQ#7*41HMqMT19FfW05VFb`jOM0b>dnQox8_Y)E562PUM&%}(Ci$$L9_Zzu2VgekE>^e4!K-COLWNR>RF>h{420R zL0-3#B|>huk~PxCVk?cqR_ZaP%C{ck&%ZHm^IJXJHa_0YuRG;+y>O-ME}_5MD7#C< zX2@7(%N&l8$DYP6i)Fp%z`5{#_yC+o7Z;Kj!xzlU+(MsUam-iYYw&gW27D8~1wXUj zz3_AR1^g23gI~e@@N0Mg9)xOm$oi|_m^UxYoj0>(jxBR+nPbZwTjtm@CxRqJkempT z)VJkCkfi=C$F4ax&9P^WEpwtpPNc}OX^u^EY?@=!9Gm9!Wd;3MK_6Doe}zbJWE2H> zu54+LhNiM{j(u}%n`76U%q1sl$;nu9*pt*p<*+BIpUSaW4nuMnl4P44+vM~~8}&&W zWg!U}NJ0jZ&@a`c_1iHtWK#1iSSab95MU)Usa~J!jZ2jGi;>7iPV}jDMKz?<Y|W6pQX1#lsh zMwh*8onh;6btr*@2{vzI^ENi$z~&p+d;^M)W`XTkv>l7Kv%q%R@2353+V7_Q?qO}u z*MFPTc8hS&L|Xi~{Vst^{Vp$}!BQr7t^Vg$dU{><*2CxP%Gq0Tr|d2H4%u6> zoV_K>*;@|{*Wg4A4cFjA&8W=H-9fU03vIiIyqNqL`EfnmC9*TKd-|%RzN%5?)~Ua0 zlDV~%Gq-mdjVAww%q^+!OX~ZQ`o5&TFRAZKmNT^)v9v}ktr1IW#L^nEv_>qg5ld@W zyN0!ESi6R`YsAtpat)c<^oWPQ)0RhVe+(XnC*VnV8lKU%-@_l^kFY}9RzhjyT2mgm z)|5xCHTuvbFR9UoCV5JYJ~YW&YV@H=9#d1!)N0C^T1`1qt0`w{HRVjLrkttOlruH! zJRIKuNoax{GqrzX+5&EMp;^q_|hm#>k(rb_5H2-{Z<)Tz3i-BW>zmN ztCx}0%f>>VALd<~WMeI|u@>1_OL_ELQy%@+$ODpMPmOFW%x*Wz1;SP7Mma#E{=X4( zYRaSE8tkc&12pOXo2*zKSA0!2_8P_vVoaB;tO;YfVsqh0ILh~V5{!QVN93t&USHXjVvzAo4=x`c~iVvp_duNq_k_!;rdD|Hl?wt6`O{{tb*&#J+3?V zxbEEJx^s`~&OOFPJs8%5VXYX}gJEe5>%p+?7?#Aatr)f$!)h_CfMH1t8`LWe>Xiod zN`rc(LA}zTUTILTG$>md+8hgZee4HFZjwP$eapZV%0uP^v36sdl

r$IgQ+d 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 XCsnH!M?balzj!b5tkplUC-eUSNwFir literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBold.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49109f8f5a4879c31488c92f88747700b443f459 GIT binary patch literal 56752 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 C=sXJm literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBoldItalic.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/TitilliumWeb-SemiBoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..22243ffd7fe63385a22782075ec38e60aae7a8ba GIT binary patch literal 64816 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 literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l001-webfont.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l001-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9fc52e547ad75587bd44831cee3550950d321a6d GIT binary patch literal 42400 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 literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l003-webfont.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l003-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..26e2d681c0dc8c53ec57b8e948a704af5f6945a2 GIT binary patch literal 40948 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%0DP$FOTejf;<8|~LlOows=~LMZ zi=w2rI-D54$}fqx7$QQL{nJ+`+w+3bLxSb9jDp;X@{R0h(ZoDUk~f!212c1qi^@bh z(d;$pd$a?shWsfoVhpiBI0`agUL*8cb@8Pci&CSFXGRue$#TbDk@wSZ3s#MY|^8^AB?5fIrKj zGtDcjs^zcLE6;zMgIh4qmtiff##-`4#DXfjl6OIK+!`X7T;g1@s&Qgc(!>va8z{sxNAvzOF3v z`W@sI%#aa=`Eu+hu%OfCG@v2U{^mQHd7cG#Cy#EO=Vue%WNMXH%Xffw1qG70rCGHD z7;FRyLoC}Dy%qf~Y%>GaZB{s=0z&OzJBLPTN5&SV8`{pLLe9NJKJ-uT8Q&zA1E;))4SliY3HBHF?jJ=;>*?cj1DW}EQDok!XVl%w_o z^Cj23)nVCb#-+gl$w5Kk_OzJAL4MXC&t4cjllhVU0mX%R5&krOFAa}-wDFV1IfzLa z-e9pe4DDri<0dkV4Pf(mb<=Re-i5WH7jgs)i!>)zJ;{Ojkve!BY!OB~@jL_v{4VAp z;d^L%IDXuMnoG$8G2W7GH5DfCPc!2BXTlY+FFq@;sOU~|NUX8>`KLt1z#z&g20ya%-oR~Ui~~C@ zQ$WKi1$%fIh=M&l4a$pxeucY1zJo}YBgzNAuFb`sI6``H6{ zmZ;UUUzJ)tAK&YyRkejEH=U~e?-BhI)p)j|QH^Ia`$@V`9VT+IN-x~?2`KO#jDOHh zfpPb=-K4J8Ms=uwmq^tmAMm&jW9(_WMqQ1Ka+~1I-1R!}X_0@2`|t!=8f0}mJ#8;- z8@FvzM?0vtQBJtvf)+9`$*%w4eqVW)XczjFctV4{r|p5J?L_5`a)Bljak9rDREX@r zabnL?H|$_?DkTfwl7Y5BP))7sUTQwh?hqcPYp&UUKg(}o<(iu*-$8z+V@;m{42+Ky z_lfc?z$LAC4^M?^M;p50d*Hn=wqBro7RhSDvQwi5mV4}(LH=U754besYdx2{EEU4P zF$MT0{|4mZQ9T?)dan=jawr#KMuxjOWd8vks5-f90QscLwS${CHD8%K0;y-K7EaeLAH zN{G;8A0YJ#(@CK~pFeiQ{`eF5PduLg#1St2@sGJrKa=~^Q@PJPO?WPF?ckH-L|`J8 zq-}3iM-%#<(9j^Qg68xjsOm|ivdNLGzRF%wTQ+^|wc`pM^`(=~R&LGv%<5Rt_0+14 z?0;MRL)V)&HGlH(@AWHV&+B~uu{+oqcb2kap*xkX&DY#qrG!J-<*MHX^cYH(n-QKH z0B;-g-f)oMP!G;G8vSvp6aJq9@WRpCfi+rp!+;kk1td4Lof|cJbGLHo-=u3rZkAMklZA5D%1k&^lHkShyIkc_KVp2J2Bs>J;^Chb*Z1}1- zC>aQ1g{ntLS&LzLx`nhsam0;E@Hdl>3ph?z{f}Wrp=}VSqNyEsSzXKh4?NJ?`T%^A zPs0hRJlnjMA6`yAN$@Awe1YE#*x~cQonVDlMRlDprHpCULrjm@<_)*DPG7JP+%7u4 zw7p>V&XAnYP_L%2S(Vw9wP`6?Ns$Gcih1Ik?wYol=FsrqpeS>CPU^WcePp@9tD+;s znwXfAoRp>yNj7C#?c^Q>y{5rd_YwR-1}-7tJCV1NvBdU#+e!#ouj$}cK)p8^#2i$?G2oV*2C zQV_*_8n6g0U^J1I-HjmK?&K*m;hyWbL37Wwceb}&(UWXRgnuq+B+m^z1(?z?PffRwISj8S{`>E#j zPi2`IWu=q7~e(oY4S*W|LY$z>bTO{VmC&>QwG*&BBKR79;~jt4w_HXW=PB;yb9 zxT=mEU1CI}Hx!i=hhP}V!V~DjOA@D=$Q3v@+dO^txVo;{nP`JVi!;1R=h>rv!;I1Pkwf0l>FJ+rxQ`4CU*E0x z?Bg}DBf7`&vFO8mvTK=W~Pic&lTJF@wE4zNg{l1zF7P6X~t;p!X7y9*G&8jW7 z|5DKfbY8^Ve9b=>{0dR$PIxsC`w#QEYLius^9c-z0B%2@Gv)fk@%a@Yb1P z?xM3+&P?o%j`F!AsG_NV!k#2{_Tiq_5Sq+Uys!L0b^TC0_EF63soJI;dwAPc+M-8md!o88t8ITQ z+D81(m~d-5@$lwbG=dqe2ct?rZrr>j`p6i&k5M<+;T?W7d~RSi8g+cvcutU)Ha{WJM zvGVd=mtjt4K+>gb5kNDzKu8G^Jm0Orz{gH*7kvuzOR=WgGp9~ln{Lg_&&*9F=Y7_t z`oxaX@Tf}-h^kqjU+B2^qD{U_!;z_>dt+=;Y_z-V0|EjNgDxAYZJ<6nyz$YzuJlY%0D=ias4)sibO|%JCGo&q^ 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 XgKRk1u;2LDxt-x@B+BMzjwAXHpU{=A literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l005-webfont.ttf b/doc/com.minres.scviewer.doc/src/asciidoc/fonts/titilliumtext22l005-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..901be70cefec314623740516e370b93c7af36cf6 GIT binary patch literal 41240 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 scupaGGyh$4bgL`u;jqJmm$ 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 literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo.png b/doc/com.minres.scviewer.doc/src/asciidoc/images/Minres_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..35240a8bc62b77ee58379dc84dcdf1c9e1b33592 GIT binary patch literal 24124 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 Ia{TxI09HsGOaK4? literal 0 HcmV?d00001 diff --git a/doc/com.minres.scviewer.doc/src/asciidoc/themes/mnrs-doc-theme.yml b/doc/com.minres.scviewer.doc/src/asciidoc/themes/mnrs-doc-theme.yml new file mode 100644 index 0000000..9446bfe --- /dev/null +++ b/doc/com.minres.scviewer.doc/src/asciidoc/themes/mnrs-doc-theme.yml @@ -0,0 +1,55 @@ +page: + layout: portrait + margin: [2.3cm, 2cm, 2cm, 2.2cm] + size: A4 +base: + font-color: #000000 + font-color-mnrs-grey: #6a747c + font-color-mnrs-blue: #197788 + font-family: titillium + font-size: 12 + line-height-length: 16 + line-height: $base-line-height-length / $base-font-size + align: justify + vertical-spacing: $base-line-height-length +heading: + font-color: $base-font-color-mnrs-grey + font-size: $base-font-size * 1.25 + font-style: bold + line-height: $base-line-height * 1.2 + margin-bottom: $vertical-spacing +link: + font-color: $base_font-color-mnrs-blue +outline-list: + indent: $base-font-size * 1.5 +footer: + height: $base-line-height-length * 3.0 + font-color: $base-font-color-mnrs-grey + font-size: $base-font-size * 0.9 + line-height: 1 + recto: + left: + content: '{description} v{revision}, © 2021 MINRES' + right: + content: '{page-number}' + verso: + left: + content: $footer_recto_right_content + right: + content: $footer_recto_left_content +table: + border_color: $base-font-color + border_width: 0.1 +title-page: + align: right + font-color: $base-font-color-mnrs-grey + font-size: $base-font-size * 1.80 + font-style: bold +font: + fallbacks: titilliumtext22l002-webfont.ttf + catalog: + titillium: + normal: titilliumtext22l002-webfont.ttf + bold: titilliumtext22l005-webfont.ttf + italic: TitilliumWeb-Italic.ttf + bold_italic: TitilliumWeb-BoldItalic.ttf diff --git a/doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore b/doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore index 824134a..b44ef38 100644 --- a/doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore +++ b/doc/com.minres.scviewer.doc/src/docbkx/images/.gitignore @@ -1 +1 @@ -/Minres_logo_square.png +/*.png From e629bdc5bc61311685cd5e1da9401170cbdcf904 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 16 May 2022 20:34:23 +0200 Subject: [PATCH 26/28] add LZ4 (de)compressor to target platform and add as input format --- .../META-INF/MANIFEST.MF | 3 +- .../scviewer/database/text/TextDbLoader.java | 29 +++++++++++++------ .../org.eclipse.core.resources.prefs | 2 -- .../com.minres.scviewer.target.target | 5 ++++ 4 files changed, 27 insertions(+), 12 deletions(-) delete mode 100644 releng/com.minres.scviewer.target/.settings/org.eclipse.core.resources.prefs diff --git a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF index 6de81a4..a6887f6 100644 --- a/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.database.text/META-INF/MANIFEST.MF @@ -9,7 +9,8 @@ Import-Package: org.osgi.framework;version="1.3.0" Require-Bundle: com.minres.scviewer.database, org.eclipse.osgi.services;bundle-version="3.4.0", com.google.guava;bundle-version="15.0.0", - org.eclipse.collections;bundle-version="10.4.0" + org.eclipse.collections;bundle-version="10.4.0", + org.apache.commons.compress;bundle-version="1.20.0" Service-Component: OSGI-INF/component.xml Bundle-ActivationPolicy: lazy Automatic-Module-Name: com.minres.scviewer.database.text diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java index 16fcf6e..95e616e 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java @@ -13,6 +13,7 @@ package com.minres.scviewer.database.text; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -33,6 +34,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; +import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream; import org.eclipse.collections.impl.map.mutable.UnifiedMap; import org.mapdb.DB; import org.mapdb.DBMaker; @@ -56,6 +58,8 @@ import com.minres.scviewer.database.tx.ITx; */ public class TextDbLoader implements IWaveformDbLoader { + enum FileType { NONE, PLAIN, GZIP, LZ4}; + /** the file size limit of a zipped txlog where the loader starts to use a file mapped database */ private static final long MEMMAP_LIMIT=256l*1024l*1024l; @@ -190,8 +194,9 @@ public class TextDbLoader implements IWaveformDbLoader { @Override public boolean canLoad(File inputFile) { if (!inputFile.isDirectory() && inputFile.exists()) { - boolean gzipped = isGzipped(inputFile); - try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ + FileType fType = getFileType(inputFile); + try(InputStream stream = fType==FileType.GZIP ? new GZIPInputStream(new FileInputStream(inputFile)) : + fType==FileType.LZ4? new FramedLZ4CompressorInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ byte[] buffer = new byte[x.length]; int readCnt = stream.read(buffer, 0, x.length); if (readCnt == x.length) { @@ -213,13 +218,18 @@ public class TextDbLoader implements IWaveformDbLoader { * @param f the f * @return true, if is gzipped */ - private static boolean isGzipped(File f) { + private static FileType getFileType(File f) { try (InputStream is = new FileInputStream(f)) { - byte[] signature = new byte[2]; + byte[] signature = new byte[4]; int nread = is.read(signature); // read the gzip signature - return nread == 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b; + if(nread > 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b) + return FileType.GZIP; + else if(nread>4 && signature[0] == (byte) 0x04 && signature[1] == (byte) 0x22 && signature[2] == (byte) 0x4d && signature[3] == (byte) 0x18) + return FileType.LZ4; + else + return FileType.PLAIN; } catch (IOException e) { - return false; + return FileType.NONE; } } @@ -235,8 +245,8 @@ public class TextDbLoader implements IWaveformDbLoader { @Override public void load(IWaveformDb db, File file) throws InputFormatException { dispose(); - boolean gzipped = isGzipped(file); - if (file.length() < MEMMAP_LIMIT * (gzipped ? 1 : 10) + FileType fType = getFileType(file); + if (file.length() < MEMMAP_LIMIT * (fType!=FileType.PLAIN ? 1 : 10) || "memory".equals(System.getProperty("ScvBackingDB", "file"))) mapDb = DBMaker.memoryDirectDB().make(); else { @@ -256,7 +266,8 @@ public class TextDbLoader implements IWaveformDbLoader { try { parser.txSink = mapDb.hashMap("transactions", Serializer.LONG, Serializer.JAVA).create(); - parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file)); + InputStream is = new BufferedInputStream(new FileInputStream(file)); + parser.parseInput(fType==FileType.GZIP ? new GZIPInputStream(is) : fType==FileType.LZ4? new FramedLZ4CompressorInputStream(is) : is); transactions = parser.txSink; } catch (IllegalArgumentException | ArrayIndexOutOfBoundsException e) { } catch (Exception e) { diff --git a/releng/com.minres.scviewer.target/.settings/org.eclipse.core.resources.prefs b/releng/com.minres.scviewer.target/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0..0000000 --- a/releng/com.minres.scviewer.target/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index e4d2353..f16827f 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -37,6 +37,11 @@ + + + + + \ No newline at end of file From c9c6db8e4c84c98564c39ed6f7ca27a4bfc7cd7d Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 16 May 2022 21:07:32 +0200 Subject: [PATCH 27/28] update target platform to release 21-12 --- .../build.properties | 2 -- .../e4/application/handlers/EnableHover.java | 1 - .../application/handlers/EnableTxDetails.java | 1 - .../e4/application/parts/WaveformViewer.java | 1 - pom.xml | 18 +++++------------- .../com.minres.scviewer.target.target | 10 +++++----- 6 files changed, 10 insertions(+), 23 deletions(-) diff --git a/plugins/com.minres.scviewer.e4.application.help/build.properties b/plugins/com.minres.scviewer.e4.application.help/build.properties index b439b53..1a5e3ad 100644 --- a/plugins/com.minres.scviewer.e4.application.help/build.properties +++ b/plugins/com.minres.scviewer.e4.application.help/build.properties @@ -1,5 +1,3 @@ -source.. = src/ -output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ .,\ diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableHover.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableHover.java index f5494a8..3526b17 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableHover.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableHover.java @@ -17,7 +17,6 @@ import org.osgi.service.prefs.BackingStoreException; import com.minres.scviewer.e4.application.preferences.PreferenceConstants; -@SuppressWarnings("restriction") public class EnableHover { static final String TAG_NAME = "EnableHover"; //$NON-NLS-1$ diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableTxDetails.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableTxDetails.java index 217c1dc..46f9897 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableTxDetails.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/EnableTxDetails.java @@ -18,7 +18,6 @@ import org.osgi.service.prefs.BackingStoreException; import com.minres.scviewer.e4.application.preferences.PreferenceConstants; -@SuppressWarnings("restriction") public class EnableTxDetails { static final String TAG_NAME = "EnableTxDetails"; //$NON-NLS-1$ diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 04a1584..2b280b9 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -109,7 +109,6 @@ import com.minres.scviewer.e4.application.preferences.PreferenceConstants; /** * The Class WaveformViewerPart. */ -@SuppressWarnings("restriction") public class WaveformViewer implements IFileChangeListener, IPreferenceChangeListener, DisposeListener { /** The Constant ACTIVE_WAVEFORMVIEW. */ diff --git a/pom.xml b/pom.xml index 47be6d9..b673097 100644 --- a/pom.xml +++ b/pom.xml @@ -108,24 +108,13 @@ plugin-source - - - - - org.eclipse.tycho.extras - tycho-source-feature-plugin - ${tycho-version} - - - source-feature - package + feature-source - source-feature + feature-source - @@ -135,9 +124,12 @@ + + + org.eclipse.tycho tycho-p2-plugin diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index f16827f..e77999c 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -3,7 +3,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + From 79a5343cde06e2375000ae8c2d6a5e67f892a1cd Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 16 May 2022 21:13:00 +0200 Subject: [PATCH 28/28] update version numbers --- doc/com.minres.scviewer.doc/pom.xml | 2 +- features/com.minres.scviewer.database.feature/pom.xml | 2 +- features/com.minres.scviewer.e4.feature/pom.xml | 2 +- features/com.minres.scviewer.e4.help.feature/pom.xml | 2 +- features/com.minres.scviewer.e4.platform.feature/pom.xml | 2 +- features/com.minres.scviewer.feature/pom.xml | 2 +- features/com.minres.scviewer.ui.feature/pom.xml | 2 +- plugins/com.minres.scviewer.database.sqlite/pom.xml | 2 +- plugins/com.minres.scviewer.database.text/pom.xml | 2 +- plugins/com.minres.scviewer.database.ui.swt/pom.xml | 2 +- plugins/com.minres.scviewer.database.vcd/pom.xml | 2 +- plugins/com.minres.scviewer.database/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.e4.application.help/pom.xml | 2 +- .../com.minres.scviewer.e4.application/META-INF/MANIFEST.MF | 2 +- plugins/com.minres.scviewer.e4.application/pom.xml | 2 +- plugins/com.minres.scviewer.ui/pom.xml | 2 +- pom.xml | 6 ++---- products/com.minres.scviewer.e4.product/pom.xml | 4 ++-- products/com.minres.scviewer.e4.product/scviewer.product | 2 +- releng/com.minres.scviewer.target/pom.xml | 2 +- releng/com.minres.scviewer.updateSite/pom.xml | 2 +- tests/com.minres.scviewer.database.test/pom.xml | 2 +- 23 files changed, 25 insertions(+), 27 deletions(-) diff --git a/doc/com.minres.scviewer.doc/pom.xml b/doc/com.minres.scviewer.doc/pom.xml index 71950ca..23cab87 100644 --- a/doc/com.minres.scviewer.doc/pom.xml +++ b/doc/com.minres.scviewer.doc/pom.xml @@ -7,7 +7,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. diff --git a/features/com.minres.scviewer.database.feature/pom.xml b/features/com.minres.scviewer.database.feature/pom.xml index 034912f..b5553f2 100644 --- a/features/com.minres.scviewer.database.feature/pom.xml +++ b/features/com.minres.scviewer.database.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 3.0.0-SNAPSHOT diff --git a/features/com.minres.scviewer.e4.feature/pom.xml b/features/com.minres.scviewer.e4.feature/pom.xml index 7dc7611..680e93f 100644 --- a/features/com.minres.scviewer.e4.feature/pom.xml +++ b/features/com.minres.scviewer.e4.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 1.1.0-SNAPSHOT diff --git a/features/com.minres.scviewer.e4.help.feature/pom.xml b/features/com.minres.scviewer.e4.help.feature/pom.xml index a6a6050..b011cb8 100644 --- a/features/com.minres.scviewer.e4.help.feature/pom.xml +++ b/features/com.minres.scviewer.e4.help.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 1.0.0-SNAPSHOT diff --git a/features/com.minres.scviewer.e4.platform.feature/pom.xml b/features/com.minres.scviewer.e4.platform.feature/pom.xml index 734d0f2..e54aa8e 100644 --- a/features/com.minres.scviewer.e4.platform.feature/pom.xml +++ b/features/com.minres.scviewer.e4.platform.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 1.0.0-SNAPSHOT diff --git a/features/com.minres.scviewer.feature/pom.xml b/features/com.minres.scviewer.feature/pom.xml index 904e438..c4ef4d3 100644 --- a/features/com.minres.scviewer.feature/pom.xml +++ b/features/com.minres.scviewer.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 1.1.0-SNAPSHOT diff --git a/features/com.minres.scviewer.ui.feature/pom.xml b/features/com.minres.scviewer.ui.feature/pom.xml index 9f65328..6ff0b7a 100644 --- a/features/com.minres.scviewer.ui.feature/pom.xml +++ b/features/com.minres.scviewer.ui.feature/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 1.1.0-SNAPSHOT diff --git a/plugins/com.minres.scviewer.database.sqlite/pom.xml b/plugins/com.minres.scviewer.database.sqlite/pom.xml index 9ffe5b1..707af5c 100644 --- a/plugins/com.minres.scviewer.database.sqlite/pom.xml +++ b/plugins/com.minres.scviewer.database.sqlite/pom.xml @@ -4,7 +4,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.database.text/pom.xml b/plugins/com.minres.scviewer.database.text/pom.xml index f96e290..06fcec1 100644 --- a/plugins/com.minres.scviewer.database.text/pom.xml +++ b/plugins/com.minres.scviewer.database.text/pom.xml @@ -6,7 +6,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.database.ui.swt/pom.xml b/plugins/com.minres.scviewer.database.ui.swt/pom.xml index 95a4bcf..f38087c 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/pom.xml +++ b/plugins/com.minres.scviewer.database.ui.swt/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. 4.0.0-SNAPSHOT diff --git a/plugins/com.minres.scviewer.database.vcd/pom.xml b/plugins/com.minres.scviewer.database.vcd/pom.xml index 133046f..0aa62e5 100644 --- a/plugins/com.minres.scviewer.database.vcd/pom.xml +++ b/plugins/com.minres.scviewer.database.vcd/pom.xml @@ -5,7 +5,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.database/pom.xml b/plugins/com.minres.scviewer.database/pom.xml index 93195ef..431fb60 100644 --- a/plugins/com.minres.scviewer.database/pom.xml +++ b/plugins/com.minres.scviewer.database/pom.xml @@ -4,7 +4,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF index 9b463f6..ae94659 100644 --- a/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application.help/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: SCViewer Help Bundle-SymbolicName: com.minres.scviewer.e4.application.help;singleton:=true -Bundle-Version: 2.15.1 +Bundle-Version: 2.16.0 Bundle-Vendor: MINRES Technologies GmbH Automatic-Module-Name: com.minres.scviewer.e4.application.help Bundle-RequiredExecutionEnvironment: JavaSE-11 diff --git a/plugins/com.minres.scviewer.e4.application.help/pom.xml b/plugins/com.minres.scviewer.e4.application.help/pom.xml index 614de66..1b5b923 100644 --- a/plugins/com.minres.scviewer.e4.application.help/pom.xml +++ b/plugins/com.minres.scviewer.e4.application.help/pom.xml @@ -6,7 +6,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index cfc1e01..e4fd2c3 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: com.minres.scviewer.e4.application;singleton:=true -Bundle-Version: 2.15.1 +Bundle-Version: 2.16.0 Bundle-Vendor: %Bundle-Vendor Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.core.runtime;bundle-version="3.11.1", diff --git a/plugins/com.minres.scviewer.e4.application/pom.xml b/plugins/com.minres.scviewer.e4.application/pom.xml index 5e5b2fc..bf4f124 100644 --- a/plugins/com.minres.scviewer.e4.application/pom.xml +++ b/plugins/com.minres.scviewer.e4.application/pom.xml @@ -6,7 +6,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/plugins/com.minres.scviewer.ui/pom.xml b/plugins/com.minres.scviewer.ui/pom.xml index 0db37e1..30a2580 100644 --- a/plugins/com.minres.scviewer.ui/pom.xml +++ b/plugins/com.minres.scviewer.ui/pom.xml @@ -4,7 +4,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-plugin diff --git a/pom.xml b/pom.xml index b673097..fa43c77 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 pom releng/com.minres.scviewer.target @@ -30,8 +30,6 @@ 2.3.0 - 3.6.0-03 - 3.0.3-01 ${project.basedir}/../../.. @@ -71,7 +69,7 @@ com.minres.scviewer com.minres.scviewer.target - 2.15.1 + 2.16.0 org.eclipse.justj.openjdk.hotspot.jre.minimal-15 diff --git a/products/com.minres.scviewer.e4.product/pom.xml b/products/com.minres.scviewer.e4.product/pom.xml index 585b551..38ff11b 100644 --- a/products/com.minres.scviewer.e4.product/pom.xml +++ b/products/com.minres.scviewer.e4.product/pom.xml @@ -6,11 +6,11 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. com.minres.scviewer.e4.product - 2.15.1 + 2.16.0 eclipse-repository com.minres.scviewer diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index d1f7a38..ba9b8c2 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -1,7 +1,7 @@ - + diff --git a/releng/com.minres.scviewer.target/pom.xml b/releng/com.minres.scviewer.target/pom.xml index 63e59e3..39ce240 100644 --- a/releng/com.minres.scviewer.target/pom.xml +++ b/releng/com.minres.scviewer.target/pom.xml @@ -12,7 +12,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. diff --git a/releng/com.minres.scviewer.updateSite/pom.xml b/releng/com.minres.scviewer.updateSite/pom.xml index aeb9809..3de80a2 100644 --- a/releng/com.minres.scviewer.updateSite/pom.xml +++ b/releng/com.minres.scviewer.updateSite/pom.xml @@ -7,7 +7,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. diff --git a/tests/com.minres.scviewer.database.test/pom.xml b/tests/com.minres.scviewer.database.test/pom.xml index d70e6c4..0d29076 100644 --- a/tests/com.minres.scviewer.database.test/pom.xml +++ b/tests/com.minres.scviewer.database.test/pom.xml @@ -6,7 +6,7 @@ com.minres.scviewer com.minres.scviewer.parent - 2.15.1 + 2.16.0 ../.. eclipse-test-plugin