package org.herac.tuxguitar.gui.system.config.items; import java.util.Properties; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.editors.TablatureEditor; import org.herac.tuxguitar.gui.system.config.TGConfigEditor; import org.herac.tuxguitar.gui.system.config.TGConfigManager; public abstract class Option extends SelectionAdapter { protected static final int DEFAULT_INDENT = 20; private Composite composite; private TGConfigEditor configEditor; private Group group; private ToolBar toolBar; private ToolItem toolItem; public Option(TGConfigEditor configEditor, ToolBar toolBar, Composite parent, String text) { this(configEditor, toolBar, parent, text, SWT.FILL, SWT.TOP); } public Option(TGConfigEditor configEditor, ToolBar toolBar, final Composite parent, String text, int horizontalAlignment, int verticalAlignment) { this.configEditor = configEditor; this.toolBar = toolBar; this.toolItem = new ToolItem(toolBar, SWT.RADIO); this.group = new Group(parent, SWT.SHADOW_ETCHED_IN); this.group.setLayout(new GridLayout()); this.group.setLayoutData(getGroupData()); this.group.setText(text); this.composite = new Composite(this.group, SWT.SHADOW_ETCHED_IN); this.composite.setLayout(new GridLayout()); this.composite.setLayoutData(new GridData(horizontalAlignment, verticalAlignment, true, true)); } protected void addSyncThread(Runnable runnable) { this.configEditor.addSyncThread(runnable); } public abstract void applyConfig(boolean force); public Point computeSize() { return this.computeSize(SWT.DEFAULT, SWT.DEFAULT); } protected Point computeSize(int wHint, int hHint) { return this.group.computeSize(wHint, hHint); } public abstract void createOption(); public void dispose() { // Override me } public Composite getComposite() { return this.composite; } public TGConfigManager getConfig() { return this.configEditor.getConfig(); } public Properties getDefaults() { return this.configEditor.getDefaults(); } public Display getDisplay() { return this.toolBar.getDisplay(); } public TablatureEditor getEditor() { return this.configEditor.getEditor(); } protected FormData getGroupData() { FormData data = new FormData(); data.top = new FormAttachment(0, 0); data.bottom = new FormAttachment(100, 0); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); return data; } public Shell getShell() { return this.toolBar.getShell(); } protected GridData getTabbedData() { return getTabbedData(DEFAULT_INDENT, SWT.FILL, SWT.CENTER); } protected GridData getTabbedData(int horizontalAlignment, int verticalAlignment) { return getTabbedData(DEFAULT_INDENT, horizontalAlignment, verticalAlignment); } protected GridData getTabbedData(int horizontalAlignment, int verticalAlignment, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace) { return getTabbedData(DEFAULT_INDENT, horizontalAlignment, verticalAlignment, grabExcessHorizontalSpace, grabExcessVerticalSpace); } protected GridData getTabbedData(int indent, int horizontalAlignment, int verticalAlignment) { return getTabbedData(indent, horizontalAlignment, verticalAlignment, true, true); } protected GridData getTabbedData(int indent, int horizontalAlignment, int verticalAlignment, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace) { GridData data = new GridData(); data.horizontalAlignment = horizontalAlignment; data.grabExcessHorizontalSpace = grabExcessHorizontalSpace; data.verticalAlignment = verticalAlignment; data.grabExcessVerticalSpace = grabExcessVerticalSpace; data.horizontalIndent = indent; return data; } public ToolItem getToolItem() { return this.toolItem; } protected boolean isDisposed() { return (this.toolBar.isDisposed() || this.toolBar.getShell().isDisposed()); } public void loadCursor(int style) { TuxGuitar.instance().loadCursor(this.configEditor.getDialog(), style); } public GridData makeGridData(int with, int height, int minWith, int minHeight) { return this.configEditor.makeGridData(with, height, minWith, minHeight); } public GridData makeGridData(int widthHint, int heightHint, int minimumWidth, int minimumHeight, int horizontalAlignment, int verticalAlignment, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace, int horizontalSpan, int verticalSpan) { GridData data = new GridData(); data.widthHint = widthHint; data.heightHint = heightHint; data.minimumWidth = minimumWidth; data.minimumHeight = minimumHeight; data.horizontalAlignment = horizontalAlignment; data.verticalAlignment = verticalAlignment; data.grabExcessHorizontalSpace = grabExcessHorizontalSpace; data.grabExcessVerticalSpace = grabExcessVerticalSpace; data.horizontalSpan = horizontalSpan; data.verticalSpan = verticalSpan; return data; } public void pack() { this.configEditor.pack(); } public void setVisible(boolean visible) { this.toolItem.setSelection(visible); this.group.setVisible(visible); this.group.setFocus(); this.group.redraw(); } protected Label showImageLabel(Composite parent, int labelStyle, Image image) { Label label = new Label(parent, labelStyle); label.setImage(image); return label; } protected Label showLabel(Composite parent, int hAlign, int vAlign, boolean grabExcessHSpace, boolean grabExcessVSpace, int labelStyle, int fontStyle, int fontScale, String text) { Label label = new Label(parent, labelStyle); label.setText(text); label.setLayoutData(new GridData(hAlign, vAlign, grabExcessHSpace, grabExcessVSpace)); FontData[] fontDatas = label.getFont().getFontData(); if (fontDatas.length > 0) { final Font font = new Font(label.getDisplay(), fontDatas[0].getName(), (fontDatas[0].getHeight() + fontScale), fontStyle); label.setFont(font); label.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent arg0) { font.dispose(); } }); } return label; } protected Label showLabel(Composite parent, int hAlign, int vAlign, int labelStyle, int fontStyle, int fontScale, String text) { return showLabel(parent, hAlign, vAlign, true, true, labelStyle, fontStyle, fontScale, text); } protected Label showLabel(Composite parent, int labelStyle, int fontStyle, int fontScale, String text) { return showLabel(parent, SWT.FILL, SWT.CENTER, labelStyle, fontStyle, fontScale, text); } public abstract void updateConfig(); public abstract void updateDefaults(); public void widgetSelected(SelectionEvent e) { this.configEditor.select(this); } }