Mercurial > hg > Applications > tvnjviewer
diff src/viewer_swing/java/com/glavsoft/viewer/UiSettings.java @ 0:daa24f8a557b
TightVNC original
author | YU |
---|---|
date | Thu, 11 Sep 2014 07:30:03 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/viewer_swing/java/com/glavsoft/viewer/UiSettings.java Thu Sep 11 07:30:03 2014 +0900 @@ -0,0 +1,190 @@ +// Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC. +// All rights reserved. +// +//------------------------------------------------------------------------- +// This file is part of the TightVNC software. Please visit our Web site: +// +// http://www.tightvnc.com/ +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +//------------------------------------------------------------------------- +// + +package com.glavsoft.viewer; + +import com.glavsoft.core.SettingsChangedEvent; +import com.glavsoft.rfb.IChangeSettingsListener; +import com.glavsoft.viewer.swing.LocalMouseCursorShape; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.LinkedList; +import java.util.List; + +/** + * @author dime at tightvnc.com + */ +public class UiSettings { + + public static final int MIN_SCALE_PERCENT = 10; + public static final int MAX_SCALE_PERCENT = 500; + private static final int SCALE_PERCENT_ZOOMING_STEP = 10; + + @SuppressWarnings("PointlessBitwiseExpression") + public static final int CHANGED_SCALE_FACTOR = 1 << 0; + public static final int CHANGED_MOUSE_CURSOR_SHAPE = 1 << 1; + public static final int CHANGED_FULL_SCREEN = 1 << 2; + + private final List<IChangeSettingsListener> listeners = new LinkedList<IChangeSettingsListener>(); + private int changedSettingsMask = 0; + + private final UiSettingsData uiSettingsData; + public boolean showControls = true; + + public UiSettings() { + uiSettingsData = new UiSettingsData(); + changedSettingsMask = 0; + } + + public UiSettings(UiSettings uiSettings) { + uiSettingsData = new UiSettingsData( + uiSettings.getScalePercent(), uiSettings.getMouseCursorShape(), uiSettings.isFullScreen()); + this.changedSettingsMask = uiSettings.changedSettingsMask; + } + + public double getScaleFactor() { + return uiSettingsData.getScalePercent() / 100.; + } + + public void setScalePercent(double scalePercent) { + if (this.uiSettingsData.setScalePercent(scalePercent)) { + changedSettingsMask |= CHANGED_SCALE_FACTOR; + } + } + + public void addListener(IChangeSettingsListener listener) { + listeners.add(listener); + } + + void fireListeners() { + if (null == listeners) return; + final SettingsChangedEvent event = new SettingsChangedEvent(new UiSettings(this)); + changedSettingsMask = 0; + for (IChangeSettingsListener listener : listeners) { + listener.settingsChanged(event); + } + } + + public void zoomOut() { + double oldScaleFactor = uiSettingsData.getScalePercent(); + double scaleFactor = (int)(this.uiSettingsData.getScalePercent() / SCALE_PERCENT_ZOOMING_STEP) * SCALE_PERCENT_ZOOMING_STEP; + if (scaleFactor == oldScaleFactor) { + scaleFactor -= SCALE_PERCENT_ZOOMING_STEP; + } + if (scaleFactor < MIN_SCALE_PERCENT) { + scaleFactor = MIN_SCALE_PERCENT; + } + setScalePercent(scaleFactor); + fireListeners(); + } + + public void zoomIn() { + double scaleFactor = (int)(this.uiSettingsData.getScalePercent() / SCALE_PERCENT_ZOOMING_STEP) * SCALE_PERCENT_ZOOMING_STEP + SCALE_PERCENT_ZOOMING_STEP; + if (scaleFactor > MAX_SCALE_PERCENT) { + scaleFactor = MAX_SCALE_PERCENT; + } + setScalePercent(scaleFactor); + fireListeners(); + } + + public void zoomAsIs() { + setScalePercent(100); + fireListeners(); + } + + public void zoomToFit(int containerWidth, int containerHeight, int fbWidth, int fbHeight) { + int scalePromille = Math.min(1000 * containerWidth / fbWidth, + 1000 * containerHeight / fbHeight); + while (fbWidth * scalePromille / 1000. > containerWidth || + fbHeight * scalePromille / 1000. > containerHeight) { + scalePromille -= 1; + } + setScalePercent(scalePromille / 10.); + fireListeners(); + } + + public boolean isChangedMouseCursorShape() { + return (changedSettingsMask & CHANGED_MOUSE_CURSOR_SHAPE) == CHANGED_MOUSE_CURSOR_SHAPE; + } + + public static boolean isUiSettingsChangedFired(SettingsChangedEvent event) { + return event.getSource() instanceof UiSettings; + } + + public double getScalePercent() { + return uiSettingsData.getScalePercent(); + } + + public String getScalePercentFormatted() { + NumberFormat numberFormat = new DecimalFormat("###.#"); + return numberFormat.format(uiSettingsData.getScalePercent()); + } + + public LocalMouseCursorShape getMouseCursorShape() { + return uiSettingsData.getMouseCursorShape(); + } + + public void setMouseCursorShape(LocalMouseCursorShape mouseCursorShape) { + if (this.uiSettingsData.setMouseCursorShape(mouseCursorShape)) { + changedSettingsMask |= CHANGED_MOUSE_CURSOR_SHAPE; + fireListeners(); + } + } + + public void copyDataFrom(UiSettingsData other) { + copyDataFrom(other, 0); + } + public void copyDataFrom(UiSettingsData other, int mask) { + if (null == other) return; + if ((mask & CHANGED_SCALE_FACTOR) == 0) uiSettingsData.setScalePercent(other.getScalePercent()); + if ((mask & CHANGED_MOUSE_CURSOR_SHAPE) == 0) uiSettingsData.setMouseCursorShape(other.getMouseCursorShape()); + if ((mask & CHANGED_FULL_SCREEN) == 0) uiSettingsData.setFullScreen(other.isFullScreen()); + } + + public void setFullScreen(boolean isFullScreen) { + if (uiSettingsData.setFullScreen(isFullScreen)) { + changedSettingsMask |= CHANGED_FULL_SCREEN; + fireListeners(); + } + } + + public boolean isFullScreen() { + return uiSettingsData.isFullScreen(); + } + + public UiSettingsData getData() { + return uiSettingsData; + } + + @Override + public String toString() { + return "UiSettings{" + + "scalePercent=" + uiSettingsData.getScalePercent() + + ", fullScreen=" + uiSettingsData.isFullScreen() + + ", mouseCursorShape=" + uiSettingsData.getMouseCursorShape() + + '}'; + } + +}