kopia lustrzana https://github.com/maccasoft/z80-tools
Updated editor tab stops handling
rodzic
a8cd985d0a
commit
756554179d
|
@ -151,6 +151,32 @@ public class Application {
|
|||
tab.getEditor().setShowLineNumbers(((Boolean) evt.getNewValue()).booleanValue());
|
||||
}
|
||||
}
|
||||
else if (Preferences.PROP_TABWIDTH.equals(evt.getPropertyName())) {
|
||||
CTabItem[] tabItem = tabFolder.getItems();
|
||||
for (int i = 0; i < tabItem.length; i++) {
|
||||
SourceEditorTab tab = (SourceEditorTab) tabItem[i].getData();
|
||||
tab.getEditor().setTabWidth(((Integer) evt.getNewValue()).intValue());
|
||||
}
|
||||
}
|
||||
else if (Preferences.PROP_USE_TABSTOPS.equals(evt.getPropertyName())) {
|
||||
CTabItem[] tabItem = tabFolder.getItems();
|
||||
for (int i = 0; i < tabItem.length; i++) {
|
||||
SourceEditorTab tab = (SourceEditorTab) tabItem[i].getData();
|
||||
tab.getEditor().setUseTabstops(((Boolean) evt.getNewValue()).booleanValue());
|
||||
}
|
||||
}
|
||||
else if (Preferences.PROP_MNEMONIC_COLUMN.equals(evt.getPropertyName()) || Preferences.PROP_ARGUMENT_COLUMN.equals(evt.getPropertyName())
|
||||
|| Preferences.PROP_COMMENT_COLUMN.equals(evt.getPropertyName())) {
|
||||
CTabItem[] tabItem = tabFolder.getItems();
|
||||
for (int i = 0; i < tabItem.length; i++) {
|
||||
SourceEditorTab tab = (SourceEditorTab) tabItem[i].getData();
|
||||
tab.getEditor().setTabStops(new int[] {
|
||||
preferences.getMnemonicColumn(),
|
||||
preferences.getArgumentColumn(),
|
||||
preferences.getCommentColumn()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -292,8 +318,7 @@ public class Application {
|
|||
tab.setText(file.getName());
|
||||
tab.setToolTipText(file.getAbsolutePath());
|
||||
tab.setFile(file);
|
||||
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
|
||||
tab.getEditor().setFont(preferences.getEditorFont());
|
||||
applyEditoTabPreferences(tab);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1117,9 +1142,8 @@ public class Application {
|
|||
private void handleFileNew() {
|
||||
SourceEditorTab tab = new SourceEditorTab(tabFolder, "");
|
||||
tab.setText(getDefaultName());
|
||||
applyEditoTabPreferences(tab);
|
||||
tab.setFocus();
|
||||
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
|
||||
tab.getEditor().setFont(preferences.getEditorFont());
|
||||
}
|
||||
|
||||
String getDefaultName() {
|
||||
|
@ -1228,8 +1252,7 @@ public class Application {
|
|||
tab.setText(file.getName());
|
||||
tab.setToolTipText(file.getAbsolutePath());
|
||||
tab.setFile(file);
|
||||
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
|
||||
tab.getEditor().setFont(preferences.getEditorFont());
|
||||
applyEditoTabPreferences(tab);
|
||||
|
||||
tabFolder.setSelection(tab.getTabItem());
|
||||
tab.setFocus();
|
||||
|
@ -1239,6 +1262,18 @@ public class Application {
|
|||
}, true);
|
||||
}
|
||||
|
||||
void applyEditoTabPreferences(SourceEditorTab tab) {
|
||||
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
|
||||
tab.getEditor().setFont(preferences.getEditorFont());
|
||||
tab.getEditor().setTabWidth(preferences.getTabWidth());
|
||||
tab.getEditor().setTabStops(new int[] {
|
||||
preferences.getMnemonicColumn(),
|
||||
preferences.getArgumentColumn(),
|
||||
preferences.getCommentColumn()
|
||||
});
|
||||
tab.getEditor().setUseTabstops(preferences.isUseTabstops());
|
||||
}
|
||||
|
||||
private void handleFileSave() throws IOException {
|
||||
CTabItem tabItem = tabFolder.getSelection();
|
||||
if (tabItem == null) {
|
||||
|
|
|
@ -28,6 +28,11 @@ public class Preferences {
|
|||
public static final String PROP_ROOTS = "roots";
|
||||
public static final String PROP_EDITOR_FONT = "editorFont";
|
||||
public static final String PROP_SHOW_LINE_NUMBERS = "showLineNumbers";
|
||||
public static final String PROP_MNEMONIC_COLUMN = "mnemonicColumn";
|
||||
public static final String PROP_ARGUMENT_COLUMN = "argumentColumn";
|
||||
public static final String PROP_COMMENT_COLUMN = "commentColumn";
|
||||
public static final String PROP_USE_TABSTOPS = "useTabstops";
|
||||
public static final String PROP_TABWIDTH = "tabWidth";
|
||||
|
||||
public static final String PREFERENCES_NAME = ".z80-tools";
|
||||
|
||||
|
@ -67,6 +72,8 @@ public class Preferences {
|
|||
int commentColumn;
|
||||
int labelCase;
|
||||
int mnemonicCase;
|
||||
boolean useTabstops;
|
||||
int tabWidth;
|
||||
|
||||
boolean generateBinary;
|
||||
boolean generateHex;
|
||||
|
@ -83,6 +90,7 @@ public class Preferences {
|
|||
showLineNumbers = true;
|
||||
reloadOpenTabs = true;
|
||||
|
||||
tabWidth = 4;
|
||||
mnemonicColumn = 16;
|
||||
argumentColumn = mnemonicColumn + 6;
|
||||
commentColumn = mnemonicColumn + 40;
|
||||
|
@ -176,7 +184,7 @@ public class Preferences {
|
|||
}
|
||||
|
||||
public void setMnemonicColumn(int mnemonicColumn) {
|
||||
this.mnemonicColumn = mnemonicColumn;
|
||||
changeSupport.firePropertyChange(PROP_MNEMONIC_COLUMN, this.mnemonicColumn, this.mnemonicColumn = mnemonicColumn);
|
||||
}
|
||||
|
||||
public int getArgumentColumn() {
|
||||
|
@ -184,7 +192,7 @@ public class Preferences {
|
|||
}
|
||||
|
||||
public void setArgumentColumn(int argumentColumn) {
|
||||
this.argumentColumn = argumentColumn;
|
||||
changeSupport.firePropertyChange(PROP_ARGUMENT_COLUMN, this.argumentColumn, this.argumentColumn = argumentColumn);
|
||||
}
|
||||
|
||||
public int getCommentColumn() {
|
||||
|
@ -192,7 +200,7 @@ public class Preferences {
|
|||
}
|
||||
|
||||
public void setCommentColumn(int commentColumn) {
|
||||
this.commentColumn = commentColumn;
|
||||
changeSupport.firePropertyChange(PROP_COMMENT_COLUMN, this.commentColumn, this.commentColumn = commentColumn);
|
||||
}
|
||||
|
||||
public int getLabelCase() {
|
||||
|
@ -211,6 +219,22 @@ public class Preferences {
|
|||
this.mnemonicCase = mnemonicCase;
|
||||
}
|
||||
|
||||
public boolean isUseTabstops() {
|
||||
return useTabstops;
|
||||
}
|
||||
|
||||
public void setUseTabstops(boolean useTabstops) {
|
||||
changeSupport.firePropertyChange(PROP_USE_TABSTOPS, this.useTabstops, this.useTabstops = useTabstops);
|
||||
}
|
||||
|
||||
public int getTabWidth() {
|
||||
return tabWidth;
|
||||
}
|
||||
|
||||
public void setTabWidth(int tabWidth) {
|
||||
changeSupport.firePropertyChange(PROP_TABWIDTH, this.tabWidth, this.tabWidth = tabWidth);
|
||||
}
|
||||
|
||||
public boolean isGenerateBinary() {
|
||||
return generateBinary;
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ public class PreferencesDialog extends Dialog {
|
|||
Text editorFont;
|
||||
Button editorFontBrowse;
|
||||
Button showLineNumbers;
|
||||
Text tabWidth;
|
||||
Button useTabstops;
|
||||
Button reloadOpenTabs;
|
||||
|
||||
Text mnemonicColumn;
|
||||
|
@ -131,6 +133,19 @@ public class PreferencesDialog extends Dialog {
|
|||
showLineNumbers.setText("Show line numbers");
|
||||
showLineNumbers.setSelection(preferences.isShowLineNumbers());
|
||||
|
||||
label = new Label(composite, SWT.NONE);
|
||||
label.setText("Tab width");
|
||||
|
||||
tabWidth = new Text(composite, SWT.BORDER);
|
||||
tabWidth.setLayoutData(new GridData(convertWidthInCharsToPixels(4), SWT.DEFAULT));
|
||||
tabWidth.setText(String.valueOf(preferences.getTabWidth()));
|
||||
|
||||
new Label(composite, SWT.NONE);
|
||||
|
||||
useTabstops = new Button(composite, SWT.CHECK);
|
||||
useTabstops.setText("Use formatter tabstops");
|
||||
useTabstops.setSelection(preferences.isUseTabstops());
|
||||
|
||||
new Label(composite, SWT.NONE);
|
||||
|
||||
reloadOpenTabs = new Button(composite, SWT.CHECK);
|
||||
|
@ -143,26 +158,7 @@ public class PreferencesDialog extends Dialog {
|
|||
|
||||
addSeparator(composite);
|
||||
|
||||
label = new Label(composite, SWT.NONE);
|
||||
label.setText("Compiler output");
|
||||
|
||||
Composite group = new Composite(composite, SWT.NONE);
|
||||
layout = new GridLayout(3, false);
|
||||
layout.marginWidth = layout.marginHeight = 0;
|
||||
group.setLayout(layout);
|
||||
group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
|
||||
generateBinary = new Button(group, SWT.CHECK);
|
||||
generateBinary.setText("Binary");
|
||||
generateBinary.setSelection(preferences.isGenerateBinary());
|
||||
|
||||
generateHex = new Button(group, SWT.CHECK);
|
||||
generateHex.setText("Intel Hex");
|
||||
generateHex.setSelection(preferences.isGenerateHex());
|
||||
|
||||
generateListing = new Button(group, SWT.CHECK);
|
||||
generateListing.setText("Listing");
|
||||
generateListing.setSelection(preferences.isGenerateListing());
|
||||
createCompilerGroup(composite);
|
||||
|
||||
addSeparator(composite);
|
||||
|
||||
|
@ -289,19 +285,19 @@ public class PreferencesDialog extends Dialog {
|
|||
Label label = new Label(parent, SWT.NONE);
|
||||
label.setText("Mnemonic column");
|
||||
mnemonicColumn = new Text(parent, SWT.BORDER);
|
||||
mnemonicColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(3), SWT.DEFAULT));
|
||||
mnemonicColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(4), SWT.DEFAULT));
|
||||
mnemonicColumn.setText(String.valueOf(preferences.getMnemonicColumn()));
|
||||
|
||||
label = new Label(parent, SWT.NONE);
|
||||
label.setText("Arguments column");
|
||||
argumentColumn = new Text(parent, SWT.BORDER);
|
||||
argumentColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(3), SWT.DEFAULT));
|
||||
argumentColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(4), SWT.DEFAULT));
|
||||
argumentColumn.setText(String.valueOf(preferences.getArgumentColumn()));
|
||||
|
||||
label = new Label(parent, SWT.NONE);
|
||||
label.setText("Comment column");
|
||||
commentColumn = new Text(parent, SWT.BORDER);
|
||||
commentColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(3), SWT.DEFAULT));
|
||||
commentColumn.setLayoutData(new GridData(convertWidthInCharsToPixels(4), SWT.DEFAULT));
|
||||
commentColumn.setText(String.valueOf(preferences.getCommentColumn()));
|
||||
|
||||
label = new Label(parent, SWT.NONE);
|
||||
|
@ -325,6 +321,29 @@ public class PreferencesDialog extends Dialog {
|
|||
mnemonicCase.select(preferences.getMnemonicCase());
|
||||
}
|
||||
|
||||
void createCompilerGroup(Composite parent) {
|
||||
Label label = new Label(parent, SWT.NONE);
|
||||
label.setText("Compiler output");
|
||||
|
||||
Composite group = new Composite(parent, SWT.NONE);
|
||||
GridLayout layout = new GridLayout(3, false);
|
||||
layout.marginWidth = layout.marginHeight = 0;
|
||||
group.setLayout(layout);
|
||||
group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||
|
||||
generateBinary = new Button(group, SWT.CHECK);
|
||||
generateBinary.setText("Binary");
|
||||
generateBinary.setSelection(preferences.isGenerateBinary());
|
||||
|
||||
generateHex = new Button(group, SWT.CHECK);
|
||||
generateHex.setText("Intel Hex");
|
||||
generateHex.setSelection(preferences.isGenerateHex());
|
||||
|
||||
generateListing = new Button(group, SWT.CHECK);
|
||||
generateListing.setText("Listing");
|
||||
generateListing.setSelection(preferences.isGenerateListing());
|
||||
}
|
||||
|
||||
void addSeparator(Composite parent) {
|
||||
Label label = new Label(parent, SWT.NONE);
|
||||
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, ((GridLayout) parent.getLayout()).numColumns, 1));
|
||||
|
@ -337,6 +356,8 @@ public class PreferencesDialog extends Dialog {
|
|||
|
||||
preferences.setEditorFont(editorFont.getText().equals(defaultFont) ? null : editorFont.getText());
|
||||
preferences.setShowLineNumbers(showLineNumbers.getSelection());
|
||||
preferences.setTabWidth(Integer.valueOf(tabWidth.getText()));
|
||||
preferences.setUseTabstops(useTabstops.getSelection());
|
||||
preferences.setReloadOpenTabs(reloadOpenTabs.getSelection());
|
||||
|
||||
preferences.setMnemonicColumn(Integer.valueOf(mnemonicColumn.getText()));
|
||||
|
|
|
@ -84,6 +84,8 @@ public class SourceEditor {
|
|||
boolean ignoreRedo;
|
||||
|
||||
boolean showLineNumbers = true;
|
||||
int[] tabStops;
|
||||
boolean useTabstops;
|
||||
|
||||
class TextChange {
|
||||
|
||||
|
@ -675,26 +677,10 @@ public class SourceEditor {
|
|||
}
|
||||
sb.insert(index, text.getLineDelimiter());
|
||||
|
||||
if (lineOffset > 0 && lineText.charAt(lineOffset - 1) == '{') {
|
||||
String temp = sb.toString();
|
||||
for (i = 0; i < text.getTabs(); i++) {
|
||||
sb.append(' ');
|
||||
}
|
||||
offset += sb.length();
|
||||
sb.append(temp);
|
||||
sb.append('}');
|
||||
if (lineOffset > 1 && lineText.charAt(lineOffset - 2) == '{') {
|
||||
sb.append('}');
|
||||
}
|
||||
}
|
||||
else {
|
||||
offset += sb.length();
|
||||
}
|
||||
|
||||
text.setRedraw(false);
|
||||
try {
|
||||
text.insert(sb.toString());
|
||||
text.setCaretOffset(offset);
|
||||
text.setCaretOffset(offset + sb.length());
|
||||
} finally {
|
||||
text.setRedraw(true);
|
||||
}
|
||||
|
@ -1020,47 +1006,26 @@ public class SourceEditor {
|
|||
int offset = text.getCaretOffset();
|
||||
int lineNumber = text.getLineAtOffset(offset);
|
||||
int lineStart = text.getOffsetAtLine(lineNumber);
|
||||
|
||||
int lineOffset = offset - lineStart;
|
||||
String line = text.getLine(lineNumber);
|
||||
|
||||
int nonBlankOffset = 0;
|
||||
while (nonBlankOffset < line.length() && (line.charAt(nonBlankOffset) == ' ' || line.charAt(nonBlankOffset) == '\t')) {
|
||||
nonBlankOffset++;
|
||||
}
|
||||
|
||||
int prevTabStop = -1;
|
||||
|
||||
if (nonBlankOffset == lineOffset) {
|
||||
while (lineNumber > 0) {
|
||||
line = text.getLine(--lineNumber);
|
||||
if ("".equals(line.trim())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nonBlankOffset = 0;
|
||||
while (nonBlankOffset < line.length() && (line.charAt(nonBlankOffset) == ' ' || line.charAt(nonBlankOffset) == '\t')) {
|
||||
nonBlankOffset++;
|
||||
}
|
||||
if (nonBlankOffset > lineOffset) {
|
||||
prevTabStop = nonBlankOffset;
|
||||
break;
|
||||
int tabStop = ((lineOffset + text.getTabs()) / text.getTabs()) * text.getTabs();
|
||||
if (useTabstops && tabStops != null) {
|
||||
for (int i = tabStops.length - 1; i >= 0; i--) {
|
||||
if (lineOffset < tabStops[i]) {
|
||||
tabStop = tabStops[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (prevTabStop == -1) {
|
||||
prevTabStop = ((lineOffset + text.getTabs()) / text.getTabs()) * text.getTabs();
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
while (sb.length() < (prevTabStop - lineOffset)) {
|
||||
sb.append(" ");
|
||||
while (sb.length() < (tabStop - lineOffset)) {
|
||||
sb.append(' ');
|
||||
}
|
||||
|
||||
text.setRedraw(false);
|
||||
try {
|
||||
text.insert(sb.toString());
|
||||
text.setCaretOffset(lineStart + prevTabStop);
|
||||
text.setCaretOffset(lineStart + tabStop);
|
||||
text.showSelection();
|
||||
} finally {
|
||||
text.setRedraw(true);
|
||||
|
@ -1072,45 +1037,39 @@ public class SourceEditor {
|
|||
int lineNumber = text.getLineAtOffset(offset);
|
||||
int lineStart = text.getOffsetAtLine(lineNumber);
|
||||
|
||||
if (offset == lineStart) {
|
||||
if (offset == lineStart || !useTabstops) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int lineOffset = offset - lineStart;
|
||||
String line = text.getLine(lineNumber);
|
||||
|
||||
int nonBlankOffset = 0;
|
||||
while (nonBlankOffset < line.length() && (line.charAt(nonBlankOffset) == ' ' || line.charAt(nonBlankOffset) == '\t')) {
|
||||
nonBlankOffset++;
|
||||
}
|
||||
if (nonBlankOffset != lineOffset) {
|
||||
return true;
|
||||
int tabStop = (lineOffset / text.getTabs()) * text.getTabs();
|
||||
if (tabStop == lineOffset) {
|
||||
tabStop -= text.getTabs();
|
||||
}
|
||||
|
||||
int prevTabStop = -1;
|
||||
while (lineNumber > 0) {
|
||||
line = text.getLine(--lineNumber);
|
||||
if ("".equals(line.trim())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nonBlankOffset = 0;
|
||||
while (nonBlankOffset < line.length() && (line.charAt(nonBlankOffset) == ' ' || line.charAt(nonBlankOffset) == '\t')) {
|
||||
nonBlankOffset++;
|
||||
}
|
||||
if (nonBlankOffset < lineOffset) {
|
||||
prevTabStop = nonBlankOffset;
|
||||
break;
|
||||
if (tabStops != null) {
|
||||
for (int i = 0; i < tabStops.length; i++) {
|
||||
if (tabStops[i] < lineOffset) {
|
||||
tabStop = tabStops[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (prevTabStop == -1) {
|
||||
prevTabStop = ((lineOffset - 1) / text.getTabs()) * text.getTabs();
|
||||
|
||||
String s = text.getLine(lineNumber).substring(tabStop, lineOffset);
|
||||
while (s.endsWith(" ")) {
|
||||
s = s.substring(0, s.length() - 1);
|
||||
}
|
||||
if (s.length() != 0) {
|
||||
s = s + " ";
|
||||
if ((s.length() + tabStop) >= lineOffset) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
text.setRedraw(false);
|
||||
try {
|
||||
text.setSelection(lineStart + prevTabStop, offset);
|
||||
text.insert("");
|
||||
text.replaceTextRange(lineStart + tabStop, lineOffset - tabStop, s);
|
||||
text.showSelection();
|
||||
} finally {
|
||||
text.setRedraw(true);
|
||||
|
@ -1118,4 +1077,31 @@ public class SourceEditor {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
public int[] getTabStops() {
|
||||
return tabStops;
|
||||
}
|
||||
|
||||
public void setTabStops(int[] tabStops) {
|
||||
this.tabStops = new int[tabStops.length + 1];
|
||||
this.tabStops[0] = 0;
|
||||
System.arraycopy(tabStops, 0, this.tabStops, 1, tabStops.length);
|
||||
}
|
||||
|
||||
public boolean isUseTabstops() {
|
||||
return useTabstops;
|
||||
}
|
||||
|
||||
public void setUseTabstops(boolean useTabstops) {
|
||||
this.useTabstops = useTabstops;
|
||||
}
|
||||
|
||||
public void setTabWidth(int width) {
|
||||
text.setTabs(width);
|
||||
}
|
||||
|
||||
public int getTabWidth() {
|
||||
return text.getTabs();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue