package com.swingsane.business.options;
import java.util.HashMap;
import java.util.List;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import com.swingsane.preferences.IPreferredDefaults.ColorMode;
import com.swingsane.preferences.IPreferredDefaults.Source;
import com.swingsane.preferences.model.BooleanOption;
import com.swingsane.preferences.model.Constraints;
import com.swingsane.preferences.model.FixedOption;
import com.swingsane.preferences.model.IntegerOption;
import com.swingsane.preferences.model.Scanner;
import com.swingsane.preferences.model.StringOption;
/**
* Known Sane Options. Refactor this class to support different scanners.
*/
public final class KnownSaneOptions {
public static SpinnerModel getBlackThresholdModel(Scanner scanner) {
SpinnerNumberModel blackThresholdModel = new SpinnerNumberModel(0, MIN_BLACK_THRESHOLD,
MAX_BLACK_THRESHOLD, 1);
HashMap<String, FixedOption> fixedOptions = scanner.getFixedOptions();
FixedOption fixedOption = fixedOptions.get(SANE_NAME_THRESHOLD);
if (fixedOption == null) {
return null;
}
Constraints constraints = fixedOption.getConstraints();
Integer maxInt = constraints.getMaximumInteger();
Integer minInt = constraints.getMinimumInteger();
blackThresholdModel.setMaximum(maxInt);
blackThresholdModel.setMinimum(minInt);
blackThresholdModel.setStepSize(constraints.getQuantumInteger());
blackThresholdModel.setValue(fixedOption.getValue());
return blackThresholdModel;
}
public static String getColorMode(Scanner scanner) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_MODE);
if (stringOption == null) {
return null;
}
return stringOption.getValue();
}
public static ComboBoxModel<String> getColorModeComponent(Scanner scanner) {
DefaultComboBoxModel<String> colorModel = new DefaultComboBoxModel<String>();
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_MODE);
if (stringOption == null) {
return null;
}
Constraints constraints = stringOption.getConstraints();
List<String> values = constraints.getStringList();
for (String value : values) {
colorModel.addElement(value);
}
if (values.size() > 0) {
return colorModel;
} else {
return null;
}
}
public static String getPageSize(Scanner scanner) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(EPSON_NAME_SCAN_AREA);
if (stringOption == null) {
return null;
}
return stringOption.getValue();
}
public static ComboBoxModel<String> getPageSizeModel(Scanner scanner) {
DefaultComboBoxModel<String> pageSizeModel = new DefaultComboBoxModel<String>();
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(EPSON_NAME_SCAN_AREA);
if (stringOption == null) {
return null;
}
Constraints constraints = stringOption.getConstraints();
List<String> values = constraints.getStringList();
for (String value : values) {
pageSizeModel.addElement(value);
}
if (values.size() > 0) {
return pageSizeModel;
} else {
return null;
}
}
public static Integer getResolution(Scanner scanner) {
HashMap<String, IntegerOption> integerOptions = scanner.getIntegerOptions();
IntegerOption integerOption = integerOptions.get(SANE_NAME_SCAN_RESOLUTION);
if (integerOption == null) {
integerOption = integerOptions.get(SANE_NAME_SCAN_X_RESOLUTION);
}
if (integerOption == null) {
return null;
}
return new Integer(integerOption.getValue());
}
public static ComboBoxModel<Integer> getResolutionModel(Scanner scanner) {
DefaultComboBoxModel<Integer> resolutionModel = new DefaultComboBoxModel<Integer>();
HashMap<String, IntegerOption> integerOptions = scanner.getIntegerOptions();
IntegerOption integerOption = integerOptions.get(SANE_NAME_SCAN_RESOLUTION);
if (integerOption == null) {
integerOption = integerOptions.get(SANE_NAME_SCAN_X_RESOLUTION);
}
if (integerOption == null) {
return null;
}
Constraints constraints = integerOption.getConstraints();
List<Integer> integerList = constraints.getIntegerList();
Integer maxInt = constraints.getMaximumInteger();
Integer minInt = constraints.getMinimumInteger();
Integer quantum = constraints.getQuantumInteger();
if (integerList != null) {
for (Integer value : integerList) {
resolutionModel.addElement(value);
}
} else {
for (int res = minInt; res >= maxInt; res += quantum) {
resolutionModel.addElement(res);
}
}
if (resolutionModel.getSize() > 0) {
return resolutionModel;
} else {
return null;
}
}
public static String getSource(Scanner scanner) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_SOURCE);
if (stringOption == null) {
stringOption = stringOptions.get(SAMSUNG_NAME_SCAN_SOURCE);
if (stringOption == null) {
return null;
}
}
return stringOption.getValue();
}
public static ComboBoxModel<String> getSourceModel(Scanner scanner) {
DefaultComboBoxModel<String> sourceModel = new DefaultComboBoxModel<String>();
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_SOURCE);
if (stringOption == null) {
return null;
}
Constraints constraints = stringOption.getConstraints();
List<String> values = constraints.getStringList();
for (String value : values) {
sourceModel.addElement(value);
}
if (values.size() > 0) {
return sourceModel;
} else {
return null;
}
}
public static boolean isAutoCropAvailable(Scanner scanner) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(EPSON_NAME_AUTOCROP); // epson scanners only?
return !(booleanOption == null);
}
public static boolean isAutoCropSelected(Scanner scanner) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(EPSON_NAME_AUTOCROP); // epson scanners only?
if (booleanOption == null) {
return false;
} else {
return booleanOption.getValue();
}
}
private static boolean isAutomaticDocumentFeederString(String value) {
return value.toLowerCase().contains("adf") || value.toLowerCase().contains("document feeder");
}
public static boolean isBatchScanAvailable(Scanner scanner) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(SANE_KNOWN_OPTION_BATCH_SCAN);
if (booleanOption == null) {
booleanOption = booleanOptions.get(EPSON_NAME_ADF_AUTO_SCAN);
if (booleanOption == null) {
return false;
}
}
return true;
}
public static boolean isBatchScanSelected(Scanner scanner) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(SANE_KNOWN_OPTION_BATCH_SCAN);
if (booleanOption == null) {
booleanOption = booleanOptions.get(EPSON_NAME_ADF_AUTO_SCAN);
if (booleanOption == null) {
return false;
}
}
return booleanOption.getValue();
}
private static boolean isBinaryColorString(String value) {
return value.toLowerCase().contains("black & white") || value.toLowerCase().contains("mono")
|| value.toLowerCase().contains("binary") || value.toLowerCase().contains("halftone")
|| value.toLowerCase().contains("thresholded") || value.toLowerCase().contains("lineart");
}
private static boolean isColorColorString(String value) {
return value.toLowerCase().contains("color");
}
public static boolean isDuplexScanningAvailable(Scanner scanner) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_KNOWN_OPTION_DUPLEX);
if (stringOption == null) {
stringOption = stringOptions.get(EPSON_NAME_ADF_MODE);
}
return !(stringOption == null);
}
public static boolean isDuplexScanningEnabled(Scanner scanner) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_KNOWN_OPTION_DUPLEX);
if ((stringOption != null) && (!stringOption.getOptionsOrderValuePair().isActive())) {
return false;
}
if (stringOption == null) {
stringOption = stringOptions.get(EPSON_NAME_ADF_MODE);
if ((stringOption == null) || !stringOption.getOptionsOrderValuePair().isActive()) {
return false;
}
}
return stringOption.getValue().toLowerCase().contains("duplex");
}
private static boolean isFlatbedFeederString(String value) {
return value.toLowerCase().contains("flatbed");
}
private static boolean isGrayscaleColorString(String value) {
return value.toLowerCase().contains("gray") || value.toLowerCase().contains("grey");
}
public static boolean isUsingDefaultBlackThreshold(Scanner scanner) {
HashMap<String, FixedOption> fixedOptions = scanner.getFixedOptions();
FixedOption fixedOption = fixedOptions.get(SANE_NAME_THRESHOLD);
if (fixedOption == null) {
return false;
}
return fixedOption.getOptionsOrderValuePair().isActive();
}
public static void setAutoCrop(Scanner scanner, boolean autoCropEnabled) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(EPSON_NAME_AUTOCROP); // epson scanners only?
if (booleanOption == null) {
return;
}
booleanOption.setValue(autoCropEnabled);
}
public static void setBatchScan(Scanner scanner, boolean enabled) {
HashMap<String, BooleanOption> booleanOptions = scanner.getBooleanOptions();
BooleanOption booleanOption = booleanOptions.get(SANE_KNOWN_OPTION_BATCH_SCAN);
if (booleanOption == null) {
booleanOption = booleanOptions.get(EPSON_NAME_ADF_AUTO_SCAN);
}
if (booleanOption == null) {
return;
}
booleanOption.setValue(enabled);
}
public static void setBlackThreshold(Scanner scanner, int blackThreshold) {
HashMap<String, FixedOption> fixedOptions = scanner.getFixedOptions();
FixedOption fixedOption = fixedOptions.get(SANE_NAME_THRESHOLD);
if (fixedOption == null) {
return;
}
fixedOption.setValue(blackThreshold);
}
public static void setColorMode(Scanner scanner, String colorMode) {
HashMap<String, IntegerOption> integerOptions = scanner.getIntegerOptions();
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_MODE);
if (stringOption == null) {
return;
}
IntegerOption depth = integerOptions.get(SANE_NAME_BIT_DEPTH);
// black and white
if (isBinaryColorString(colorMode)) {
if (depth != null) {
depth.getOptionsOrderValuePair().setActive(false);
}
stringOption.setValue(colorMode);
return;
}
Constraints depthConstraints = depth.getConstraints();
// grayscale
if (colorMode.toLowerCase().contains("gray") || colorMode.toLowerCase().contains("grey")) {
if (depthConstraints != null) {
List<Integer> values = depthConstraints.getIntegerList();
if (values.contains(COLOR_DEPTH_8_BIT)) {
depth.setValue(COLOR_DEPTH_8_BIT);
} else if (values.contains(COLOR_DEPTH_12_BIT)) {
depth.setValue(COLOR_DEPTH_12_BIT);
} else if (values.contains(COLOR_DEPTH_16_BIT)) {
depth.setValue(COLOR_DEPTH_16_BIT);
} else if (values.contains(COLOR_DEPTH_24_BIT)) {
depth.setValue(COLOR_DEPTH_24_BIT);
}
}
stringOption.setValue(colorMode);
return;
}
// color
if (depthConstraints != null) {
List<Integer> values = depthConstraints.getIntegerList();
if (values.contains(COLOR_DEPTH_16_BIT)) {
depth.setValue(COLOR_DEPTH_16_BIT);
} else if (values.contains(COLOR_DEPTH_24_BIT)) {
depth.setValue(COLOR_DEPTH_24_BIT);
}
}
stringOption.setValue(colorMode);
}
public static void setDefaultColorMode(Scanner scanner, ColorMode color) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_MODE);
if (stringOption == null) {
return;
}
Constraints constraints = stringOption.getConstraints();
if (constraints == null) {
return;
}
List<String> values = constraints.getStringList();
for (String value : values) {
switch (color) {
case BLACK_AND_WHITE:
if (isBinaryColorString(value)) {
setColorMode(scanner, value);
return;
}
break;
case GRAYSCALE:
if (isGrayscaleColorString(value)) {
setColorMode(scanner, value);
return;
}
break;
case COLOR:
if (isColorColorString(value)) {
setColorMode(scanner, value);
return;
}
break;
default:
break;
}
}
}
public static void setDefaultScanArea(Scanner scanner, String defaultScanArea) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(EPSON_NAME_SCAN_AREA);
if (stringOption == null) {
return;
}
Constraints constraints = stringOption.getConstraints();
if (constraints == null) {
return;
}
List<String> values = constraints.getStringList();
for (String value : values) {
if (value.toLowerCase().contains(defaultScanArea.toLowerCase())) {
setScanArea(scanner, value);
return;
}
}
}
public static void setDefaultSource(Scanner scanner, Source source) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_SOURCE);
if (stringOption == null) {
return;
}
Constraints constraints = stringOption.getConstraints();
if (constraints == null) {
return;
}
List<String> values = constraints.getStringList();
for (String value : values) {
switch (source) {
case AUTOMATIC_DOCUMENT_FEEDER:
if (isAutomaticDocumentFeederString(value)) {
setSource(scanner, value);
return;
}
break;
case FLATBED:
if (isFlatbedFeederString(value)) {
setSource(scanner, value);
return;
}
break;
default:
break;
}
}
}
public static void setDuplex(Scanner scanner, boolean isDuplex) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_KNOWN_OPTION_DUPLEX);
if (stringOption == null) {
stringOption = stringOptions.get(EPSON_NAME_ADF_MODE);
if (stringOption == null) {
return;
}
}
Constraints constraints = stringOption.getConstraints();
List<String> values = constraints.getStringList();
if (isDuplex) {
for (String value : values) {
if (value.toLowerCase().contains("duplex")) {
stringOption.setValue(value);
stringOption.getOptionsOrderValuePair().setActive(true);
return;
}
}
} else {
for (String value : values) {
if (!(value.toLowerCase().contains("duplex"))) {
stringOption.setValue(value);
return;
}
}
}
}
public static void setResolution(Scanner scanner, Integer resolution) {
HashMap<String, IntegerOption> integerOptions = scanner.getIntegerOptions();
if (integerOptions.get(SANE_NAME_SCAN_X_RESOLUTION) != null) {
integerOptions.get(SANE_NAME_SCAN_X_RESOLUTION).setValue(resolution);
integerOptions.get(SANE_NAME_SCAN_Y_RESOLUTION).setValue(resolution);
}
if (integerOptions.get(SANE_NAME_SCAN_RESOLUTION) != null) {
integerOptions.get(SANE_NAME_SCAN_RESOLUTION).setValue(resolution);
}
}
public static void setScanArea(Scanner scanner, String pageSize) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(EPSON_NAME_SCAN_AREA);
if (stringOption == null) {
return;
}
stringOption.setValue(pageSize);
}
public static void setSource(Scanner scanner, String source) {
HashMap<String, StringOption> stringOptions = scanner.getStringOptions();
StringOption stringOption = stringOptions.get(SANE_NAME_SCAN_SOURCE);
if (stringOption == null) {
stringOption = stringOptions.get(SAMSUNG_NAME_SCAN_SOURCE);
if (stringOption == null) {
return;
}
}
stringOption.setValue(source);
}
public static void setUsingDefaultBlackThreshold(Scanner scanner,
boolean usingDefaultBlackThreshold) {
HashMap<String, FixedOption> fixedOptions = scanner.getFixedOptions();
FixedOption fixedOption = fixedOptions.get(SANE_NAME_THRESHOLD);
if (fixedOption == null) {
return;
}
fixedOption.getOptionsOrderValuePair().setActive(usingDefaultBlackThreshold);
}
private static final int MAX_BLACK_THRESHOLD = 128;
private static final int MIN_BLACK_THRESHOLD = -128;
private static final int COLOR_DEPTH_8_BIT = 8;
private static final int COLOR_DEPTH_12_BIT = 12;
private static final int COLOR_DEPTH_16_BIT = 16;
private static final int COLOR_DEPTH_24_BIT = 24;
private static final String SANE_KNOWN_OPTION_DUPLEX = "duplex";
private static final String SANE_KNOWN_OPTION_BATCH_SCAN = "batch-scan";
public static final String EPSON_NAME_ADF_AUTO_SCAN = "adf-auto-scan"; // batch-scan ??
public static final String EPSON_NAME_ADF_MODE = "adf-mode"; // duplex ??
public static final String EPSON_NAME_AUTOCROP = "autocrop";
public static final String EPSON_NAME_SCAN_AREA = "scan-area";
public static final String SAMSUNG_NAME_SCAN_SOURCE = "doc-source"; // source ??
public static final String SANE_NAME_BIT_DEPTH = "depth";
public static final String SANE_NAME_SCAN_MODE = "mode";
public static final String SANE_NAME_SCAN_RESOLUTION = "resolution";
public static final String SANE_NAME_SCAN_SOURCE = "source";
public static final String SANE_NAME_SCAN_X_RESOLUTION = "x-resolution";
public static final String SANE_NAME_SCAN_Y_RESOLUTION = "y-resolution";
public static final String SANE_NAME_THRESHOLD = "threshold";
private KnownSaneOptions() {
}
}