blob: e43d183830004f685f43afa9429340cac8028e3d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package com.sun.star.wizards.web;
import com.sun.star.awt.FontDescriptor;
import com.sun.star.awt.Size;
import com.sun.star.awt.XButton;
import com.sun.star.awt.XFixedText;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.wizards.common.Helper;
import com.sun.star.wizards.common.HelpIds;
import com.sun.star.wizards.common.JavaTools;
import com.sun.star.wizards.common.IRenderer;
import com.sun.star.wizards.common.PropertyNames;
import com.sun.star.wizards.ui.ImageList;
import com.sun.star.wizards.ui.UIConsts;
import com.sun.star.wizards.ui.UnoDialog2;
import com.sun.star.wizards.ui.ImageList.Counter;
/**
* This class is a general implementation for a
* dialog which displays a choice of images.
* The model and the renderer are
* still abstract in this class.
* To use the class one should extend it,
* in the constructor then set the imageList
* properties (member name il) like image size, grid size,
* model renderer aso, and then call "build".
* This class uses a counter renderer which
* gets an expression which contains %START %END %TOTAL and replaces
* them with the actual numbers.
* <BR/>
* two buttons: "other" and "none" which are there
* to enable choosing images that are not in the list and
* "no image" respectivley, are optional, with default to true,
* so dialogs which do not need those, should set the corresponding
* members showDeselectButton and/or showOtherButton to false.
* <br/>
* the consturctor should recieve, among others, an Array of String resources - see
* constructor documentation for details.
*
* @author rpiterman
*/
public abstract class ImageListDialog extends UnoDialog2 implements UIConsts
{
private String[] resources;
private final static int RES_TITLE = 0;
private final static int RES_LABEL = 1;
private final static int RES_OK = 2;
private final static int RES_CANCEL = 3;
private final static int RES_HELP = 4;
private final static int RES_DESELECT = 5;
private final static int RES_OTHER = 6;
private final static int RES_COUNTER = 7; //GUI Components as Class members.
private XButton btnOK;
private XButton btnCancel;
private XButton btnHelp;
private XButton btnOther;
private XButton btnDeselect;
private static final String START = "%START";
private static final String END = "%END";
private static final String TOTAL = "%TOTAL";
protected int cutFilename = 0;
protected boolean showDeselectButton = true;
protected boolean showOtherButton = true;
private XFixedText lblTitle;
//Font Descriptors as Class members.
private FontDescriptor fontDescriptor1 = new FontDescriptor();
protected ImageList il; //private FileAccess fileAccess;
private Object result;
private int hid;
/**
*
* @param xmsf
* @param resources_ a string array with the following strings :
* dialog title, label text, ok, cancel, help, deselect, other.
* <br/> if "deselect" and "other" are not displayed,
* the array can also be shorter. but if "other" is displayed
* and "deselect" not, both must be there :-(
*/
public ImageListDialog(
XMultiServiceFactory xmsf, int hid_, String[] resources_)
{
super(xmsf);
hid = hid_;
resources = resources_;
il = new ImageList();
il.counterRenderer = new ARenderer(resources[RES_COUNTER]);
}
/**
* adds the controls to the dialog, depending on
* the size of the image list.
* This method should be called by subclasses after setting
* the il ImageList member properties
*/
protected void build()
{
//set dialog properties...
int ilWidth = (il.getImageSize().Width + il.getGap().Width) * il.getCols() + il.getGap().Width;
int ilHeight = (il.getImageSize().Height + il.getGap().Height) * il.getRows() + il.getGap().Height;
int dialogWidth = 6 + ilWidth + 6 + 50 + 6;
int dialogHeight = 3 + 16 + 3 + (ilHeight + 8 + 14) + 6;
Helper.setUnoPropertyValues(xDialogModel,
new String[]
{
PropertyNames.PROPERTY_CLOSEABLE, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_MOVEABLE, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TITLE, PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
Boolean.TRUE, new Integer(dialogHeight), HelpIds.getHelpIdString(hid), Boolean.TRUE, "imgDialog", 59, 24, INTEGERS[1], resources[RES_TITLE], new Integer(dialogWidth)
});
//Set member- FontDescriptors...
fontDescriptor1.Weight = 150;
final String[] PROPNAMES = new String[]
{
"DefaultButton", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "PushButtonType", PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH
};
Integer iButtonsX = new Integer(6 + ilWidth + 6);
btnOK = insertButton("btnOK", null,
PROPNAMES,
new Object[]
{
Boolean.TRUE, INTEGER_14, HelpIds.getHelpIdString(hid + 3), resources[RES_OK], "btnOK", iButtonsX, 22, new Short((short) com.sun.star.awt.PushButtonType.OK_value), new Short((short) 7), INTEGER_50
});
btnCancel = insertButton("btnCancel", null,
PROPNAMES,
new Object[]
{
Boolean.FALSE, INTEGER_14, HelpIds.getHelpIdString(hid + 4), resources[RES_CANCEL], "btnCancel", iButtonsX, 41, new Short((short) com.sun.star.awt.PushButtonType.CANCEL_value), new Short((short) 8), INTEGER_50
});
btnHelp = insertButton("btnHelp", null,
PROPNAMES,
new Object[]
{
Boolean.FALSE, INTEGER_14, PropertyNames.EMPTY_STRING, resources[RES_HELP], "CommandButton3", iButtonsX, 71, new Short((short) com.sun.star.awt.PushButtonType.HELP_value), new Short((short) 9), INTEGER_50
});
if (showOtherButton)
{
int otherY = 22 + ilHeight - 14 - (showDeselectButton ? 19 : 0);
btnOther = insertButton("btnOther", "other",
PROPNAMES,
new Object[]
{
Boolean.FALSE, INTEGER_14, HelpIds.getHelpIdString(hid + 1), resources[RES_OTHER], "btnOther", iButtonsX, new Integer(otherY), new Short((short) com.sun.star.awt.PushButtonType.STANDARD_value), new Short((short) 5), INTEGER_50
});
}
if (showDeselectButton)
{
int deselectY = 22 + ilHeight - 14;
btnDeselect = insertButton("btnNoImage", "deselect",
PROPNAMES,
new Object[]
{
Boolean.FALSE, INTEGER_14, HelpIds.getHelpIdString(hid + 2), resources[RES_DESELECT], "btnNoImage", iButtonsX, new Integer(deselectY), new Short((short) com.sun.star.awt.PushButtonType.STANDARD_value), new Short((short) 4), INTEGER_50
});
}
il.setStep(new Short((short) 1));
il.setPos(new Size(6, 22));
il.helpURL = hid + 5;
il.tabIndex = 1;
il.create(this);
/*lblContainer = insertLabel("lblContainer",
new String[] {PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH},
new Object[] { 176,"lblContainer",6,17,new Short((short)5),214}
);*/
lblTitle = insertLabel("lblTitle",
new String[]
{
PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
fontDescriptor1, INTEGERS[8], resources[RES_LABEL], "lblTitle", INTEGERS[6], INTEGERS[6], INTEGERS[1], new Short((short) 4), 216
});
}
/**
* is called when the user clicks "none"
*/
public void deselect()
{
il.setSelected(-1);
}
/**
* is called when the user clicks "other"
*
*/
public void other()
{
}
/**
* @return the currently elected object.
*/
public Object getSelected()
{
return il.getSelectedObject();
}
/**
* sets the currently selected object.
* @param obj the object (out of the model) to be selected.
*/
public void setSelected(Object obj)
{
il.setSelected(obj);
il.showSelected();
}
/**
* The counter renderer, which uses a template.
* The template replaces the Strings "%START", "%END" and
* "%TOTAL" with the respective values.
* @author rpiterman
*
*/
public static class ARenderer implements IRenderer
{
String template;
/**
* @param aTempalte a template for this renderer.
* The strings %START, %END ,%TOTAL will be replaced
* with the actual values.
*/
public ARenderer(String aTemplate)
{
template = aTemplate;
}
public String render(Object counter)
{
String s = JavaTools.replaceSubString(template, PropertyNames.EMPTY_STRING + ((Counter) counter).start, START);
s = JavaTools.replaceSubString(s, PropertyNames.EMPTY_STRING + ((Counter) counter).end, END);
s = JavaTools.replaceSubString(s, PropertyNames.EMPTY_STRING + ((Counter) counter).max, TOTAL);
return s;
}
}
}