/* * Created on 17-dic-2005 * * TODO To change the template for this generated file go to Window - * Preferences - Java - Code Style - Code Templates */ package org.herac.tuxguitar.gui.system.config; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.log4j.Logger; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FormLayout; 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.Shell; import org.eclipse.swt.widgets.ToolBar; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.actions.ActionLock; import org.herac.tuxguitar.gui.editors.TablatureEditor; import org.herac.tuxguitar.gui.editors.chord.ChordSelector; import org.herac.tuxguitar.gui.system.config.items.LanguageOption; import org.herac.tuxguitar.gui.system.config.items.MainOption; import org.herac.tuxguitar.gui.system.config.items.Option; import org.herac.tuxguitar.gui.system.config.items.SkinOption; import org.herac.tuxguitar.gui.system.config.items.SoundOption; import org.herac.tuxguitar.gui.system.config.items.StylesOption; import org.herac.tuxguitar.gui.system.config.items.ToolBarsOption; import org.herac.tuxguitar.gui.util.ConfirmDialog; import org.herac.tuxguitar.gui.util.DialogUtils; import org.herac.tuxguitar.util.TGSynchronizer; /** * @author julian * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class TGConfigEditor { protected boolean accepted; protected TGConfigManager config; protected Properties defaults; protected Shell dialog; protected List<Option> options; protected List<Runnable> runnables; public TGConfigEditor() { this.config = TuxGuitar.instance().getConfig(); } public void addSyncThread(Runnable runnable) { this.runnables.add(runnable); } protected void applyConfig(final boolean force) { TuxGuitar.instance().loadCursor(SWT.CURSOR_WAIT); new Thread(new Runnable() { public void run() { TGConfigEditor.this.runnables = new ArrayList<Runnable>(); for (final Option option : TGConfigEditor.this.options) { option.applyConfig(force); } try { TGSynchronizer.instance().runLater(new TGSynchronizer.TGRunnable() { public void run() throws Throwable { for (final Runnable current : TGConfigEditor.this.runnables) { current.run(); } new Thread(new Runnable() { public void run() { TuxGuitar.instance().fireUpdate(); TuxGuitar.instance().updateCache(true); TuxGuitar.instance().loadCursor(SWT.CURSOR_ARROW); ActionLock.unlock(); } }).start(); } }); } catch (Throwable throwable) { TuxGuitar.instance().fireUpdate(); TuxGuitar.instance().updateCache(true); TuxGuitar.instance().loadCursor(SWT.CURSOR_ARROW); ActionLock.unlock(); LOG.error(throwable); } } }).start(); } /** The Logger for this class. */ public static final transient Logger LOG = Logger .getLogger(TGConfigEditor.class); private Point computeOptionsSize(int minimumWidth, int minimumHeight) { int width = minimumWidth; int height = minimumHeight; for (final Option option : this.options) { Point size = option.computeSize(); if (size.x > width) { width = size.x; } if (size.y > height) { height = size.y; } } return new Point(width, height); } private void createComposites(Composite parent) { ToolBar toolBar = new ToolBar(parent, SWT.VERTICAL | SWT.FLAT | SWT.WRAP); toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite option = new Composite(parent, SWT.NONE); option.setLayout(new FormLayout()); initOptions(toolBar, option); Point optionSize = computeOptionsSize(0, toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); option.setLayoutData(new GridData(optionSize.x, optionSize.y)); if (this.options.size() > 0) { select((Option) this.options.get(0)); } } protected void dispose() { for (final Option option : this.options) { option.dispose(); } getDialog().dispose(); } protected GridData getButtonData() { GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.minimumWidth = 80; data.minimumHeight = 25; return data; } public TGConfigManager getConfig() { return this.config; } public Properties getDefaults() { if (this.defaults == null) { this.defaults = new TGConfigDefaults().getProperties(); } return this.defaults; } public Shell getDialog() { return this.dialog; } public TablatureEditor getEditor() { return TuxGuitar.instance().getTablatureEditor(); } private void hideAll() { for (final Option option : this.options) { option.setVisible(false); } } private void initOptions(ToolBar toolBar, Composite parent) { this.options = new ArrayList<Option>(); this.options.add(new MainOption(this, toolBar, parent)); this.options.add(new StylesOption(this, toolBar, parent)); this.options.add(new LanguageOption(this, toolBar, parent)); this.options.add(new ToolBarsOption(this, toolBar, parent)); this.options.add(new SkinOption(this, toolBar, parent)); this.options.add(new SoundOption(this, toolBar, parent)); for (final Option option : this.options) { option.createOption(); } } public GridData makeGridData(int with, int height, int minWith, int minHeight) { GridData data = new GridData(); data.minimumWidth = minWith; data.minimumHeight = minHeight; if (with > 0) { data.widthHint = with; } else { data.horizontalAlignment = SWT.FILL; data.grabExcessHorizontalSpace = true; } if (height > 0) { data.heightHint = with; } else { data.verticalAlignment = SWT.FILL; data.grabExcessVerticalSpace = true; } return data; } public void pack() { this.dialog.pack(); } public void select(Option option) { hideAll(); option.setVisible(true); // this.dialog.layout(); this.dialog.redraw(); } protected void setDefaults() { for (final Option option : this.options) { option.updateDefaults(); } this.config.save(); } public void showDialog(Shell shell) { this.accepted = false; this.dialog = DialogUtils.newDialog(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); this.dialog.setLayout(new GridLayout()); this.dialog.setText(TuxGuitar.getProperty("settings.config")); // -------main------------------------------------- Composite mainComposite = new Composite(this.dialog, SWT.NONE); mainComposite.setLayout(new GridLayout(2, false)); mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); createComposites(mainComposite); // -------buttons------------------------------------- Composite buttonComposite = new Composite(this.dialog, SWT.NONE); buttonComposite.setLayout(new GridLayout(3, true)); buttonComposite .setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); Button buttonDefaults = new Button(buttonComposite, SWT.PUSH); buttonDefaults.setLayoutData(getButtonData()); buttonDefaults.setText(TuxGuitar.getProperty("defaults")); buttonDefaults.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { TGConfigEditor.this.accepted = true; TuxGuitar.instance().loadCursor(SWT.CURSOR_WAIT); dispose(); setDefaults(); ConfirmDialog confirm = new ConfirmDialog(TuxGuitar .getProperty("settings.config.apply-changes-question")); confirm.setDefaultStatus(ConfirmDialog.STATUS_NO); if (confirm.confirm(ConfirmDialog.BUTTON_YES | ConfirmDialog.BUTTON_NO, ConfirmDialog.BUTTON_YES) == ConfirmDialog.STATUS_NO) { TuxGuitar.instance().loadCursor(SWT.CURSOR_ARROW); ActionLock.unlock(); return; } applyConfig(true); } }); Button buttonOK = new Button(buttonComposite, SWT.PUSH); buttonOK.setLayoutData(getButtonData()); buttonOK.setText(TuxGuitar.getProperty("ok")); buttonOK.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { TGConfigEditor.this.accepted = true; TuxGuitar.instance().loadCursor(SWT.CURSOR_WAIT); updateOptions(); dispose(); ConfirmDialog confirm = new ConfirmDialog(TuxGuitar .getProperty("settings.config.apply-changes-question")); confirm.setDefaultStatus(ConfirmDialog.STATUS_NO); if (confirm.confirm(ConfirmDialog.BUTTON_YES | ConfirmDialog.BUTTON_NO, ConfirmDialog.BUTTON_YES) == ConfirmDialog.STATUS_NO) { TuxGuitar.instance().loadCursor(SWT.CURSOR_ARROW); ActionLock.unlock(); return; } applyConfig(false); } }); Button buttonCancel = new Button(buttonComposite, SWT.PUSH); buttonCancel.setLayoutData(getButtonData()); buttonCancel.setText(TuxGuitar.getProperty("cancel")); buttonCancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { TuxGuitar.instance().loadCursor(SWT.CURSOR_WAIT); dispose(); TuxGuitar.instance().loadCursor(SWT.CURSOR_ARROW); } }); this.dialog.setDefaultButton(buttonOK); DialogUtils.openDialog(this.dialog, DialogUtils.OPEN_STYLE_CENTER | DialogUtils.OPEN_STYLE_PACK | DialogUtils.OPEN_STYLE_WAIT); if (!this.accepted) { ActionLock.unlock(); } } protected void updateOptions() { for (final Option option : this.options) { option.updateConfig(); } this.config.save(); } }