/* * Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, version 2.0. If a copy of the MPL was not distributed with * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This Source Code Form is "Incompatible With Secondary Licenses", as * defined by the Mozilla Public License, version 2.0. */ package com.trollworks.gcs.common; import com.trollworks.toolkit.annotation.Localize; import com.trollworks.toolkit.ui.UIUtilities; import com.trollworks.toolkit.ui.menu.edit.Undoable; import com.trollworks.toolkit.ui.menu.file.CloseHandler; import com.trollworks.toolkit.ui.menu.file.SaveCommand; import com.trollworks.toolkit.ui.menu.file.Saveable; import com.trollworks.toolkit.ui.widget.DataModifiedListener; import com.trollworks.toolkit.ui.widget.WindowUtils; import com.trollworks.toolkit.ui.widget.dock.DockContainer; import com.trollworks.toolkit.ui.widget.dock.Dockable; import com.trollworks.toolkit.utility.Localization; import com.trollworks.toolkit.utility.PathUtils; import com.trollworks.toolkit.utility.undo.StdUndoManager; import java.awt.BorderLayout; import java.awt.Window; import java.io.File; import javax.swing.Icon; /** Provides a common base for library and sheet files. */ public abstract class CommonDockable extends Dockable implements CloseHandler, Saveable, Undoable { @Localize("An error occurred while trying to save the file.") @Localize(locale = "de", value = "Ein Fehler ist beim Speichern der Datei aufgetreten.") @Localize(locale = "ru", value = "Произошла ошибка при попытке сохранить файл.") @Localize(locale = "es", value = "Ha ocurrido un error mientras se intentaba guardar el archivo.") private static String SAVE_ERROR; static { Localization.initialize(); } private DataFile mDataFile; private String mUntitledName; /** * Creates a new {@link CommonDockable}. * * @param file The {@link DataFile} to use. */ protected CommonDockable(DataFile file) { super(new BorderLayout()); mDataFile = file; mDataFile.setUndoManager(new StdUndoManager()); } /** @return The {@link DataFile}. */ public DataFile getDataFile() { return mDataFile; } @Override public File getBackingFile() { return mDataFile.getFile(); } @Override public void toFrontAndFocus() { Window window = UIUtilities.getAncestorOfType(this, Window.class); if (window != null) { window.toFront(); } DockContainer dc = getDockContainer(); dc.setCurrentDockable(this); dc.doLayout(); dc.acquireFocus(); } @Override public StdUndoManager getUndoManager() { return mDataFile.getUndoManager(); } @Override public boolean isModified() { return mDataFile.isModified(); } @Override public void addDataModifiedListener(DataModifiedListener listener) { mDataFile.addDataModifiedListener(listener); } @Override public void removeDataModifiedListener(DataModifiedListener listener) { mDataFile.removeDataModifiedListener(listener); } @Override public String getSaveTitle() { return getTitle(); } @Override public String getPreferredSavePath() { return PathUtils.getFullPath(getBackingFile()); } @Override public File[] saveTo(File file) { if (mDataFile.save(file)) { mDataFile.setFile(file); getDockContainer().updateTitle(this); return new File[] { file }; } WindowUtils.showError(this, SAVE_ERROR); return new File[0]; } @Override public boolean mayAttemptClose() { return true; } @Override public boolean attemptClose() { if (SaveCommand.attemptSave(this)) { getDockContainer().close(this); return true; } return false; } @Override public String getTitle() { File file = getBackingFile(); String title; if (file == null) { if (mUntitledName == null) { mUntitledName = getDockContainer().getDock().getNextUntitledDockableName(getUntitledBaseName(), this); } title = mUntitledName; } else { title = PathUtils.getLeafName(file.getName(), false); } return title; } protected abstract String getUntitledBaseName(); @Override public Icon getTitleIcon() { return getDataFile().getFileIcons().getImage(16); } @Override public String getTitleTooltip() { StringBuilder buffer = new StringBuilder(); buffer.append("<html><body><b>"); //$NON-NLS-1$ buffer.append(getTitle()); buffer.append("</b>"); //$NON-NLS-1$ File file = getBackingFile(); if (file != null) { buffer.append("<br><font size='-2'>"); //$NON-NLS-1$ buffer.append(file.getAbsolutePath()); buffer.append("</font>"); //$NON-NLS-1$ } buffer.append("</body></html>"); //$NON-NLS-1$ return buffer.toString(); } }