--- /dev/null
+package org.tizen.dynamicanalyzer.widgets.button.dropdown;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Timer;\r
+import java.util.TimerTask;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.DisposeEvent;\r
+import org.eclipse.swt.events.DisposeListener;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.layout.FormAttachment;\r
+import org.eclipse.swt.layout.FormData;\r
+import org.eclipse.swt.layout.FormLayout;\r
+import org.eclipse.swt.widgets.Canvas;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.tizen.dynamicanalyzer.util.Logger;\r
+import org.tizen.dynamicanalyzer.widgets.DAWidgetConstants;\r
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;\r
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonAttribute;\r
+import org.tizen.dynamicanalyzer.widgets.button.IDACustomButtonRenderer;\r
+import org.tizen.dynamicanalyzer.widgets.combo.DACustomComboPopupRenderer;\r
+import org.tizen.dynamicanalyzer.widgets.combo.IDACustomComboPopupRenderer;\r
+import org.tizen.dynamicanalyzer.widgets.combo.Messages;\r
+import org.tizen.dynamicanalyzer.widgets.helper.ColorResources;\r
+\r
+public class DACustomDropdown extends Canvas {\r
+ public static final int MAX_SIZE = 10;\r
+ public static final int STATE_NORMAL = 0;\r
+ public static final int STATE_HOVER = 1;\r
+ public static final int STATE_PUSH = 2;\r
+ public static final int STATE_DISABLE = 3;\r
+ public static final int STATE_DROP = 4;\r
+ \r
+ public static final int TEXT_ALIGN_CENTER = SWT.CENTER;\r
+ public static final int TEXT_ALIGN_LEFT = SWT.LEFT;\r
+ public static final int TEXT_ALIGN_RIGHT = SWT.RIGHT;\r
+\r
+ public static final int TYPE_IMAGE = 0;\r
+ public static final int TYPE_COLOR = 1;\r
+ public static final int TYPE_GRADATION = 2;\r
+\r
+ private static final int pageSize = 5;\r
+\r
+ Composite parent;\r
+ private Canvas dropdown = null;\r
+ private Canvas popup = null;\r
+ private int itemHeight = 0;\r
+ private int tmpItemIndex = 0;\r
+ private int itemIndex = 0;\r
+ private boolean dirty = false;\r
+ private Timer closeTimer = null;\r
+ private static final int CLOSE_WAITING_TIME = 500;\r
+ private List<String> items;\r
+ private List<Rectangle> rects = null;\r
+ private boolean enabled = true;\r
+ private Shell childShell = null;\r
+ private Shell parentShell = null;\r
+ private int selection = 0;\r
+ private int tmpSelection = 0;\r
+ private Font itemFont = null;\r
+ private Color itemFontColor = null;\r
+ private IDACustomComboPopupRenderer popupRenderer = new DACustomComboPopupRenderer();\r
+ \r
+ //Tooltip Disabled\r
+ //private DACustomdropdownTooltip tooltip = null;\r
+\r
+ // dropdown button\r
+ private int state = STATE_NORMAL; // 0 normal 1 hover 2 push 3 disable\r
+ protected DACustomButtonAttribute attr;\r
+ private boolean showSelectedText = true;\r
+ private DACustomDropdownRenderer dropdownRenderer = new DACustomDropdownRenderer();\r
+\r
+ // arrow button\r
+ private static final int arrowButtonHeight = 15;\r
+ private DACustomButton upArrowButton = null;\r
+ private DACustomButton downArrowButton = null;\r
+ private Image buttonUp = null;\r
+ private Image buttonDown = null;\r
+ private List<Color> arrowColors = null;\r
+ private List<Color> arrowOutlineColors = null;\r
+ private List<Image> arrowImages = null;\r
+ private IDACustomButtonRenderer buttonRenderer = null;\r
+ \r
+ public DACustomDropdown(Composite parent, int style) {\r
+ super(parent, style);\r
+ dropdown = this;\r
+\r
+ this.parent = parent;\r
+ parentShell = parent.getShell();\r
+ parentShell.addListener(SWT.Move, parentShellListener);\r
+ addPaintListener(dropdownPaintListener);\r
+ setForeground(ColorResources.WHITE);\r
+ addListeners();\r
+ initdropdown();\r
+ attr = new DACustomButtonAttribute();\r
+ attr.setAlign(TEXT_ALIGN_LEFT);\r
+ }\r
+\r
+ protected void addListeners() {\r
+ addListener(SWT.MouseEnter, dropdownMouseListener);\r
+ addListener(SWT.MouseHover, dropdownMouseListener);\r
+ addListener(SWT.MouseExit, dropdownMouseListener);\r
+ addListener(SWT.MouseDown, dropdownMouseListener);\r
+ addListener(SWT.MouseMove, dropdownMouseListener);\r
+ addListener(SWT.MouseUp, dropdownMouseListener);\r
+ }\r
+\r
+ public void setFontPoint(Point fontPoint) {\r
+ attr.setFontPoint(fontPoint);\r
+ }\r
+\r
+ public String getText() {\r
+ if (selection < 0) {\r
+ return attr.getText();\r
+ }\r
+ if (getItems().size() > 0) {\r
+ return getItems().get(itemIndex + selection);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public List<String> getItems() {\r
+ if (null == items) {\r
+ items = new ArrayList<String>();\r
+ }\r
+ return items;\r
+ }\r
+ \r
+ private List<Rectangle> getRects() {\r
+ if (null == rects) {\r
+ rects = new ArrayList<Rectangle>();\r
+ }\r
+ return rects;\r
+ }\r
+\r
+ private void changedropdownState(int s) {\r
+ state = s;\r
+ redraw();\r
+ }\r
+\r
+ public void addSelectionListener(DACustomDropdownListener listener) {\r
+ popupSelectionListener = listener;\r
+ }\r
+ \r
+ private Listener popupSelectionListener = new DACustomDropdownListener() {\r
+\r
+ @Override\r
+ public void selectionEvent(DACustomDropdown dropdown) {\r
+ // TODO Auto-generated method stub\r
+ Logger.debug("default selection" + dropdown.getText()); //$NON-NLS-1$\r
+ }\r
+ };\r
+ \r
+ private Listener parentShellListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ if (event.type == SWT.Move) {\r
+ if (childShell != null && !childShell.isDisposed()) {\r
+ \r
+ // Tooltip Disabled\r
+ //if (null != tooltip) {\r
+ // tooltip.close();\r
+ //}\r
+ childShell.close();\r
+ childShell = null;\r
+\r
+ }\r
+ }\r
+ }\r
+ };\r
+ \r
+ private Listener dropdownMouseListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ Canvas dropdownArea = (Canvas) event.widget;\r
+ Rectangle rect = dropdownArea.getClientArea();\r
+ if (enabled) {\r
+ if (event.type == SWT.MouseEnter) {\r
+ changedropdownState(STATE_HOVER);\r
+ if (null != closeTimer) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseHover) {\r
+ if (rect.contains(event.x, event.y)) {\r
+ if (0 != (event.stateMask & SWT.BUTTON1)) {\r
+ changedropdownState(STATE_PUSH);\r
+ } else if (0 == (event.stateMask & SWT.BUTTON1)) {\r
+ changedropdownState(STATE_HOVER);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseDown) {\r
+ changedropdownState(STATE_PUSH);\r
+ }\r
+\r
+ if (event.type == SWT.MouseUp) {\r
+ changedropdownState(STATE_HOVER);\r
+ if (childShell == null || childShell.isDisposed()) {\r
+ if (closeTimer != null) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ openChildShell();\r
+ } else {\r
+ childShell.close();\r
+ childShell = null;\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseMove) {\r
+ if (!rect.contains(event.x, event.y)) {\r
+ changedropdownState(STATE_NORMAL);\r
+ } else if (!rect.contains(event.x, event.y)) {\r
+ if (0 != (event.stateMask & SWT.BUTTON1)) {\r
+ changedropdownState(STATE_PUSH);\r
+ } else if (0 == (event.stateMask & SWT.BUTTON1)) {\r
+ changedropdownState(STATE_HOVER);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseExit) {\r
+ changedropdownState(STATE_NORMAL);\r
+ if (event.x < rect.x || event.x >= rect.x + rect.width\r
+ || event.y < rect.y ){\r
+ closePopup(CLOSE_WAITING_TIME);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ };\r
+\r
+ private int getShellWidth() {\r
+ if (getItems().isEmpty()) {\r
+ return 0;\r
+ }\r
+ int max = 0;\r
+ int size = items.size();\r
+ GC gc = new GC(parent.getDisplay(), SWT.NONE);\r
+ for (int i = 0; i < size; i++) {\r
+ Point p = gc.textExtent(items.get(i), SWT.DRAW_MNEMONIC);\r
+ if (p.x > max) {\r
+ max = p.x;\r
+ }\r
+ }\r
+ max += 10;\r
+ gc.dispose();\r
+ return max;\r
+ }\r
+\r
+ public int getItemHeight() {\r
+ return itemHeight;\r
+ }\r
+\r
+ public void setItemHeight(int height) {\r
+ itemHeight = height;\r
+ }\r
+\r
+ private void openChildShell() {\r
+ childShell = new Shell(parent.getShell(), SWT.NO_TRIM);\r
+ childShell.setLayout(new FormLayout());\r
+ Point p = dropdown.toDisplay(0, 0);\r
+ Rectangle rect = dropdown.getBounds();\r
+ int size = getItems().size();\r
+\r
+ int boundSize = (size > MAX_SIZE) ? MAX_SIZE : (size > 0) ? size : 1;\r
+\r
+ int textSize = getShellWidth() + 4;\r
+ int shellWidth = (textSize > rect.width) ? textSize : rect.width;\r
+ int height = 0;\r
+\r
+ if (getItemHeight() == 0) {\r
+ height = rect.height;\r
+ } else {\r
+ height = getItemHeight();\r
+ }\r
+ int shellHeight = height * boundSize + 5;\r
+\r
+ childShell.setSize(shellWidth, shellHeight);\r
+ childShell.setLocation(p.x, p.y + rect.height);\r
+ childShell.addDisposeListener(new DisposeListener() {\r
+\r
+ @Override\r
+ public void widgetDisposed(DisposeEvent e) {\r
+ if (null != closeTimer) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ }\r
+ });\r
+ setSelect(attr.getText());\r
+\r
+ tmpSelection = selection;\r
+ tmpItemIndex = itemIndex;\r
+\r
+ popup = new Canvas(childShell, SWT.DOUBLE_BUFFERED);\r
+ popup.setData(this);\r
+ popup.setBackground(ColorResources.WHITE);\r
+ popup.addPaintListener(popupPaintListener);\r
+ popup.addListener(SWT.MouseUp, popupMouseEventListener);\r
+ popup.addListener(SWT.MouseMove, popupMouseEventListener);\r
+ popup.addListener(SWT.FocusIn, popupMouseEventListener);\r
+ popup.addListener(SWT.MouseUp, popupSelectionListener);\r
+ popup.addListener(SWT.MouseWheel, popupMouseEventListener);\r
+ popup.addListener(SWT.MouseExit, popupMouseEventListener);\r
+ popup.addListener(SWT.MouseEnter, popupMouseEventListener);\r
+\r
+ if (size > MAX_SIZE) {\r
+ upArrowButton = makeButton();\r
+ if (buttonUp == null) {\r
+ upArrowButton.setText(Messages.DACustomCombo_1);\r
+ } else {\r
+ upArrowButton.setButtonImages(buttonUp, buttonUp, buttonUp, buttonUp);\r
+ }\r
+ FormData data = new FormData();\r
+ data.top = new FormAttachment(0, 0);\r
+ data.left = new FormAttachment(0, 0);\r
+ data.right = new FormAttachment(100, 0);\r
+ data.height = arrowButtonHeight;\r
+ upArrowButton.setLayoutData(data);\r
+ upArrowButton.addListener(SWT.MouseExit, upButtonMouseListener);\r
+ upArrowButton.addListener(SWT.MouseEnter, upButtonMouseListener);\r
+ upArrowButton.addListener(SWT.MouseUp, upButtonMouseListener);\r
+ upArrowButton.addListener(SWT.FocusIn, upButtonMouseListener);\r
+ shellHeight += arrowButtonHeight;\r
+ if (tmpItemIndex > 0) {\r
+ upArrowButton.setButtonEnabled(true);\r
+ } else {\r
+ upArrowButton.setButtonEnabled(false);\r
+ }\r
+\r
+ data = new FormData();\r
+ data.top = new FormAttachment(upArrowButton, 0);\r
+ data.left = new FormAttachment(0, 0);\r
+ data.right = new FormAttachment(100, 0);\r
+ data.height = height * boundSize + 5 - 2;\r
+ popup.setLayoutData(data);\r
+\r
+ downArrowButton = makeButton();\r
+ if (null == buttonDown) {\r
+ downArrowButton.setText(Messages.DACustomCombo_2);\r
+ } else {\r
+ downArrowButton.setButtonImages(buttonDown, buttonDown, buttonDown,\r
+ buttonDown);\r
+ }\r
+ data = new FormData();\r
+ data.top = new FormAttachment(popup, 0);\r
+ data.left = new FormAttachment(0, 0);\r
+ data.right = new FormAttachment(100, 0);\r
+ data.height = arrowButtonHeight;\r
+ downArrowButton.setLayoutData(data);\r
+ downArrowButton.addListener(SWT.MouseExit, downButtonMouseListener);\r
+ downArrowButton.addListener(SWT.MouseEnter, downButtonMouseListener);\r
+ downArrowButton.addListener(SWT.MouseUp, downButtonMouseListener);\r
+ downArrowButton.addListener(SWT.FocusIn, downButtonMouseListener);\r
+ shellHeight += arrowButtonHeight;\r
+ if (tmpItemIndex + MAX_SIZE < size - 1) {\r
+ downArrowButton.setButtonEnabled(true);\r
+ } else {\r
+ downArrowButton.setButtonEnabled(false);\r
+ }\r
+\r
+ childShell.setSize(shellWidth, shellHeight);\r
+ } else {\r
+ FormData data = new FormData();\r
+ data.top = new FormAttachment(0, 0);\r
+ data.left = new FormAttachment(0, 0);\r
+ data.right = new FormAttachment(100, 0);\r
+ data.height = shellHeight - 2;\r
+ popup.setLayoutData(data);\r
+ }\r
+\r
+ getRects().clear();\r
+ for (int i = 0; i < boundSize; i++) {\r
+ Rectangle r = new Rectangle(2, 2 + i * height, shellWidth - 2, height);\r
+ getRects().add(r);\r
+ }\r
+ childShell.open();\r
+ }\r
+\r
+ private PaintListener popupPaintListener = new PaintListener() {\r
+\r
+ @Override\r
+ public void paintControl(PaintEvent e) {\r
+ List<String> items = getItems();\r
+ List<String> input = new ArrayList<String>();\r
+ int size = (items.size() > MAX_SIZE) ? MAX_SIZE : items.size();\r
+ for (int i = 0; i < size; i++) {\r
+ input.add(items.get(tmpItemIndex + i));\r
+ }\r
+ if (input.size() != getRects().size()) {\r
+ int inputSize = input.size();\r
+ int rectsSize = getRects().size();\r
+\r
+ if (inputSize > rectsSize) {\r
+ reAdjustRectsAdd(rectsSize, inputSize);\r
+ }\r
+ if (inputSize < rectsSize) {\r
+ reAdjustRectsRemove(rectsSize, inputSize);\r
+ }\r
+ popupRenderer.draw(e.gc, popup, getRects(), tmpSelection,\r
+ input, itemFont, itemFontColor);\r
+ childShell.close();\r
+ childShell = null;\r
+ openChildShell();\r
+ redraw();\r
+ //Tooltip Disabled\r
+ //setTooltip(tooltip);\r
+\r
+ } else {\r
+ popupRenderer.draw(e.gc, popup, getRects(), tmpSelection,\r
+ input, itemFont, itemFontColor);\r
+ }\r
+\r
+ }\r
+ };\r
+ \r
+ public void reAdjustRectsAdd(int sizeofRects, int sizeofInput){ \r
+ for(int i = sizeofRects; i<sizeofInput; i++)\r
+ {\r
+ Rectangle rect = dropdown.getBounds();\r
+ int textSize = getShellWidth() + 4;\r
+ int shellWidth = (textSize > rect.width) ? textSize : rect.width;\r
+ int height = 0;\r
+ if (getItemHeight() == 0) {\r
+ height = rect.height;\r
+ } else {\r
+ height = getItemHeight();\r
+ }\r
+ Rectangle r = new Rectangle(2, 50 + i * height, shellWidth - 2, height);\r
+ getRects().add(i, r);\r
+ }\r
+ }\r
+ \r
+ public void reAdjustRectsRemove(int sizeofRects, int sizeofInput){ \r
+ for(int i = sizeofInput; i<sizeofRects; i++)\r
+ {\r
+ getRects().remove(i);\r
+ } \r
+ }\r
+ \r
+ public void setItemFont(Font itemFont) {\r
+ this.itemFont = itemFont;\r
+ }\r
+\r
+ public void setText(String text) {\r
+ if (!setSelect(text)) {\r
+ attr.setText(text);\r
+ selection = -1;\r
+ redraw();\r
+ }\r
+ }\r
+ \r
+ public void setTextForce(String text) {\r
+ attr.setText(text);\r
+ selection = -1;\r
+ redraw();\r
+ }\r
+\r
+ \r
+ private boolean setSelect(String text) {\r
+ if (getItems().isEmpty()) {\r
+ return false;\r
+ }\r
+\r
+ int index = items.indexOf(text);\r
+ if (index < 0) {\r
+ Logger.debug("dropdown indexing bug!");\r
+ return false;\r
+ }\r
+\r
+ itemIndex = 0;\r
+ int size = items.size();\r
+ if (size < MAX_SIZE) {\r
+ selection = index;\r
+ select(selection);\r
+ } else if (index + MAX_SIZE >= size) {\r
+ int lower = size - index;\r
+ selection = MAX_SIZE - lower;\r
+ itemIndex = size - MAX_SIZE;\r
+ select(selection);\r
+ } else {\r
+ if (index >= MAX_SIZE) { \r
+ itemIndex = index / MAX_SIZE;\r
+ itemIndex *= MAX_SIZE;\r
+ index %= MAX_SIZE;\r
+ }\r
+\r
+ selection = index;\r
+ select(selection);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ public void upEvent() {\r
+ if (isShowSelectedText()) {\r
+ if (getItems().size() > 0) {\r
+ setText(getItems().get(itemIndex + selection));\r
+ }\r
+ } else if (null != attr.getText()) {\r
+ setText(attr.getText());\r
+ } else {\r
+ setText(DAWidgetConstants.EMPTY_STRING);\r
+ }\r
+ if (childShell != null) {\r
+ childShell.close();\r
+ }\r
+ childShell = null;\r
+ }\r
+\r
+ private Listener popupMouseEventListener = new Listener() {\r
+\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ if (event.type == SWT.MouseMove) {\r
+ List<Rectangle> rs = getRects();\r
+ int size = rs.size();\r
+ for (int i = 0; i < size; i++) {\r
+ if (rs.get(i).contains(event.x, event.y)) {\r
+ tmpSelection = i;\r
+ popup.redraw();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseUp) {\r
+ selection = tmpSelection;\r
+ itemIndex = tmpItemIndex;\r
+ }\r
+\r
+ if (event.type == SWT.MouseWheel) {\r
+ int size = getItems().size();\r
+ if (null != downArrowButton && !downArrowButton.isDisposed()\r
+ && null != upArrowButton && !upArrowButton.isDisposed()) {\r
+ if (event.count < 0) {\r
+ if (tmpItemIndex - event.count + MAX_SIZE >= size - 1) {\r
+ tmpItemIndex = size - MAX_SIZE;\r
+ downArrowButton.setButtonEnabled(false);\r
+ } else {\r
+ tmpItemIndex -= event.count;\r
+ }\r
+\r
+ if (tmpItemIndex > 0) {\r
+ upArrowButton.setButtonEnabled(true);\r
+ }\r
+ } else {\r
+\r
+ if (tmpItemIndex - event.count < 0) {\r
+ tmpItemIndex = 0;\r
+ upArrowButton.setButtonEnabled(false);\r
+ } else {\r
+ tmpItemIndex -= event.count;\r
+ }\r
+\r
+ if (tmpItemIndex + event.count < size - 1) {\r
+ downArrowButton.setButtonEnabled(true);\r
+ }\r
+ }\r
+ popup.redraw();\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseExit) {\r
+ Canvas canvas = (Canvas) event.widget;\r
+ Rectangle rect = canvas.getClientArea();\r
+ if (event.x < rect.x || event.x >= rect.x + rect.width\r
+ || event.y < rect.y || event.y >= rect.y + rect.height) {\r
+ closePopup(CLOSE_WAITING_TIME);\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseEnter || event.type == SWT.FocusIn) {\r
+ if (null != closeTimer) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ }\r
+\r
+ // tooltip open and move\r
+ // if (event.type == SWT.MouseEnter || event.type == SWT.MouseMove) {\r
+ // if ((null != tooltip) && (tmpSelection >= 0)) {\r
+ // tooltip.setSeletedItem(items.get(tmpItemIndex + tmpSelection));\r
+ // tooltip.openAndMove(childShell);\r
+ // }\r
+ // }\r
+ }\r
+ };\r
+ \r
+ // Tooltip Disabled\r
+ //public void setTooltip(DACustomdropdownTooltip tooltip) {\r
+ // this.tooltip = tooltip;\r
+ //}\r
+\r
+ public void setEnabled(boolean enabled) {\r
+ super.setEnabled(enabled);\r
+ this.enabled = enabled;\r
+ if (enabled) {\r
+ changedropdownState(STATE_NORMAL);\r
+ setBackgroundImageAndColor(STATE_NORMAL);\r
+ } else {\r
+ changedropdownState(STATE_DISABLE);\r
+ setBackgroundImageAndColor(STATE_DISABLE);\r
+\r
+ Display.getDefault().syncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (null != childShell && !childShell.isDisposed()) {\r
+ childShell.close();\r
+ childShell = null;\r
+ }\r
+ }\r
+ });\r
+ }\r
+ }\r
+\r
+ private void setBackgroundImageAndColor(int state) {\r
+ int drawType = attr.getDrawType();\r
+ if (drawType == TYPE_IMAGE) {\r
+ setBackgroundImage(attr.getImage(state));\r
+ } else if (drawType == TYPE_COLOR) {\r
+ setBackground(attr.getColor(state));\r
+ } else if (drawType == TYPE_GRADATION) {\r
+ int index = state * 2;\r
+ setForeground(attr.getColor(index));\r
+ setBackground(attr.getColor(index + 1));\r
+ } else {\r
+ Logger.debug("DACustomdropdown drawType : " + state);\r
+ }\r
+ }\r
+\r
+ private PaintListener dropdownPaintListener = new PaintListener() {\r
+ @Override\r
+ public void paintControl(PaintEvent e) {\r
+ dropdownRenderer.draw(e.gc, dropdown, state, attr, isChildShellOpened());\r
+ }\r
+ };\r
+\r
+ public void setdropdownRender(DACustomDropdownRenderer newRenderer) {\r
+ dropdownRenderer = newRenderer;\r
+ }\r
+\r
+ public void setdropdownPopupRender(DACustomComboPopupRenderer newRenderer) {\r
+ popupRenderer = newRenderer;\r
+ }\r
+\r
+ public void add(String item) {\r
+ if (dirty) {\r
+ getItems().add(item);\r
+ } else {\r
+ getItems().set(0, item);\r
+ dirty = true;\r
+ }\r
+ }\r
+\r
+ public void select(int index) {\r
+ selection = index;\r
+ if (isShowSelectedText()) {\r
+ String text = items.get(itemIndex + selection);\r
+ attr.setText(text);\r
+ this.setToolTipText(text);\r
+ }\r
+ redraw();\r
+ }\r
+\r
+ public String getItem(int index) {\r
+ if (getItems().size() > 0) {\r
+ return getItems().get(index);\r
+ }\r
+ return DAWidgetConstants.EMPTY_STRING;\r
+ }\r
+\r
+ public void setdropdownColors(Color normal, Color push, Color hover, Color disable) {\r
+ attr.setColor(STATE_NORMAL, normal);\r
+ attr.setColor(STATE_HOVER, hover);\r
+ attr.setColor(STATE_PUSH, push);\r
+ attr.setColor(STATE_DISABLE, disable);\r
+ attr.setDrawType(TYPE_COLOR);\r
+ }\r
+\r
+ public void setdropdownGradation(Color normalStart, Color normalEnd, Color pushStart,\r
+ Color pushEnd, Color hoverStart, Color hoverEnd, Color disableStart,\r
+ Color disableEnd) {\r
+ attr.setColor(0, normalStart);\r
+ attr.setColor(1, normalEnd);\r
+ attr.setColor(2, hoverStart);\r
+ attr.setColor(3, hoverEnd);\r
+ attr.setColor(4, pushStart);\r
+ attr.setColor(5, pushEnd);\r
+ attr.setColor(6, disableStart);\r
+ attr.setColor(7, disableEnd);\r
+ attr.setDrawType(TYPE_GRADATION);\r
+ }\r
+\r
+ public void setImages(Image normal, Image hover, Image push, Image disable) {\r
+ if (null == normal || null == hover || null == push || null == disable) {\r
+ Logger.debug("DACustomdropdown setImages parameter is null");\r
+ return;\r
+ }\r
+ attr.setImage(STATE_NORMAL, normal);\r
+ attr.setImage(STATE_HOVER, hover);\r
+ attr.setImage(STATE_PUSH, push);\r
+ attr.setImage(STATE_DISABLE, disable);\r
+ attr.setDrawType(TYPE_IMAGE);\r
+ }\r
+\r
+ public void setOutlineColors(Color normal, Color push, Color hover, Color disable) {\r
+ attr.setOutlineColor(STATE_NORMAL, normal);\r
+ attr.setOutlineColor(STATE_HOVER, hover);\r
+ attr.setOutlineColor(STATE_PUSH, push);\r
+ attr.setOutlineColor(STATE_DISABLE, disable);\r
+ }\r
+\r
+ public void setdropdownImages(Image normal, Image push, Image hover, Image disable) {\r
+ attr.setButtonImage(STATE_NORMAL, normal);\r
+ attr.setButtonImage(STATE_HOVER, hover);\r
+ attr.setButtonImage(STATE_PUSH, push);\r
+ attr.setButtonImage(STATE_DISABLE, disable);\r
+ }\r
+\r
+ public void setdropdownImagePoint(Point dropdownImagePoint) {\r
+ attr.setButtonImagePoint(dropdownImagePoint);\r
+ }\r
+\r
+ private Listener upButtonMouseListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ DACustomButton upButton = (DACustomButton) event.widget;\r
+ Rectangle rect = upButton.getBounds();\r
+\r
+ if (event.type == SWT.MouseExit) {\r
+ if (event.y < rect.y || \r
+ event.x < rect.x || event.x >= rect.x + rect.width) {\r
+ closePopup(CLOSE_WAITING_TIME);\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseEnter || event.type == SWT.FocusIn) {\r
+ if (null != closeTimer) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseUp) {\r
+ if (!upArrowButton.isButtonEnabled()) {\r
+ return;\r
+ }\r
+\r
+ if (null != upArrowButton) {\r
+ Rectangle rectangle = upArrowButton.getBounds();\r
+ int x = event.x;\r
+ int y = event.y;\r
+\r
+ if (x < 0 || x > rectangle.width || y < 0 || y > rectangle.height) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ int size = getItems().size();\r
+ if (tmpItemIndex - pageSize < 0) {\r
+ tmpItemIndex = 0;\r
+ upArrowButton.setButtonEnabled(false);\r
+ } else {\r
+ tmpItemIndex -= pageSize;\r
+ }\r
+\r
+ if (tmpItemIndex + pageSize < size - 1) {\r
+ downArrowButton.setButtonEnabled(true);\r
+ }\r
+ popup.redraw();\r
+ }\r
+ \r
+ // tooltip close Tooltip Disabled\r
+ //if (event.type == SWT.MouseEnter) {\r
+ // if (null != tooltip) {\r
+ // tooltip.close();\r
+ // }\r
+ //}\r
+ }\r
+ };\r
+\r
+ private Listener downButtonMouseListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ DACustomButton upButton = (DACustomButton) event.widget;\r
+ Rectangle rect = upButton.getClientArea();\r
+\r
+ if (event.type == SWT.MouseExit) {\r
+ if ( event.x < rect.x || event.x >= rect.x + rect.width\r
+ || event.y >= rect.y + rect.height ){\r
+ closePopup(CLOSE_WAITING_TIME);\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseEnter || event.type == SWT.FocusIn) {\r
+ if (null != closeTimer) {\r
+ closeTimer.cancel();\r
+ closeTimer = null;\r
+ }\r
+ }\r
+\r
+ if (event.type == SWT.MouseUp) {\r
+ if (!downArrowButton.isButtonEnabled()) {\r
+ return;\r
+ }\r
+\r
+ if (null != downArrowButton) {\r
+ Rectangle rectangle = downArrowButton.getBounds();\r
+ int x = event.x;\r
+ int y = event.y;\r
+\r
+ if (x < 0 || x > rectangle.width || y < 0 || y > rectangle.height) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ int size = getItems().size();\r
+ if (tmpItemIndex + pageSize + MAX_SIZE >= size - 1) {\r
+ tmpItemIndex = size - MAX_SIZE;\r
+ downArrowButton.setButtonEnabled(false);\r
+ } else {\r
+ tmpItemIndex += pageSize;\r
+ }\r
+\r
+ if (tmpItemIndex > 0) {\r
+ upArrowButton.setButtonEnabled(true);\r
+ }\r
+ popup.redraw();\r
+ }\r
+ \r
+ // tooltip close Tooltip Disabled \r
+ //if (event.type == SWT.MouseEnter) {\r
+ // if (null != tooltip) {\r
+ // tooltip.close();\r
+ // }\r
+ //}\r
+ }\r
+ };\r
+\r
+ public boolean isDirty() {\r
+ return dirty;\r
+ }\r
+\r
+ public void initdropdown() {\r
+ getItems().clear();\r
+ tmpItemIndex = 0;\r
+ selection = 0;\r
+ items.add(DAWidgetConstants.EMPTY_STRING);\r
+ dirty = false;\r
+ itemIndex = 0;\r
+ }\r
+\r
+ public void initdropdownText(String text) {\r
+ getItems().clear();\r
+ tmpItemIndex = 0;\r
+ selection = 0;\r
+ items.add(text);\r
+ dirty = false;\r
+ itemIndex = 0;\r
+ }\r
+ \r
+ public void setdropdownButtonColor(Color normal, Color push, Color hover, Color disable) {\r
+ arrowColors = new ArrayList<Color>();\r
+ arrowColors.add(normal);\r
+ arrowColors.add(hover);\r
+ arrowColors.add(push);\r
+ arrowColors.add(disable);\r
+ }\r
+\r
+ public void setdropdownButtonImage(Image normal, Image push, Image hover, Image disable) {\r
+ arrowImages = new ArrayList<Image>();\r
+ arrowImages.add(normal);\r
+ arrowImages.add(push);\r
+ arrowImages.add(hover);\r
+ arrowImages.add(disable);\r
+ }\r
+\r
+ public void setdropdownButtonGradation(Color normalStart, Color normalEnd,\r
+ Color pushStart, Color pushEnd, Color hoverStart, Color hoverEnd,\r
+ Color disableStart, Color disableEnd) {\r
+ arrowColors = new ArrayList<Color>();\r
+ arrowColors.add(normalStart);\r
+ arrowColors.add(normalEnd);\r
+ arrowColors.add(hoverStart);\r
+ arrowColors.add(hoverEnd);\r
+ arrowColors.add(pushStart);\r
+ arrowColors.add(pushEnd);\r
+ arrowColors.add(disableStart);\r
+ arrowColors.add(disableEnd);\r
+ }\r
+\r
+ private List<Color> getArrowOutlineColors() {\r
+ if (null == arrowOutlineColors) {\r
+ arrowOutlineColors = new ArrayList<Color>();\r
+ }\r
+ return arrowOutlineColors;\r
+ }\r
+\r
+ public void setArrowOutlineColors(Color normal, Color push, Color hover, Color disable) {\r
+ List<Color> dropdownArrowOutlineColors = getArrowOutlineColors();\r
+ dropdownArrowOutlineColors.add(normal);\r
+ dropdownArrowOutlineColors.add(hover);\r
+ dropdownArrowOutlineColors.add(push);\r
+ dropdownArrowOutlineColors.add(disable);\r
+ }\r
+\r
+ private DACustomButton makeButton() {\r
+ DACustomButton button = null;\r
+ if (arrowImages != null) {\r
+ // image\r
+ button = new DACustomButton(childShell, arrowImages.get(STATE_NORMAL),\r
+ arrowImages.get(STATE_PUSH), arrowImages.get(STATE_HOVER),\r
+ arrowImages.get(STATE_DISABLE));\r
+ } else if (arrowColors != null) {\r
+ if (arrowColors.size() > 4) {\r
+ // gradation\r
+ button = new DACustomButton(childShell, arrowColors.get(STATE_NORMAL),\r
+ arrowColors.get(STATE_NORMAL + 1),\r
+ arrowColors.get(STATE_PUSH * 2),\r
+ arrowColors.get(STATE_PUSH * 2 + 1),\r
+ arrowColors.get(STATE_HOVER * 2),\r
+ arrowColors.get(STATE_HOVER * 2 + 1),\r
+ arrowColors.get(STATE_DISABLE * 2),\r
+ arrowColors.get(STATE_DISABLE * 2 + 1));\r
+ } else {\r
+ // color\r
+ button = new DACustomButton(childShell, SWT.NONE);\r
+ button.setColors(arrowColors.get(STATE_NORMAL),\r
+ arrowColors.get(STATE_PUSH), arrowColors.get(STATE_HOVER),\r
+ arrowColors.get(STATE_DISABLE));\r
+ }\r
+\r
+ if (arrowOutlineColors != null) {\r
+ button.setOutlineColors(arrowOutlineColors.get(STATE_NORMAL),\r
+ arrowOutlineColors.get(STATE_PUSH),\r
+ arrowOutlineColors.get(STATE_HOVER),\r
+ arrowOutlineColors.get(STATE_DISABLE));\r
+ }\r
+ } else {\r
+ button = new DACustomButton(childShell, SWT.NONE);\r
+ }\r
+ if (null != buttonRenderer) {\r
+ button.setRenderer(buttonRenderer);\r
+ }\r
+\r
+ return button;\r
+ }\r
+\r
+ public void setButtonRenderer(IDACustomButtonRenderer renderer) {\r
+ buttonRenderer = renderer;\r
+ }\r
+\r
+ public void setButtonImages(Image up, Image down) {\r
+ buttonUp = up;\r
+ buttonDown = down;\r
+ }\r
+\r
+ public boolean isChildShellOpened() {\r
+ if (childShell == null || childShell.isDisposed()) {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ public void closePopup(int interval) {\r
+ if (null == childShell || childShell.isDisposed()) {\r
+ return;\r
+ }\r
+ closeTimer = new Timer();\r
+ closeTimer.schedule(new TimerTask() {\r
+ public void run() {\r
+ Display.getDefault().syncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (null != childShell && !childShell.isDisposed()) {\r
+ // tooltip close Tooltip Disabled\r
+ //if (null != tooltip) {\r
+ // tooltip.close();\r
+ //}\r
+\r
+ childShell.close();\r
+ childShell = null;\r
+ redraw();\r
+ } else {\r
+ Logger.debug("dropdown timer bug : try close child shell ");\r
+ }\r
+ }\r
+ });\r
+ }\r
+ }, interval);\r
+ }\r
+\r
+ public void setTextAlign(int align) {\r
+ attr.setAlign(align);\r
+ }\r
+\r
+ public void setdropdownFont(Font font) {\r
+ attr.setFont(font);\r
+ }\r
+\r
+ public void setFontColors(Color normal, Color push, Color hover, Color disable) {\r
+ attr.setFontColor(STATE_NORMAL, normal);\r
+ attr.setFontColor(STATE_PUSH, push);\r
+ attr.setFontColor(STATE_HOVER, hover);\r
+ attr.setFontColor(STATE_DISABLE, disable);\r
+ }\r
+\r
+ public void setItemFontColor(Color itemFontColor) {\r
+ this.itemFontColor = itemFontColor;\r
+ }\r
+\r
+ public boolean isShowSelectedText() {\r
+ return showSelectedText;\r
+ }\r
+\r
+ public void setShowSelectedText(boolean showSelectedText) {\r
+ this.showSelectedText = showSelectedText;\r
+ }\r
+\r
+ public void initDropdown() {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+\r
+ public void setDropdownFont(Font combo) {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+\r
+ public void setDropdownColors(Color black, Color black2, Color black3, Color gRAY_170) {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+\r
+ public void setDropdownImagePoint(Point point) {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+\r
+ public void setDropdownImages(Image dropArrowDownNor, Image dropArrowDownSel, Image dropArrowDownHover,\r
+ Image dropArrowDownDim) {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+}\r
--- /dev/null
+package org.tizen.dynamicanalyzer.widgets.button.dropdown;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Canvas;\r
+import org.tizen.dynamicanalyzer.util.Logger;\r
+import org.tizen.dynamicanalyzer.widgets.DAWidgetConstants;\r
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;\r
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonAttribute;\r
+import org.tizen.dynamicanalyzer.widgets.button.IDACustomButtonRenderer;\r
+import org.tizen.dynamicanalyzer.widgets.combo.DACustomCombo;\r
+import org.tizen.dynamicanalyzer.widgets.helper.ColorResources;\r
+import org.tizen.dynamicanalyzer.widgets.helper.FontResources;\r
+\r
+public class DACustomDropdownRenderer implements IDACustomButtonRenderer {\r
+\r
+ public static final int STATE_COMBO_DROP = 4;\r
+ public static final int DEVICE_COMBO = 0;\r
+ public static final int APP_COMBO = 1;\r
+ public static final int PROCESS_COMBO = 2;\r
+\r
+ public void draw(GC gc, Canvas combo, int state,\r
+ DACustomButtonAttribute attr, boolean childOpen) {\r
+ Rectangle rect = combo.getClientArea();\r
+ if (attr.getDrawType() == DACustomCombo.TYPE_IMAGE) {\r
+ drawImageButton(gc, rect, state, attr); \r
+ } else if (attr.getDrawType() == DACustomCombo.TYPE_COLOR\r
+ || attr.getDrawType() == DACustomCombo.TYPE_GRADATION) {\r
+ drawButton(gc, rect, state, attr, childOpen);\r
+ } else {\r
+ Logger.debug("DACustomCombo drawType : " + state);\r
+ }\r
+ }\r
+\r
+ protected void drawImageButton(GC gc, Rectangle rect, int state,\r
+ DACustomButtonAttribute attr) {\r
+ Image image = attr.getImage(state);\r
+ if (null == image) {\r
+ return;\r
+ }\r
+\r
+ // draw image\r
+ gc.drawImage(image, rect.x, rect.y);\r
+\r
+ // draw text\r
+ drawButtonText(gc, rect, attr, state);\r
+ Rectangle clipping = new Rectangle(rect.x + rect.width - 17, rect.y, 17, rect.height);\r
+ gc.setClipping(clipping);\r
+ gc.drawImage(image, rect.x, rect.y);\r
+ }\r
+\r
+ protected void drawButton(GC gc, Rectangle rect, int state,\r
+ DACustomButtonAttribute attr, boolean isChildOpen) {\r
+ // draw color\r
+ if (attr.getDrawType() == DACustomCombo.TYPE_COLOR) {\r
+ gc.setBackground(attr.getColor(state));\r
+ gc.fillRectangle(rect);\r
+ } else if (attr.getDrawType() == DACustomCombo.TYPE_GRADATION) {\r
+ gc.setBackground(attr.getColor(state));\r
+ gc.fillRectangle(rect); \r
+ }\r
+\r
+ // draw text\r
+ drawButtonText(gc, rect, attr, state);\r
+\r
+ // stroke\r
+ Color c = gc.getForeground();\r
+ Rectangle r = new Rectangle(rect.x, rect.y, rect.width - 1, rect.height - 1);\r
+ if (null != attr.getOutlineColor(state)) {\r
+ gc.setForeground(ColorResources.GRAY_170);\r
+ } else {\r
+ gc.setForeground(ColorResources.GRAY_170);\r
+ return;\r
+ }\r
+ //gc.drawRectangle(r);\r
+ gc.drawLine(rect.x, rect.y, rect.x + 168, rect.y);\r
+ gc.drawLine(rect.x, rect.y + 24 - 1, rect.x + 168 + 10 , rect.y + 24 - 1);\r
+ gc.drawLine(rect.x, rect.y, rect.x, rect.y + 24);\r
+\r
+ //draw triangle\r
+ gc.setForeground(c);\r
+\r
+ // draw button image\r
+ if(isChildOpen){\r
+ drawButtonImage(gc, rect, attr, STATE_COMBO_DROP);\r
+ }\r
+ else{\r
+ drawButtonImage(gc, rect, attr, state);\r
+ }\r
+ }\r
+\r
+ protected void drawButtonImage(GC gc, Rectangle rect,\r
+ DACustomButtonAttribute attr, int state) {\r
+\r
+ if (attr != null) {\r
+ Image img = attr.getButtonImage(state);\r
+\r
+ if(state == STATE_COMBO_DROP){\r
+ // TODO: Assign image file\r
+ img = null;\r
+ }\r
+\r
+ if(img != null) {\r
+ Point p = null;\r
+ Rectangle imgRect = img.getBounds();\r
+\r
+ int x = 0, y = 0;\r
+ if (null == (p = attr.getButtonImagePoint())) {\r
+ int width = rect.width - imgRect.width;\r
+ int height = rect.height - imgRect.height;\r
+ if (width > 0) {\r
+ x = width / 2;\r
+ } // else : the image is drawn without the left and right margins.\r
+\r
+ if (height > 0) {\r
+ y = height / 2;\r
+ } // else : the image is drawn without the top and bottom margin.\r
+ } else {\r
+ // Combo Button text position\r
+ x = p.x + 10;\r
+ y = p.y;\r
+ }\r
+\r
+ gc.drawImage(img, x, y);\r
+ } // else : imag is null\r
+ } // else : attr is null\r
+ }\r
+\r
+ protected void drawButtonText(GC gc, Rectangle rect,\r
+ DACustomButtonAttribute attr, int state) {\r
+ Font font = attr.getFont();\r
+ Point fontPoint = attr.getFontPoint();\r
+ String text = attr.getText();\r
+ int align = attr.getAlign();\r
+\r
+ // set font style, size\r
+ if (null == font) {\r
+ gc.setFont(FontResources.COMBO);\r
+ } else {\r
+ gc.setFont(font);\r
+ }\r
+\r
+ // set font color\r
+ if (null != attr.getFontColor(state)) {\r
+ gc.setForeground(attr.getFontColor(state));\r
+ } else {\r
+ if (state == DACustomButton.STATE_DISABLE) {\r
+ gc.setForeground(ColorResources.COMBO_DISABLE_FONT);\r
+ } else {\r
+ gc.setForeground(ColorResources.COMBO_ENABLE_FONT);\r
+ }\r
+ }\r
+\r
+ if (text == null) {\r
+ text = DAWidgetConstants.EMPTY_STRING;\r
+ } // else case text is not null\r
+\r
+ // text position\r
+ if (fontPoint == null) {\r
+ Point p = gc.textExtent(text, SWT.DRAW_MNEMONIC);\r
+ int textX = 0;\r
+ if (align == DACustomCombo.TEXT_ALIGN_LEFT) {\r
+ textX = 5;\r
+ } else if (align == DACustomCombo.TEXT_ALIGN_RIGHT) {\r
+ textX = rect.width - p.x;\r
+ } else { // DACustomCombo.TEXT_ALIGN_CENTER\r
+ textX = (rect.width / 2) - (p.x / 2);\r
+ }\r
+ String dispText = cuttingTextbyRectWidth(text,gc,rect.width - 60);\r
+ gc.drawString(dispText, textX + 10, (rect.height - p.y) / 2, true);\r
+ } else {\r
+ String dispText = cuttingTextbyRectWidth(text,gc,rect.width - 60);\r
+ gc.drawString(dispText, fontPoint.x + 10, fontPoint.y, true); \r
+ }\r
+ }\r
+\r
+ //// cutting String by input Width Pixel\r
+ private String cuttingTextbyRectWidth(String srcText, GC gc, int srcWidth){\r
+\r
+ String cutText = "";\r
+ int pixelSize = 0;\r
+ int cutIndex = 0;\r
+\r
+ for(char ch : srcText.toCharArray()){\r
+ if(gc.getCharWidth(ch) == 1){\r
+ /// char pixel val "1" is not real pixel value... (ex : 'i', 'l' take more 1 pixel)\r
+ pixelSize += (gc.getFontMetrics().getAverageCharWidth() / 2);\r
+ }\r
+ else {\r
+ pixelSize += (gc.getCharWidth(ch));\r
+ }\r
+ if(pixelSize > srcWidth){\r
+ cutText = srcText.substring(0, cutIndex - 2);\r
+ cutText = cutText + "...";\r
+ return cutText;\r
+ }\r
+ cutIndex++;\r
+ }\r
+\r
+ return srcText;\r
+ }\r
+\r
+ @Override\r
+ public void draw(GC gc, Canvas canvas, int state, DACustomButtonAttribute attr) {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+}\r
--- /dev/null
+/*
+ * Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Jooyoul Lee <jy.exe.lee@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+
+package org.tizen.dynamicanalyzer.ui.widgets;
+
+import java.util.List;
+
+import org.eclipse.nebula.widgets.grid.Grid;
+import org.eclipse.nebula.widgets.grid.GridItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.tizen.dynamicanalyzer.appearance.DesignConstants;
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.model.FindProperty;
+import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite;
+import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite;
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
+import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonRenderer;
+import org.tizen.dynamicanalyzer.widgets.button.checkbox.DACheckBox;
+import org.tizen.dynamicanalyzer.widgets.button.checkbox.DACheckboxSelectionListener;
+import org.tizen.dynamicanalyzer.widgets.button.dropdown.DACustomDropdown;
+import org.tizen.dynamicanalyzer.widgets.da.base.DAButton;
+import org.tizen.dynamicanalyzer.widgets.da.base.DAMessageBox;
+import org.tizen.dynamicanalyzer.widgets.da.base.DATextBox;
+
+public class SearchDialog extends DAMessageBox {
+
+ private static final int ENTER_KEY_CODE = 13;
+
+ final private int WIDTH = 430;
+ final private int HEIGHT = 230 - 7; // Should remove 7 pixel on titlebar area at MAC
+
+ private DACustomDropdown categoryDropdown= null;
+ private DATextBox textBox = null;
+ private DAButton cancelButton = null;
+ private DAButton backButton = null;
+ private DAButton nextButton = null;
+ private DACheckBox caseButton = null;
+ private DACheckBox wholeWordButton = null;
+
+ private FindProperty findProperty = null;
+
+ private Grid table = null;
+ private String viewName = null;
+ private Composite composite = null;
+
+ public SearchDialog(Shell parentShell, Composite comp) {
+ super(parentShell);
+ if (comp instanceof DATableComposite) {
+ this.table = ((DATableComposite) comp).getTable();
+ viewName = ((DATableComposite) comp).getTableName();
+ } else if (comp instanceof DATreeComposite) {
+ this.table = ((DATreeComposite) comp).getTable();
+ viewName = ((DATreeComposite) comp).getTableName();
+ } else {
+ table = null;
+ return;
+ }
+ this.composite = comp;
+ findProperty = DATableComposite.getFindProferty();
+ findProperty.setIndex(table.getSelectionIndex());
+ }
+
+ protected boolean run() {
+ if (null == table) {
+ return false;
+ }
+ int dialogLocationX = shell.getParent().getLocation().x + (shell.getParent().getSize().x - WIDTH)/2;
+ int dialogLocationY = shell.getParent().getLocation().y + (shell.getParent().getSize().y - HEIGHT)/2;
+ shell.setLocation(dialogLocationX, dialogLocationY);
+ shell.setSize(WIDTH, HEIGHT);
+ shell.setLayout(new FormLayout());
+ shell.setText(AnalyzerLabels.SEARCH_DLG_TITLE);
+ shell.setBackground(ColorResources.DIALOG_BG_UPPER);
+ shell.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent e) {
+ e.gc.setForeground(ColorResources.DIALOG_TOP_LINE_COLOR);
+ e.gc.drawLine(0, 0, WIDTH, 0);
+ e.gc.setForeground(ColorResources.DIALOG_BUTTON_LINE_COLOR);
+ e.gc.drawLine(0, 139, WIDTH, 139);
+ }
+ });
+
+ Composite contentComp = new Composite(shell, SWT.NONE);
+ FormLayout contentLayout = new FormLayout();
+ contentComp.setLayout(contentLayout);
+ contentComp.setBackground(ColorResources.DIALOG_CONTENT_BACKGROUND);
+
+ FormData data = new FormData();
+ data.top = new FormAttachment(0, 1);
+ data.left = new FormAttachment(0, 0);
+ data.width = WIDTH;
+ data.height = 138;
+ contentComp.setLayoutData(data);
+
+ Label descriptionLabel = new Label(contentComp, SWT.TRANSPARENT);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30);
+ data.left = new FormAttachment(0, 20);
+ data.height = 26;
+ data.width = WIDTH-20;
+ descriptionLabel.setLayoutData(data);
+ descriptionLabel.setBackground(ColorResources.DIALOG_CONTENT_BACKGROUND);
+ descriptionLabel.setForeground(ColorResources.DIALOG_TEXT_FONT_COLOR);
+ descriptionLabel.setText(AnalyzerLabels.SEARCH_DLG_DESC_PREFIX
+ + CommonConstants.SPACE + viewName + CommonConstants.SPACE
+ + AnalyzerLabels.SEARCH_DLG_DESC_POSTFIX);
+
+ categoryDropdown = makeDACustomDropdown(contentComp);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30+26);
+ data.left = new FormAttachment(0, 20);
+ data.height = 24;
+ data.width = 96;
+ categoryDropdown.setLayoutData(data);
+ categoryDropdown.addListener(SWT.Selection, dropdownListener);
+
+ textBox = new DATextBox(contentComp, SWT.SINGLE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30+26);
+ data.left = new FormAttachment(0, 20+96+10);
+ data.height = 24;
+ data.width = 284;
+ textBox.setLayoutData(data);
+ textBox.setBackground(ColorResources.WHITE);
+ textBox.setForeground(ColorResources.BLACK);
+ // TODO: TextBox set outline color
+ // TODO: TextBox font size, cursor location
+ textBox.getControl().addKeyListener(keyListener);
+ textBox.setText(findProperty.getLastSearch());
+ textBox.getControl().setSelection(0, findProperty.getLastSearch().length());
+
+ Label optionLabel = new Label(contentComp, SWT.TRANSPARENT);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30+26+24+16);
+ data.left = new FormAttachment(0, 20);
+ data.height = 14;
+ data.width = 40 + 66;
+ optionLabel.setLayoutData(data);
+ optionLabel.setBackground(ColorResources.DIALOG_CONTENT_BACKGROUND);
+ optionLabel.setForeground(ColorResources.DIALOG_TEXT_FONT_COLOR);
+ optionLabel.setText(AnalyzerLabels.SEARCH_DLG_OPTION);
+
+ caseButton = new DACheckBox(contentComp, SWT.NONE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30+26+24+16);
+ data.left = new FormAttachment(optionLabel, 0);
+ data.height = 14;
+ data.width = 14 + 4 + 80 + 38;
+ caseButton.setLayoutData(data);
+ caseButton.setBackground(ColorResources.DIALOG_CONTENT_BACKGROUND);
+ caseButton.setForeground(ColorResources.DIALOG_TEXT_FONT_COLOR);
+ caseButton.setText(AnalyzerLabels.SEARCH_DLG_CASE_SENSITIVE);
+ caseButton.addSelectionListener(caseButtonListener);
+ caseButton.setChecked(findProperty.isCaseSensitive());
+
+ wholeWordButton = new DACheckBox(contentComp, SWT.NONE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 30+26+24+16);
+ data.left = new FormAttachment(caseButton, 0);
+ data.height = 14;
+ data.width = 14 + 4 + 130;
+ wholeWordButton.setLayoutData(data);
+ wholeWordButton.setBackground(ColorResources.DIALOG_CONTENT_BACKGROUND);
+ wholeWordButton.setForeground(ColorResources.DIALOG_TEXT_FONT_COLOR);
+ wholeWordButton.setText(AnalyzerLabels.SEARCH_DLG_WHOLE_WORD);
+ wholeWordButton.addSelectionListener(wholeWordButtonListener);
+ wholeWordButton.setChecked(findProperty.isWholeWord());
+
+ Composite buttonComp = new Composite(shell, SWT.NONE);
+ FormLayout buttonLayout = new FormLayout();
+ buttonComp.setLayout(buttonLayout);
+ buttonComp.setBackground(ColorResources.DIALOG_BUTTON_BACKGROUND);
+
+ data = new FormData();
+ data.top = new FormAttachment(0, 140);
+ data.left = new FormAttachment(0, 0);
+ data.width = WIDTH;
+ data.height = 60;
+ buttonComp.setLayoutData(data);
+
+ cancelButton = new DAButton(buttonComp, SWT.NONE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 17);
+ data.left = new FormAttachment(100, DesignConstants.DA_BUTTON_WIDTH*(-1)*3-20-20);
+ data.height = 25;
+ data.width = DesignConstants.DA_BUTTON_WIDTH;
+ cancelButton.setLayoutData(data);
+ cancelButton.setText(AnalyzerLabels.SEARCH_DLG_CANCEL_BUTTON);
+ cancelButton.addClickListener(cancelButtonListener);
+
+ backButton = new DAButton(buttonComp, SWT.NONE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 17);
+ data.left = new FormAttachment(100, DesignConstants.DA_BUTTON_WIDTH*(-1)*2-20-10);
+ data.height = 25;
+ data.width = DesignConstants.DA_BUTTON_WIDTH;
+ backButton.setLayoutData(data);
+ backButton.setText(AnalyzerLabels.SEARCH_DLG_BACK_BUTTON);
+ backButton.addClickListener(backButtonListener);
+
+ nextButton = new DAButton(buttonComp, SWT.NONE);
+ data = new FormData();
+ data.top = new FormAttachment(0, 17);
+ data.left = new FormAttachment(100, DesignConstants.DA_BUTTON_WIDTH*(-1)*1-20);
+ data.height = 25;
+ data.width = DesignConstants.DA_BUTTON_WIDTH;
+ nextButton.setLayoutData(data);
+ nextButton.setText(AnalyzerLabels.SEARCH_DLG_NEXT_BUTTON);
+ nextButton.addClickListener(nextButtonListener);
+
+ updateCategoryDropdown();
+ return true;
+ }
+
+ private DACustomButtonClickEventListener cancelButtonListener = new DACustomButtonClickEventListener() {
+
+ @Override
+ public void handleClickEvent(DACustomButton button) {
+ shell.close();
+ }
+ };
+
+ private DACustomButtonClickEventListener backButtonListener = new DACustomButtonClickEventListener() {
+
+ @Override
+ public void handleClickEvent(DACustomButton button) {
+ findProperty.setBackward(true);
+ findProperty.setLastSearch(textBox.getText());
+ executeFindCommand();
+ }
+ };
+
+ private DACustomButtonClickEventListener nextButtonListener = new DACustomButtonClickEventListener() {
+
+ @Override
+ public void handleClickEvent(DACustomButton button) {
+ findProperty.setBackward(false);
+ findProperty.setLastSearch(textBox.getText());
+ executeFindCommand();
+ }
+ };
+
+ private KeyListener keyListener = new KeyListener() {
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (null != textBox.getText() && !textBox.getText().isEmpty()) {
+ nextButton.setButtonEnabled(true);
+
+ if (e.keyCode == ENTER_KEY_CODE) {
+ findProperty.setLastSearch(textBox.getText());
+ executeFindCommand();
+ }
+ } else {
+ nextButton.setButtonEnabled(false);
+ }
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ }
+ };
+
+ private DACheckboxSelectionListener caseButtonListener = new DACheckboxSelectionListener() {
+
+ @Override
+ public void handleSelectionEvent(DACheckBox checkbox) {
+ findProperty.setCaseSensitive(!findProperty.isCaseSensitive());
+ caseButton.setChecked(findProperty.isCaseSensitive());
+ }
+ };
+
+ private DACheckboxSelectionListener wholeWordButtonListener = new DACheckboxSelectionListener() {
+
+ @Override
+ public void handleSelectionEvent(DACheckBox checkbox) {
+ findProperty.setWholeWord(!findProperty.isWholeWord());
+ wholeWordButton.setChecked(findProperty.isWholeWord());
+ }
+ };
+
+ private boolean executeFindCommand() {
+
+ int index = findProperty.getIndex();
+ GridItem[] items = table.getItems();
+ int itemCount = items.length;
+ String selectedColumn = categoryDropdown.getText();
+
+ if (itemCount != 0) {
+ if (findProperty.isBackward()) {
+ index = (index - 1 < 0) ? itemCount - 1 : index - 1;
+ } else {
+ index = (index + 1 > itemCount - 1) ? 0 : index + 1;
+ }
+ int findIndex = -1;
+ findProperty.setIndex(index);
+ if (composite instanceof DATableComposite) {
+ findIndex = ((DATableComposite) composite)
+ .searchString(findProperty);
+ } else if (composite instanceof DATreeComposite) {
+ findIndex = ((DATreeComposite) composite)
+ .searchString(findProperty);
+ } else {
+ return false;
+ }
+ findProperty.setIndex(findIndex);
+ return true;
+ }
+ return false;
+ }
+
+ public DACustomDropdown getCategoryDropdown() {
+ return categoryDropdown;
+ }
+
+ private Listener dropdownListener = new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ // TODO Auto-generated method stub
+ // TODO: implement
+ // Selected item should limit to searching area as column
+ return;
+ }
+ };
+
+ private boolean selectCategoryDropdown(String item) {
+ // TODO: implement
+ boolean ret = false;
+
+ List<String> categoryList = categoryDropdown.getItems();
+ int size = categoryList.size();
+ for (int i = 0 ; i < size ; i++) {
+ //ret = table.getCategory(item);
+ if (ret) {
+ categoryDropdown.select(i);
+ if (!item.isEmpty()) {
+ categoryDropdown.setToolTipText(item);
+ }
+ }
+ }
+ return ret;
+ }
+
+ public boolean setCategory(final String text) {
+ // TODO: implement, At launch search dialog, possible category have to setted.
+ return true;
+ }
+
+ public boolean updateCategoryDropdown() {
+ categoryDropdown.add("All");
+ /* TODO: Add column by init or update
+ categoryDropdown.add("Pid");
+ categoryDropdown.add("Tid");
+ categoryDropdown.add("Tag");
+ categoryDropdown.add("Message");
+ */
+ categoryDropdown.select(0);
+ redrawDropdown(categoryDropdown);
+ return true;
+ }
+
+ private void redrawDropdown(final DACustomDropdown dropdown) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ dropdown.redraw();
+ }
+ });
+ }
+
+ private DACustomDropdown makeDACustomDropdown(Composite parent) {
+ DACustomDropdown dropdown = new DACustomDropdown(parent, SWT.NONE);
+ dropdown.setdropdownGradation(ColorResources.WHITE,
+ ColorResources.WHITE, ColorResources.WHITE,
+ ColorResources.WHITE, ColorResources.WHITE,
+ ColorResources.WHITE, ColorResources.WHITE,
+ ColorResources.WHITE);
+ dropdown.setOutlineColors(ColorResources.GRAY_130,
+ ColorResources.GRAY_130,
+ ColorResources.GRAY_130,
+ ColorResources.GRAY_130);
+ dropdown.setDropdownImages(ImageResources.DROP_ARROW_DOWN_NOR,
+ ImageResources.DROP_ARROW_DOWN_SEL,
+ ImageResources.DROP_ARROW_DOWN_HOVER,
+ ImageResources.DROP_ARROW_DOWN_DIM);
+ dropdown.setDropdownImagePoint(new Point(90, 9));
+ dropdown.setdropdownButtonColor(ColorResources.WHITE,
+ ColorResources.WHITE,
+ ColorResources.WHITE,
+ ColorResources.WHITE);
+ dropdown.setArrowOutlineColors(ColorResources.GRAY_220,
+ ColorResources.GRAY_220,
+ ColorResources.GRAY_220,
+ ColorResources.GRAY_220);
+ dropdown.setButtonImages(ImageResources.COMBO_DROPDOWN_UP,
+ ImageResources.COMBO_DROPDOWN_DOWN);
+ dropdown.setFontPoint(new Point(5, 5));
+ dropdown.setEnabled(true);
+ dropdown.setDropdownFont(FontResources.COMBO);
+ dropdown.setItemFont(FontResources.DROPDOWN);
+ dropdown.setDropdownColors(ColorResources.BLACK,
+ ColorResources.BLACK,
+ ColorResources.BLACK,
+ ColorResources.BLACK);
+ dropdown.setButtonRenderer(new DACustomButtonRenderer());
+
+ return dropdown;
+ }
+
+ public boolean updateCategoryDropdown(String newItem) {
+ // TODO: Add item to dropdown at start dialog
+ categoryDropdown.add(newItem);
+ return true;
+ }
+}