package bndtools.editor.common; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Sash; import org.eclipse.ui.forms.FormColors; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.IManagedForm; public class MDSashForm extends SashForm { ArrayList<Sash> sashes = new ArrayList<Sash>(); Listener listener = new Listener() { public void handleEvent(Event e) { switch (e.type) { case SWT.MouseEnter : e.widget.setData("hover", Boolean.TRUE); //$NON-NLS-1$ ((Control) e.widget).redraw(); break; case SWT.MouseExit : e.widget.setData("hover", null); //$NON-NLS-1$ ((Control) e.widget).redraw(); break; case SWT.Paint : onSashPaint(e); break; case SWT.Resize : hookSashListeners(); break; default : break; } } }; private Color bg; private Color fg; public MDSashForm(Composite parent, int style, Color bg, Color fg) { super(parent, style); this.bg = bg; this.fg = fg; } public MDSashForm(Composite parent, int style, IManagedForm managedForm) { super(parent, style); FormColors colors = managedForm.getToolkit().getColors(); bg = colors.getColor(IFormColors.TB_BG); fg = colors.getColor(IFormColors.TB_BORDER); } @Override public void layout(boolean changed) { super.layout(changed); hookSashListeners(); } @Override public void layout(Control[] children) { super.layout(children); hookSashListeners(); } private void hookSashListeners() { purgeSashes(); Control[] children = getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Sash) { Sash sash = (Sash) children[i]; if (sashes.contains(sash)) continue; sash.addListener(SWT.Paint, listener); sash.addListener(SWT.MouseEnter, listener); sash.addListener(SWT.MouseExit, listener); sashes.add(sash); } } } private void purgeSashes() { for (Iterator<Sash> iter = sashes.iterator(); iter.hasNext();) { Sash sash = iter.next(); if (sash.isDisposed()) iter.remove(); } } private void onSashPaint(Event e) { Sash sash = (Sash) e.widget; boolean vertical = (sash.getStyle() & SWT.VERTICAL) != 0; GC gc = e.gc; Boolean hover = (Boolean) sash.getData("hover"); //$NON-NLS-1$ gc.setBackground(bg); gc.setForeground(fg); Point size = sash.getSize(); if (vertical) { if (hover != null) gc.fillRectangle(0, 0, size.x, size.y); // else // gc.drawLine(1, 0, 1, size.y-1); } else { if (hover != null) gc.fillRectangle(0, 0, size.x, size.y); // else // gc.drawLine(0, 1, size.x-1, 1); } } public void hookResizeListener() { Control[] children = getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Sash) continue; children[i].addListener(SWT.Resize, listener); } } }